我们有一些ASP.NET Web服务在这种完美的风暴条件下失败了:
如果它是IIS 6,或者我们关闭动态压缩或同步调用Web服务,它可以正常工作。
在调用SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)时出现“意外的文件结尾”错误。
使用Fiddler,我发现IIS 6的响应具有'chunked'的传输编码,没有内容长度。 IIS 7的响应没有分块并且具有内容长度。文件结束错误超出内容长度1个字符。
如果我拦截Fiddler中的消息并将其更改为chunked,则没有错误。答案可能是在IIS 7中将其更改为chunked(我已经尝试过并且失败了),但我觉得我不应该这样做:我认为它应该可行!
答案 0 :(得分:0)
我不得不为微软打开MSDN支持票,但得到了答案。
这里的答案是一个简单的客户端解决方案。我之前的WebRequest方法看起来像这样:
protected override WebRequest GetWebRequest(Uri uri)
{
var request = base.GetWebRequest(uri);
request.Headers.Add("Accept-Encoding", "gzip");
return request;
}
更好的方法是:
protected override WebRequest GetWebRequest(Uri uri)
{
var request = (HttpWebRequest) base.GetWebRequest(uri);
request.AutomaticDecompression = DecompressionMethods.GZip;
return request;
}
我不完全确定为什么会这样:请求和响应上的标题完全相同,但客户端似乎能够管理它返回的响应。
这似乎适用于IIS6和IIS7,即使IIS6响应被分块而IIS7也没有。如果有人可以帮助解释其确切原因,那么社区可能会有所帮助。