Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 请求Silverlight中的gzip内容_C#_Silverlight_Httpwebrequest - Fatal编程技术网

C# 请求Silverlight中的gzip内容

C# 请求Silverlight中的gzip内容,c#,silverlight,httpwebrequest,C#,Silverlight,Httpwebrequest,我无法使用Silverlight 5请求Gzip内容。为了减少使用的带宽,我想对从我们的Web服务请求的内容使用gzip,但不幸的是,这不起作用 我正在使用客户端堆栈并发送HttpWebRequest。我试图设置Accept Encoding标头,但它告诉我,不允许我直接更改它-并且没有其他属性 那么,如何发送自定义接受编码头呢 这是我在应用程序构造函数中的代码: WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp)

我无法使用Silverlight 5请求Gzip内容。为了减少使用的带宽,我想对从我们的Web服务请求的内容使用gzip,但不幸的是,这不起作用

我正在使用客户端堆栈并发送HttpWebRequest。我试图设置Accept Encoding标头,但它告诉我,不允许我直接更改它-并且没有其他属性

那么,如何发送自定义接受编码头呢

这是我在应用程序构造函数中的代码:

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}

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

在这种情况下,我很幸运能够控制服务端和客户端。我现在所做的是添加一个额外的自定义头,它将实质上覆盖Accept Encoding头。我称之为“接受编码覆盖”。当我的服务遇到这个头时,它将压缩内容,无论接受编码头中有什么内容。在客户端silverlight端,我检查响应中的内容编码头,如果需要,使用SharpZipLib解压它(DotNetZip不起作用)


我仍然记得马克·多莫顿,因为他的回答实际上就是我问题的答案。使用ClientStack时无法设置标头。

只需注意:我有一个WP7/WP8库,它使这些请求的处理变得更加容易。为Silverlight编译它应该是一件简单的事情,并将标题和内容编码检查更改为您的自定义检查,您应该可以使用最少的额外代码。请看这里:我在研究期间发现了您的图书馆,它可能对其他人有用,但对我没有用处。:)我已经有了一个工作的基础设施,在客户端我所要做的就是额外发送我的自定义头,并在我的解析方法中注入一个GZipStream,但前提是内容编码是gzip。这样,当响应不是预期的gzip时,我的代码仍然可以工作。??如果响应没有被压缩,我的代码就不会解压缩。通过调用RegisterPrefix,您可以在应用程序启动时只编写两行代码,整个应用程序中的所有web请求现在都将尝试获取gzip(如果可能的话)(您也可以使用GZipWebClient按请求执行)