WCF GZip 压缩请求/响应处理

2024-03-11

如何让 WCF 客户端处理已被 IIS GZipped 或 Deflated 的服务器响应?

在 IIS 上,我按照说明进行操作here http://weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx关于如何使 IIS 6 gzip 由 .svc wcf 服务发出的所有响应(其中请求包含“Accept-Encoding:gzip,deflate”)。

在客户端,我已按照说明进行操作here https://stackoverflow.com/questions/1365295/wcf-content-length-http-header-on-outbound-message and here http://kennyw.com/indigo/153关于如何将此标头注入到 Web 请求中:“Accept-Encoding: gzip, deflate”。

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

客户端崩溃并出现异常,基本上表明没有 Xml 标头,这当然是正确的。

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

一些进一步的说明:

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

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

有什么想法/解决方案吗?

* 解决了 *

不可能编写 WCF 扩展来实现这些目标。相反,我遵循了这个 CodeProjectarticle http://www.codeproject.com/KB/aspnet/CompressibleHTTP20.aspx?msg=1350040提倡一个辅助类:

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;
    }
} 

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

<configuration>
  <system.net>
    <webRequestModules>
      <remove prefix="http:"/>
      <add prefix="http:" 
            type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" />
    </webRequestModules>
  </system.net>
</configuration>

似乎正在发生的事情是,WCF 最终要求某些工厂或其他位于 system.net 深处的工厂提供 HttpWebRequest 实例,并且我们提供将被要求创建所需实例的帮助程序。

在 WCF 客户端配置文件中,只需要一个简单的 basicHttpBinding,无需任何自定义扩展。

当应用程序运行时,客户端 Http 请求包含标头“Accept-Encoding: gzip, deflate”,服务器返回 gzip 压缩的 Web 响应,客户端在将 http 响应移交给 WCF 之前透明地解压缩该响应。

当我尝试将此技术应用于 Web 服务时,我发现它不起作用。尽管辅助类的执行方式与 WCF 客户端使用时相同,但 http 请求不包含“Accept-Encoding: ...”标头。

为了使其适用于 Web 服务,我必须编辑 Web 代理类,并添加以下方法:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.HttpWebRequest rq = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
    rq.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    return rq;
}

请注意,应用程序配置文件中的 CompressibleHttpRequestCreator 和块是否存在并不重要。对于 Web 服务,只有重写 Web 服务代理中的 GetWebRequest 才有效。


