在Silverlight中请求GZipped内容

时间:2013-01-22 20:17:09

标签: c# silverlight httpwebrequest

我无法使用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}

2 个答案:

答案 0 :(得分:0)

不幸的答案是:如果你想gzip,请不要使用客户端堆栈(浏览器堆栈已经为你处理了这个)

答案 1 :(得分:0)

在这种情况下,我很幸运能够控制服务端以及客户端。我现在所做的是添加一个额外的自定义标头,它将基本上覆盖Accept-Encoding标头。我称之为“Accept-Encoding-Override”。当我的服务遇到此标头时,无论Accept-Encoding标头中有什么内容,它都会压缩内容。在客户端silverlight端,我检查响应中的Content-Encoding标头,如有必要,使用SharpZipLib解压缩它(DotNetZip不起作用)。

我仍然标记dotMorten,因为他的回答是我问题的实际答案。使用ClientStack时无法设置标题。