4

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

诸如在方法中将元素指定为 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 以匹配您的扩展。

    <webServices>
      <soapExtensionTypes>
        <add type="SOAPTraceExtension.TraceExtension, SOAPTraceExtension" priority="1" group="0"/>
      </soapExtensionTypes>
    </webServices>

4

6 回答 6

3

我会尝试fiddlerhere。并非专门用于 Web 服务,通常用于客户端,它可以用作反向代理

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

于 2008-10-16T21:54:10.200 回答
2

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

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

于 2008-10-20T23:45:19.787 回答
1

我自己从未使用过这个,但我只是在 MSDN 中找到了这个:在 ASP.NET Web 服务中启用跟踪

于 2008-10-16T22:34:50.150 回答
1

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

于 2008-10-21T00:00:30.910 回答
0

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

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

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

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

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

于 2008-10-16T22:14:08.380 回答
0

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

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

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

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

于 2008-10-20T23:57:06.987 回答