[英]Async Web Service calls to IIS7 with Dynamic Compression don't work
在这种完美的条件下,我们有一些ASP.NET Web服务失败:
如果是IIS 6,或者我们关闭了动态压缩功能或同步调用了Web服务,则它可以正常工作。
它在对SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)的调用中失败,并出现“意外的文件结尾”错误。
使用Fiddler,我看到来自IIS 6的响应具有“块式”的传输编码,并且没有内容长度。 IIS 7的响应未分块,并且具有内容长度。 文件结束错误发生在内容长度之后的1个字符处。
如果我在Fiddler中拦截消息并将其更改为成块,则不会出现错误。 答案可能是将其更改为IIS 7中的分块(我尝试这样做并失败了),但是我觉得我不应该这样做:我认为它应该可以工作!
我必须为此与Microsoft开一张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都适用。 如果有人可以帮助您确切解释其工作原理,则可能对社区有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.