我有一个托管在 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>