【问题标题】:Capturing data from a .Net web-service that fails with an HTTP 500 error code从失败并显示 HTTP 500 错误代码的 .Net Web 服务捕获数据
【发布时间】:2008-10-16 21:18:18
【问题描述】:

我有一个托管在 IIS 6.0 中的 .net Web 服务,由于客户端使用与 wsdl 不匹配的数据连接到它,它会定期失败并显示 http 500。

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

WSDL 元素定义:

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

提供的元素:

<ItemCount>1.0</ItemCount>

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

目前,我已经诊断出使用wireshark捕获所有数据所提供的数据的几个问题,但我想知道其他可能不那么侵入性的选项。

是否有任何方法可以捕获正在发送的导致 500 错误的数据(希望仅在 500 发生时捕获数据)?可能来自:

  • 配置 IIS
  • 配置网络服务
  • 更改网络服务的代码

编辑在测试 tbreffni 提供的答案后

最适合我在 tbreffni 之后的答案 - 还有其他几个很好的响应,但答案允许捕获导致反序列化错误的有效负载,而无需运行 fiddler 或 wireshark 之类的东西。

关于实际运行 SOAP 扩展的信息有点简单,所以我在下面包含了我认为必要的步骤:

  • 根据MSDN 文章将 SOAP 扩展构建为 .dll
  • 将 .dll 添加到 bin 目录以供服务跟踪
  • 在要跟踪的服务的 web.config 中,将以下内容添加到 webServices 部分,替换 SOAPTraceExtension.TraceExtension 和 SOAPTraceExtension 以匹配您的扩展。





【问题讨论】:

标签: .net web-services iis monitoring trace


【解决方案1】:

我会尝试fiddlerhere。不是专门用于 Web 服务,通常用于客户端,它可以用作反向 proxy

它非常具有脚本能力和“请求/响应”意识,因此我认为您可能只能捕获 500 个错误。

【讨论】:

  • 谢谢 - 我一直在使用wireshark(在很多方面,比如类固醇上的提琴手),但希望有一些不那么侵入性的东西 - 格式错误的 xml 正在发送到生产机器。跨度>
【解决方案2】:

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

要为 .Net Web 服务实现异常处理程序,您需要创建一个 SOAP 扩展。有关示例,请参阅以下MSDN Article。我已经在多个生产 Web 服务中使用了这种方法,它对于确定发生了什么问题以及发生在哪里非常宝贵。

【讨论】:

    【解决方案3】:

    我自己没用过这个,只是在 MSDN 上找到的:Enabling Tracing in ASP.NET Web Services

    【讨论】:

    • 有用! - 它提供了很好的信息,包括肥皂错误有趣的是,它记录了意外标签的警告,并说明了坏元素是什么,但没有提供导致有效标签异常的数据的详细信息 支持而不标记为答案 - 它似乎没有跟踪输入。我会继续寻找!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      经过我自己的一些思考,我能看到的当前最佳解决方案是将接受 xml blob 作为输入的轻量级外观 Web 服务组合在一起。

      然后我可以让我的外观服务使用客户端提供的输入数据调用实际服务,然后:

      • 处理任何错误,记录源数据和返回的soap错误
      • 将来自良好数据的响应传回给客户端

      这只是一个临时措施(我强烈反对没有明确说明他们接受的 XML 的 Web 服务)但它可能会给我更多的筹码来克服在生产中诊断此类错误的困难连接到 Web 服务的客户端不遵守 wsdl 或无法读取返回的肥皂错误。

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

      【讨论】:

      • 你看过 IIS 基于请求的跟踪吗?:technet.microsoft.com/en-us/library/cc786920.aspx
      • 请把它作为答案发布,我想投票,我以前从未听说过。不知道它是否会解决我的特定问题,但即使它没有,也很高兴知道。
      【解决方案6】:

      如果您想使用工具,请使用 WireShark。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-11
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2018-02-13
        • 2017-09-03
        相关资源
        最近更新 更多