如何获取SoapHttpClientProtocol原始XML响应排查Web服务异常?
一、获取原始SOAP响应XML
要定位XML解析错误(第1行2181004列),必须拿到服务器返回的原始响应内容,有两种可行方式:
1. 修改代理类记录响应
在自动生成的SoapHttpClientProtocol派生类中,重写GetWebResponse方法,读取并保存响应流:
protected override WebResponse GetWebResponse(WebRequest request) { var response = base.GetWebResponse(request); // 读取完整响应内容 using (var streamReader = new StreamReader(response.GetResponseStream())) { string rawXml = streamReader.ReadToEnd(); // 保存到本地文件,路径可自行调整 File.WriteAllText(@"C:\temp\soap_response.xml", rawXml); // 重置流位置,确保后续反序列化能正常执行 response.GetResponseStream().Position = 0; } return response; }
调用Authenticate方法后,打开生成的文件即可查看原始XML,定位报错位置的内容。
2. 使用抓包工具拦截请求
直接用Fiddler或Charles这类HTTP抓包工具,配置好代理后拦截SOAP请求,在工具中直接查看响应的原始XML内容,无需修改代码。
二、解决Int32溢出异常与调试提示问题
1. 处理Int32溢出
内部异常Value is either too large or too small for an Int32.明确指向:服务器返回的某个数值字段超出了C# int类型的范围(-2147483648 至 2147483647),但自动生成的AuthenticationResult类中对应字段被定义为int。
- 步骤1:用上面拿到的原始XML,找到第1行2181004列附近的数值字段,确认其实际大小。
- 步骤2:修改
Reference.cs中AuthenticationResult类的对应字段类型,将int改为long(如果是无符号数值则用ulong),同时确保XML序列化属性匹配(比如XmlElementAttribute的类型参数)。
注意:每次通过Visual Studio重新生成代理类会覆盖修改,建议手动维护代理类,或调整服务端WSDL定义后重新生成。
2. 调试提示问题说明
提示Unable to automatically step into the server. Connecting to the server machine '192.168.42.11' failed.是Visual Studio尝试远程调试服务器端代码失败,这和SOAP服务的业务身份认证无关:服务器syslog记录的是Web服务的业务逻辑认证成功,而远程调试需要服务器开启调试服务、且你拥有服务器系统的登录权限,两者完全独立。无需理会该提示,专注解决XML解析的类型溢出问题即可。
内容的提问来源于stack exchange,提问作者hamidi

