我无法使用Silverlight 5请求Gzip压缩内容。为了减少使用的带宽,我想将gzip用于我们的Web服务请求的内容,但不幸的是,这不起作用。
我正在使用客户端堆栈并发送HttpWebRequest。我试图设置Accept-Encoding标头,但它告诉我,我不允许直接更改它 - 并且它没有其他属性!
那么如何发送自定义Accept-Encoding标头?
这是我在App-Constructor中的代码:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
这是我创建请求并设置标题的方式:
var webRequest = (HttpWebRequest)WebRequest.Create(requestUri);
webRequest.Headers["Accept-Encoding"] = "gzip, deflate";
这是一个例外:
{System.ArgumentException: The 'Accept-Encoding' header cannot be modified directly.
Parameter name: name
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at MyClass}
答案 0 :(得分:0)
不幸的答案是:如果你想gzip,请不要使用客户端堆栈(浏览器堆栈已经为你处理了这个)
答案 1 :(得分:0)
在这种情况下,我很幸运能够控制服务端以及客户端。我现在所做的是添加一个额外的自定义标头,它将基本上覆盖Accept-Encoding标头。我称之为“Accept-Encoding-Override”。当我的服务遇到此标头时,无论Accept-Encoding标头中有什么内容,它都会压缩内容。在客户端silverlight端,我检查响应中的Content-Encoding标头,如有必要,使用SharpZipLib解压缩它(DotNetZip不起作用)。
我仍然标记dotMorten,因为他的回答是我问题的实际答案。使用ClientStack时无法设置标题。