Web services 如何调试损坏的soap请求?

Web services 如何调试损坏的soap请求?,web-services,asmx,soapexception,Web Services,Asmx,Soapexception,最近,我们在.NET(.asmx)Web服务中看到了如下异常: System.Web.Services.Protocols.SoapException: Server was unable to read request. ---> System.InvalidOperationException: There is an error in XML document (868, -3932). ---> System.Xml.XmlException: '.', hexadecima

最近,我们在.NET(.asmx)Web服务中看到了如下异常:

System.Web.Services.Protocols.SoapException: Server was unable to read request. ---> System.InvalidOperationException: There is an error in XML document (868, -3932). ---> System.Xml.XmlException: '.', hexadecimal value 0x00, is an invalid character. Line 868, position -3932.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
   at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, BufferBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
   at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
   at System.Xml.XmlTextReaderImpl.ParseText()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
   at System.Xml.XmlReader.ReadElementString()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read14_SendErrlog()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer12.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
如何调试此异常?此异常是从SOAP筛选器报告给我们的,该筛选器在message.Stage=SoapMessageStage.AfterSerialize中查找异常


有没有办法得到原始的soap请求?如何获取第868行第3932列的无效字符?怎样才能有一个否定的列3932?

您应该能够通过使用另一个SoapExtension来获取原始消息。事实上,同一个扩展可能会被修改,以创建输入的副本,如果没有异常,则将其丢弃。如果发生异常,原始输入将对您可用


您还可以使用诸如Fiddler之类的外部工具来查看发送给您的消息。

您应该能够通过使用另一个SoapExtension来获取原始消息。事实上,同一个扩展可能会被修改,以创建输入的副本,如果没有异常,则将其丢弃。如果发生异常,原始输入将对您可用


您还可以使用诸如Fiddler之类的外部工具来查看发送给您的内容。

仅供参考:SoapException。消息故意保持模糊,以防止暴露太多可能用于利用系统的信息

对于您的特殊情况,我会采纳John的建议,安装Fiddler来监控实际的HTTP流量并查看在线消息

向我跳出来的异常部分是“十六进制值0x00,是一个无效字符”,但正如您所提到的,它指向的行号是bunk,所以它不是具体的


您向服务传递什么类型的参数?您是否正在使用SOAP扩展进行任何类型的自定义编码?是否添加了其他SOAP头?

仅供参考:SoapException。消息故意保持模糊,以防止暴露太多可能用于利用系统的信息

对于您的特殊情况,我会采纳John的建议,安装Fiddler来监控实际的HTTP流量并查看在线消息

向我跳出来的异常部分是“十六进制值0x00,是一个无效字符”,但正如您所提到的,它指向的行号是bunk,所以它不是具体的


您向服务传递什么类型的参数?您是否正在使用SOAP扩展进行任何类型的自定义编码?是否添加了其他SOAP头?

这是Microsoft web服务方法中令人恼火的事情之一——如果请求无法反序列化到web方法签名中的对象中,则服务使用者会收到一条神秘消息。最重要的是,请求永远不会进入您的web服务,因为它不能被反序列化,所以您无法优雅地处理错误

我要做的是创建一个新的SoapExtension来帮助解决这些类型的问题,它只允许您将原始XML输出到一个方便您的目标(由DebugView读取的文件或跟踪,或者您喜欢的任何其他内容)。代码将进入BeforeDeserialize阶段。如果您想调查其中一个问题,可以通过web.config启用SoapExtension。使用web.config添加SoapExtension的缺点是,它将在整个web应用程序中处于活动状态。您可以添加一些额外的自定义配置,允许您的服务只记录特定端点或特定web方法的信息(如果需要)

通常,只要看到传入的XML,就可以看到问题所在。如果没有,那么您可以尝试通过调用XML序列化程序的小程序手动运行捕获的XML,并查看是否可以了解发生了什么。另一个有用的工具是一个测试工具,它允许您输入数据和调用服务(还可以提交您想要的任何XML)


关于你的具体问题,下面是我的看法/猜测。看起来ASCII字符null正在被编码并发送到您的服务,根据XML规范,这是无效的。简单的答案是不发送该字符。但是谁在发送那个角色呢?它是一个.NET客户端吗?你能控制客户吗?如果您需要解决其他人的bug,那么您可能必须用另一个字符(可能是空字符串)替换有问题的字符

这是Microsoft web服务方法中令人恼火的事情之一——如果请求无法反序列化到web方法签名中的对象中,那么服务使用者会收到一条神秘的消息。最重要的是,请求永远不会进入您的web服务,因为它不能被反序列化,所以您无法优雅地处理错误

我要做的是创建一个新的SoapExtension来帮助解决这些类型的问题,它只允许您将原始XML输出到一个方便您的目标(由DebugView读取的文件或跟踪,或者您喜欢的任何其他内容)。代码将进入BeforeDeserialize阶段。如果您想调查其中一个问题,可以通过web.config启用SoapExtension。使用web.config添加SoapExtension的缺点是,它将在整个web应用程序中处于活动状态。您可以添加一些额外的自定义配置,允许您的服务只记录特定端点或特定web方法的信息(如果需要)

通常,只要看到传入的XML,就可以看到问题所在。如果没有,那么您可以尝试通过调用XML序列化程序的小程序手动运行捕获的XML,并查看是否可以了解发生了什么。另一个有用的工具是一个测试工具,它允许您输入数据和调用服务(还可以提交您想要的任何XML)

关于你的具体问题,以下是我的看法/猜测