【问题标题】:Supporting custom compression algorithm for IIS served content支持 IIS 服务内容的自定义压缩算法
【发布时间】:2010-11-16 14:40:17
【问题描述】:

我有一堆互联网设备与我在 IIS 7.5 上的 MVC 应用程序进行通信。我目前正在使用内置的动态透明压缩(gzip/deflate)。

我希望能够支持不同的压缩算法,对于我发送/接收的内容,它比 gzip (7zip) 做得更好。

换句话说,在客户端我将添加标题:接受:gzip、deflate、7zip(或类似),服务器将识别这一点,并在发送内容时应用最佳选择。

将这一切联系在一起的最佳方法是什么? (我知道如何实现实际的 7zip 编码/解码方面)

谢谢。

【问题讨论】:

  • 哪些软件客户端连接到您的应用程序(浏览器、自定义客户端...)?在服务器上实现自定义压缩很容易,但这并不意味着您的客户端会知道如何处理结果或如何请求 accept-encoding:your_custom_encoding。
  • 这里不是问题 - 它们是我自己的自定义设备,用我自己的代码连接,没有任何其他连接 - 所以 100% 的灵活性。

标签: asp.net-mvc iis compression


【解决方案1】:

在服务器端,您可以使用HttpModule 压缩您的响应。 HttpModule 类似于 global.asax,因为它公开请求和响应lifecycle events,如 BeginRequest、ReleaseRequestState 和 EndRequest。您可以通过处理适当的事件和更改输出流来更改响应的内容。通常,您通过附加output filter 来更改响应。例如,the blowery HttpCompress 模块(不再更新)在 ReleaseRequestState 或 PreSendRequestHeaders 事件中附加压缩过滤器:

http://code.google.com/p/httpcompress/source/browse/trunk/HttpCompress/HttpModule.cs

除了压缩内容之外,您还需要设置 Content-Encoding 标头。对于更新的(虽然是测试版)示例,请查看 Rich Crane 的 Wicked Compression 模块。 CodeProject 还有一个example 模块。

请记住,如果将 IIS 设置为在服务器级别进行压缩,则压缩 HttpModule 可能无法正常运行。此外,如果您使用 Ajax 或 .axd 处理程序,请为一些极端情况做好准备。这些请求可能无法像您预期的那样工作,或者在没有明确连接它们的情况下可能无法通过您的模块。

在客户端,您需要在每个请求中传递您的自定义 Accept-Encoding 令牌。如果未设置此令牌,请避免在服务器上进行压缩。如果您将来添加客户端,如果所有响应都使用您的自定义压缩进行压缩,则可能不清楚为什么它们会失败。

我不确定您的客户端是如何发出请求的,但大多数 Http 请求/响应管道允许您以与服务器类似的方式接入响应流。在将响应发送到您的渲染器之前,请检查您的自定义 Content-Encoding 令牌。如果存在,请运行您的解压程序。如果不是,则通过原样传递响应。

【讨论】:

  • 谢谢科尔宾。我的目标是找出如何使用内置压缩来玩得很好,但有一段时间看不到这个,所以暂时标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多