Joa*_*rel 7 .net compression wcf gzip httpwebrequest
我已经设法在ASP.NET上启用入站HTTP压缩(即压缩HTTP 请求,而不仅仅是响应),但我现在正在客户端(C#/ .NET 4.0应用程序)上苦苦挣扎.
我想要:
Content-Encoding: gzip 到WCF通道发出的所有出站HTTP请求.
到目前为止无效的解决方案:
IClientMessageInspector我可以压缩的消息,但由于信封没有压缩它并不占整个HTTP身体.任何想法如何模仿IHttpModule客户端的行为(见初始响应)?
这里描述的消息编码器应该完成这项工作.
我一直在使用从可用上述文章中的链接(在安装驱动\ WF_WCF_Samples\WCF \扩展\ MessageEncoder,具体\压缩从项目中下载的样本测试这个)和提琴手.
请注意,MSDN示例有一个错误,您需要修复该错误才能使其正常工作.在GZipMessageEncoderFactory类,CompressBuffer方法中,以下行
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
Run Code Online (Sandbox Code Playgroud)
应该换成
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
Run Code Online (Sandbox Code Playgroud)
应用上述修复后,将压缩整个邮件正文.
为了检查压缩是否正确,您可以使用Fiddler的AutoDecode选项.但是,如果消息具有Content-Encoding: gzipHTTP标头,则AutoDecode将仅解压缩该消息.
将HTTP标头添加到WCF消息调用并不是一个前沿,因为WCF被设计为与传输无关,并且WCF应用程序不应处理特定于某种传输方法的元素.
但是,为了本申请的目的,我能够使用以下代码来完成:
public string Echo(string input)
{
using (OperationContextScope opScope = new OperationContextScope((IContextChannel)base.Channel))
{
HttpRequestMessageProperty reqProps = new HttpRequestMessageProperty();
reqProps.Headers["Content-Encoding"] = "gzip";
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = reqProps;
return base.Channel.Echo(input);
}
}
Run Code Online (Sandbox Code Playgroud)
Echo是MSDN示例中的客户端方法之一,我在其中访问当前操作上下文以添加HTTP头.
如果您需要其他帮助,请告诉我.
| 归档时间: |
|
| 查看次数: |
4682 次 |
| 最近记录: |