最近我需要访问使用 SOAP::Lite 创建的 Web 服务。因为没有 WSDL,所以使用起来真的很麻烦,它不会返回合理的数据类型等,所以我开始使用提供的示例代码。
从一开始我就遇到了问题,请求超时。有时经常,有时很少,但从来没有完全没有问题。在使用 Fiddler 嗅探流量并进行搜索后,似乎 SOAP::Lite 存在/存在错误,该错误在处理 UTF-8 编码数据时弄乱了标头 Content-Length。这似乎是合理的,因为我的分析指出超时是由于客户端等待更多数据(Content-Length)而服务器表示已完成(真实数据)引起的。
所以现在我需要一种方法来对抗这个错误的标头字段,并且:
- 提供正确的内容长度或
- 填充有效负载以匹配 Content-Length
问题是,我从来没有机会使用 SoapExtension 或任何其他修改,因为 Invoke() 在解析开始之前最终会抛出 IoException 或 WebException。此外,我认为 WS 不是我的,而且相当不变。
我还尝试覆盖 SoapHttpClientProtocol.GetWebResponse() 来执行异步请求,但这也无济于事,因为在调用 HttpWebRequest.EndGetResponse() 之前我无法获取 ResponseStream 并且总是抛出异常。
有谁知道我该如何解决这个问题?
更新:到目前为止,我也尝试过 WCF,并在 MSDN 上看到了这篇文章——答案不是很令人振奋。基本上,这发生在管道中太深,用户代码无法访问。我现在最好的选择似乎是使用 Fiddler 脚本来更正 Content-Length 标头,这可能不是微不足道的,因为此 WS 仅可通过 HTTPS 使用。
/担