相关疑难解决方法(0)

WCF GZip压缩请求/响应处理

如何让WCF客户端处理由IIS进行GZip或Defzed的服务器响应?

在IIS上,我按照这里的说明如何使IIS 6 gzip所有响应(其中请求包含"Accept-Encoding:gzip,deflate")由.svc wcf服务发出.

在客户端,我按照这里这里的说明如何将此标头注入Web请求:"Accept-Encoding:gzip,deflate".

Fiddler2显示响应是二进制而不是普通的旧Xml.

客户端崩溃了一个异常,基本上说没有Xml标头,这是真的.

在我的IClientMessageInspector中,应用程序在调用AfterReceiveReply之前崩溃.

进一步说明:

(1)我无法更改WCF服务或客户端,因为它们是由第三方提供的.但是,如果这是正确的方向,我可以通过配置附加行为和/或消息检查器.

(2)我不想压缩/解压缩肥皂体,而是整个消息.

任何想法/解决方案?

*解决了*

无法编写WCF扩展来实现这些目标.相反,我遵循了CodeProject 主张辅助类的文章:

public class CompressibleHttpRequestCreator : IWebRequestCreate
{
    public CompressibleHttpRequestCreator()
    {
    }

    WebRequest IWebRequestCreate.Create(Uri uri)
    {
        HttpWebRequest httpWebRequest = 
            Activator.CreateInstance(typeof(HttpWebRequest),
            BindingFlags.CreateInstance | BindingFlags.Public | 
            BindingFlags.NonPublic | BindingFlags.Instance,
            null, new object[] { uri, null }, null) as HttpWebRequest;

        if (httpWebRequest == null)
        {
            return null;
        }

        httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip | 
            DecompressionMethods.Deflate;

        return httpWebRequest;
    }
} 
Run Code Online (Sandbox Code Playgroud)

此外,还添加了应用程序配置文件:

<configuration>
  <system.net>
    <webRequestModules>
      <remove …
Run Code Online (Sandbox Code Playgroud)

wcf gzip http-headers

24
推荐指数
1
解决办法
2万
查看次数

Azure Service Bus Relay - 启用压缩

我们在使用有速度问题Azure的服务总线中继netTcpRelayBindingbasicHttpRelayBinding.对于小消息大小(10K),中继以低延迟(100ms)运行,但随着消息大小增加(100K),我们经历看似随机的响应时间(600ms-1000ms).我们希望改善较大邮件的延迟成本.

是否正在使用通过服务总线中继支持的消息压缩(gzip,protobuf-net)?有没有人通过中继启用请求/响应压缩成功?通过IIS支持响应压缩微不足道的,但我们希望支持请求压缩以提高延迟成本.由于我们无法用Fiddler来描述中继,我们如何知道消息在通过中继时仍然被压缩?


我们发现一个有趣的观点是,在后续消息中继(2s)之间引入延迟,我们可以获得更好的性能(100K - 200ms).可能是更大的消息被自动限制?知道触发限制条件的消息大小截止值会很高兴.

对于我们的测试 - 我们只是向服务中继发送一个随机消息字符串,并从服务器回送请求字符串.我们尝试了来自多个地理位置的此客户端/服务器(以排除防火墙/ Web过滤器问题)并遇到相同的延迟行为.

服务器端

public class ServiceRelayProfiler : IServiceRelayProfiler
{
    public string HelloProfiler(string name)
    {
        return string.Format("Hello {0}", name);
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端

ChannelFactory<IServiceRelayProfiler> channelFactory = new ChannelFactory<IServiceRelayProfiler>("helloProfilerTcp");
IServiceRelayProfiler channel = channelFactory.CreateChannel();
string message = RandomString(100000); // 100K
for (int i = …
Run Code Online (Sandbox Code Playgroud)

c# wcf wcf-binding azure azureservicebus

16
推荐指数
1
解决办法
1459
查看次数

GZipStream正在切断XML的最后一部分

我创建了一个名为AddGZip的扩展方法,如下所示:

public static void AddGZip(this HttpResponse response)
{
    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
    response.AppendHeader("Content-Encoding", "gzip");
}
Run Code Online (Sandbox Code Playgroud)

这是代码的一个非常简化的版本:

var response = HttpContext.Current.Response;
var request = HttpContext.Current.Request;
var result = File.ReadAllText(path);
if (request.SupportsGZip)
{
  response.AddGZip();
}
response.Write(result);
response.Flush();
Run Code Online (Sandbox Code Playgroud)

当您在支持GZip的Web浏览器中查看响应时,会出现如下错误:

"XML解析错误:未关闭的令牌位置:http://webserver1/1234.xml 第78行,第1列:"

当我查看源代码时,它基本上错过了>XML文件末尾的最后一个.所以1或2个字节.

如果我注释掉AddGZip线,它可以正常工作.但是我真的想支持GZip,因为XML可能非常大.

有人对我有建议吗?我已经尝试检查了很多博客,但似乎没有针对此类错误的解决方案.

戴夫

c# asp.net gzip httpresponse gzipstream

4
推荐指数
1
解决办法
2701
查看次数