感谢您提供 WCF 提示!我们将在我的商店中为服务启用 IIS 压缩,我希望您的解决方案能够发挥作用。 “为了使这项工作适用于 Web 服务”——您是指老式 SoapHttpProtocol 客户端吗? 因为SoapHttpProtocol类有一个内置的EnableDecompression属性,它将自动处理压缩标头和响应处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF GZip 压缩请求/响应处理 的相关文章

  • 如何测试“If-Modified-Since”HTTP 标头支持

    使用 PHP 如何准确测试远程网站supports If Modified Since HTTP 标头 据我所知 如果您获取的远程文件自标头请求中指定的日期以来已被修改 它应该返回 200 OK 状态 如果尚未修改 则应返回 304 Not
  • WCF 和数据契约上的接口

    使用 svcutil 创建 WCF 代理时 是否还可以包含数据协定继承的接口 例如 public class SomeType ISometype public string Name get set public interface IS
  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • AngularJS 和 Apiary.IO - 无法读取任何响应标头?

    我使用 Apiary io 模拟我的 API 但不知怎的 我无法使用 angularJS 从响应对象中读取任何标头 我确信我至少通过检查 firebug 正确设置了 Content Type application json Angular
  • 从一个客户端使用多个 WCF 服务

    我的网络场有 10 台运行 IIS 的服务器 在每台服务器上我都有相同的网站和相同的 WCF 服务 它公开了一些用于读取 删除缓存 会话 应用程序变量和其他内部数据的功能 在其他一些 Web 服务器上 我有一个 管理 Web 应用程序 它是
  • 自定义行为的配置错误

    我创建了一个与 WCF 服务一起使用的自定义行为 以将所有错误记录到应用程序日志中 我做了一个BehaviorExtensionElement对于行为 public ErrorLoggingBehaviorExtensionElement
  • 没有端点在 net.pipe://localhost/ 上监听

    我有两个 WCF 服务托管在 Windows Server 2003 计算机上的单个 Windows 服务中 如果 Windows 服务需要访问任一 WCF 服务 例如发生定时事件时 它将使用公开的五个命名管道端点之一 不同的服务协定 该服
  • 我可以使用 HTTP 范围标头“有意”加载部分文件吗?

    我正在研究 HTTP 范围标头 specs http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 16 据我了解 我可以设置文件的字节范围ala 0 199 2000 200
  • 如何将“X-Content-Type-Options: nosniff”添加到我的网络服务器的所有响应标头中

    我正在运行一个 apache 网络服务器 我想将 X Content Type Options nosniff 添加到来自我的网络服务器的所有响应标头 我怎样才能做到这一点 是否可以通过更改 apache 配置文件来实现此目的 确保 mod
  • 如何在 HandlerInterceptorAdapter 中添加 HttpServletRequest 标头?

    我正在尝试将授权标头添加到我的请求中 作为我们切换环境时的临时解决方法 我试图在扩展 HandlerInterceptorAdapter 的拦截器中处理它 我使用 MutableHttpServletRequest 类制作here http
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 模拟 WCF 客户端代理的最佳方法

    有没有办法使用 Rhino 模拟框架来模拟 WCF 客户端代理 以便我可以访问 Channel 属性 我正在尝试对 Proxy Close 方法进行单元测试 但由于代理是使用抽象基类构造的ClientBase
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 异步WCF调用来保存线程?

    In 另一个问题 https stackoverflow com q 19731600 279516 建议我发送异步网络请求 而不是在后台线程上发送同步请求 原因是为了不浪费一根线 我试图理解这是怎么回事 这是最初的做法 我可以理解这里怎么
  • .net 中的 deflate、gzip 和 zlib 的一个库

    首先 我们来定义一些容易混淆的术语 deflate compression algorithm zlib header deflate trailer gzip header deflate trailer 我正在寻找一个基本上可以让我执行
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • WCF服务健康状况监控

    我刚刚实现了 WCF 服务 目前正在研究服务监控选项 我们的服务器团队目前仅托管 java 服务 希望我们的实例始终运行 因此它可以在该实例的生命周期内收集数据 他们表示将使用我们的 webmon 操作之一来获取统计信息 但我们正在使用每次
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 如何增加 dot net core 2.1 项目中 WCF 服务的超时值

    我发布此内容是因为我无法在 Stack Overflow 上找到任何位置通过连接服务添加服务引用来解决利用 WCF 的 Net Core 项目的此问题 我的问题是 由于长时间运行的操作请求 我面临客户端超时 那么 由于 Net Core 不

