代码之家  ›  专栏  ›  技术社区  ›  David Hall

从发生HTTP 500错误代码的.Net web服务捕获数据

  •  4
  • David Hall  · 技术社区  · 16 年前

    例如,将方法中的元素指定为int类型,并且入站xml元素包含十进制数。

    WSDL元素定义:

    <s:element minOccurs="1" 
        maxOccurs="1" 
        form="unqualified" name="ItemCount" type="s:int" >  
    

    <ItemCount>1.0</ItemCount>
    

    这会在iis日志中留下500个错误,但没有返回soap错误的信息或导致错误的输入数据。

    目前,我已经诊断出使用wireshark捕获所有内容所提供的数据存在一些问题,但我想知道其他可能不那么麻烦的选项。

    • 配置IIS
    • 配置web服务
    • 更改web服务的代码

    编辑

    这个答案最符合我在tbreffni之后的想法——还有其他几个不错的回答,但是这个答案允许捕获导致反序列化错误的负载,而无需运行fiddler或wireshark之类的东西。

    关于实际运行SOAP扩展的信息有点简单,因此我在下面列出了我认为必要的步骤:

    • 按照 MSDN 文章
    • 将.dll添加到bin目录,以便服务进行跟踪
    • 在要跟踪的服务的web.config中,将以下内容添加到webServices部分,替换SOAPTraceExtension.TraceExtension和SOAPTraceExtension以匹配您的扩展。

      <webServices>
      <soapExtensionTypes>

      </soapExtensionTypes>
      </webServices>

    6 回复  |  直到 6 年前
        1
  •  3
  •   Liam Joshua    12 年前

    我想试试 fiddler here . 它不专门用于web服务,通常也不用于客户端,它可以用作反向 proxy

        2
  •  2
  •   tbreffni    16 年前

    您可以在web服务中实现一个全局异常处理程序,用于记录发生的任何异常的详细信息。这对于您当前的问题非常有用,而且在生产环境中非常有用,因为它可以让您了解有多少异常被抛出以及由什么代码引发。

    要实现.NETWeb服务的异常处理程序,需要创建SOAP扩展。见下文 MSDN Article 举个例子。我已经在多个生产web服务中使用了这种方法,它在确定发生了什么问题以及在哪里发生问题方面是非常宝贵的。

        4
  •  1
  •   Tony Lee    16 年前

    您看过基于IIS请求的跟踪吗?: http://technet.microsoft.com/en-us/library/cc786920.aspx

        5
  •  0
  •   David Hall    16 年前

    经过我自己的思考,目前我能看到的最好的解决方案是组合一个轻量级的FacadeWeb服务,它接受xml blob作为输入。

    然后,我可以让我的facade服务使用客户端提供的输入数据调用真正的服务,然后:

    • 将良好数据的响应传回给客户机

    这只是一个临时措施(我强烈反对web服务不明确它们所接受的XML),但它可能会让我更容易克服在生产过程中诊断错误的困难,比如连接到web服务的客户端不遵守wsdl或无法读取返回的soap错误。

    谢天谢地,在这种情况下,只有一方发布到web服务上——数据包嗅探器方法(fiddler或wireshark)是可行的,但缺少500个错误的日志记录确实让我想到了“还有什么更好的选择?”。

        6
  •  0
  •   jezell    16 年前

    否则,捕获“所有内容”(假设您使用的是ASMX)的最简单方法是启用system.net上的跟踪

    http://blogs.msdn.com/dgorti/archive/2005/09/18/471003.aspx

    如果您使用的是WCF,它具有很好的跟踪支持,您可以使用svctraceviewer查看跟踪日志。但听起来你不是在使用WCF。