随机推荐

  • GitHub 项目最新版本的下载链接

    我正在尝试向我的网站添加一个项目最新 github 版本的下载链接 例如链接https github com mongodb mongo archive r3 0 0 rc7 zip https github com mongodb mon
  • 无法恢复几何备份 MySQL 5.7 错误

    我一直在从 Mysql 升级网站5 6 to 5 7 当从以下位置恢复备份时mysqldump 在Mysql 5 1 5 6下工作了10年 不变 在MySQL下不再工作5 7 具体来说 第一行几何数据恢复失败 ERROR 1416 2200
  • 特殊字符(夏威夷语“Okina”)导致奇怪的字符串行为

    The 夏威夷语报价 https en wikipedia org wiki CA BBOkina当 T SQL 与字符串函数结合使用时 它会出现一些奇怪的行为 这里发生了什么 我错过了什么吗 其他角色是否也遇到同样的问题 SELECT U
  • 打包时只生成一场战争

    默认情况下 JHipster 在打包阶段生成 2 个 war your project version war 和 your project version war original 第一个是可执行 jar 第二个是可以在 servlet
  • Clojure 中如何泄漏内存?

    为了周四在湾区 Clojure 聚会上的演讲 我正在整理一份 Clojure 中泄漏内存的方法列表 到目前为止我有 抓住无限序列的头部 通过在循环中调用 lambda 创建大量泛型类 这仍然是一个问题 保存对未使用数据的引用 还有什么 通过
  • 显式遵守 Codable 删除了结构上的成员初始化程序生成

    Given struct Foo let bar Bar 我得到了一个方便的初始化程序来使用 let foo Foo bar Bar But if Bar不是它本身Codable 或者由于某些其他原因我需要明确实现Codable on Fo
  • React - 反应脚本 publicPath

    是否有可能覆盖开发环境的反应脚本中的 publicPath 我使用 symfony 并且在 twig 中包含了 React 应用程序 所以我必须更改资产来提供服务http localhost 3000 static js bundle js
  • SetWindowPos() 函数不移动窗口?

    我有一个对话框 我想将其放置在另一个对话框中 并相对于主对话框上的其中一个控件进行定位 void CspAceDlg DrawResultsArea CWnd pTabCtl GetDlgItem IDC BUILDTABS CRect r
  • 由于 GCM SenderId Android 无法生成 APK 版本

    我在我的应用程序中实现了 GCM Google Cloud Messaging Google Play 服务库已自动生成values xml其中我的senderId is
  • 如何在android VideoView中显示Youtube视频? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 android 应用程序
  • 使用 Jquery 更改选择值

    我正在尝试使用 Jquery 更改表单中 选择 输入的值 但是当它更改时 该更改的函数不起作用 HTML
  • servlet 的根 URl

    我想从其中一个 servlet 获取 Web 应用程序的根 url 如果我将应用程序部署在 www mydomain com 中 我想获得像 http www mydomain com http www mydomain com 同样的事情
  • 使用 Neo4j 的 Cypher 返回我的朋友和朋友的朋友

    我有具有双向关系的节点 如下 我正在尝试创建一个查询 我想返回特定节点的所有后续节点及其后续节点的后续节点 3 希望深度 例如假设这些关系 gt 符号跟随 A gt B B gt A B gt C C gt B C gt D D gt C
  • Spring Data Mongo - 如何映射继承的 POJO 实体?

    我对 Spring 还很陌生 但我想在这个项目上尝试一下 我有一个 MongoDB 数据库 其中填充了相当复杂的文档 我想使用 Spring data Mongo 来查询 没有其他 CRUD 操作 数据库 我已经使用 POJO 描述了我的文
  • 如何一次处理 RxJS 流 n 个项目,并在完成一个项目后,再次自动填充回 n 个项目?

    我有一个事件流 我想调用一个函数 为每个事件返回一个承诺 问题是这个函数非常昂贵 所以我想一次最多处理 n 个事件 这个卵石图可能是错误的 但这就是我想要的 x x xxxxxxx x gt Events p p pppp p p p p
  • 从版本控制中检出项目失败

    我正在 Mac 上使用 Android Studio 1 0 2 为 Google Glass 开发应用程序 我一直在尝试从 Google 在 github 上提供的推荐项目之一开始 但我遇到了问题 说明显示要打开 Android Stud
  • 如何知道两个向量之间的角度?

    我正在用 pygame 制作小游戏 并且制作了一把围绕其中心旋转的枪 我的问题是我想让枪自行旋转到敌人的方向 但我无法做到这一点 因为我找不到枪和敌人之间的角度来使枪旋转到敌人的方向 我搜索过 发现我必须使用atan2但我没有找到任何工作代
  • pyinstaller不显示图像和图标

    我阅读了许多关于如何通过修改规范文件来包含图像和图标的教程 尽管我无法成功 我编写了一个程序 我想使用 pyinstaller 使其可执行并在其他计算机上运行它 pyinstaller 不包含主 exe 文件中的图像和图标文件 当我在自己的
  • 默认情况下,核心数据获取 (NSFetchRequest) 是否以任何特定方式排序?

    我有一个基本问题 假设您有一个 NSFetchRequest 想要在 NSManagedObjectContext 上执行 如果获取请求没有显式设置任何排序描述符 那么对象每次都是随机的 还是会按照最初添加到托管对象上下文的顺序将其吐出到数
  • WCF GZip 压缩请求/响应处理

    如何让 WCF 客户端处理已被 IIS GZipped 或 Deflated 的服务器响应 在 IIS 上 我按照说明进行操作here http weblogs asp net owscott archive 2004 01 12 5791