可以配置服务以使用基于http头的不同绑定吗?

时间:2011-08-04 04:35:54

标签: wcf

我目前正在使用进行GZIP压缩的自定义消息编码器。我想将其迁移到逐步解决方案,我使用IIS7的内置(HTTP的“Accept-Encoding:gzip”)压缩:

  1. 更新服务器以支持旧版和HTTP gzip压缩
  2. 逐步更新所有客户端以使用HTTP gzip压缩
  3. 可能会删除旧版支持
  4. 为了保持基础设施配置的最小变化,我想

    • 对旧版和HTTP样式压缩使用相同的URL
    • 服务器端的
    • 能够通过查看Accept-Encoding(或者必要时添加的任何其他自定义标头)来区分旧样式和旧样式 - 旧客户端不发送'Accept-Encoding',而是新客户端将(必须,无论如何)

    这是我打算迁移的其中一项服务配置的片段:

    <service name="SomeService" behaviorConfiguration="Common">
      <endpoint address="" binding="customBinding" contract="ISomeService" bindingConfiguration="GZipBinding">
        <identity>
          <dns value="localhost"/>
    

    理论上,我会看到两种方法来完成这项工作:

    1. 将另一个端点(具有相同的物理地址)添加到配置中,新端点将使用不同的绑定
    2. 在我的自定义消息编码器
    3. 中进行区分

      到目前为止,解决方案 - 如果存在 - 对这两种方式中的任何一种都没有找到。

      1:我认为您不能让IIS根据http标头选择端点,IIS将使用soap标头(我假设)做出决定,客户端使用ClientViaBehavior:http://msdn.microsoft.com/en-us/library/aa395210.aspx < / p>

      2:在MessageEncoder.WriteMessage中,我认为我无法访问请求HTTP标头,但如果有,则可以轻松决定是否要进行gzip。

      任何想法如何解决1.或2.,还是有更好的方法来完成这项工作,使用共享的URL,而不是使用ClientViaBehavior? (如果没有,我猜ClientViaBehavior将是我的后备,至少看起来是可行的)

1 个答案:

答案 0 :(得分:0)

虽然最后我完全不同地解决了这个问题,但是使用自定义SOAP头并修改GzipMessageEncoder来查看该头来决定是否压缩,我找到了答案,但实现起来可能有点麻烦。 / p>

无论如何,让我想出一个可能的解决方案的是理解逻辑地址和物理地址之间的区别,如http://msdn.microsoft.com/en-us/library/aa395210.aspx所述。因此,当您更改地址属性时(顺便说一下,您不需要使用上述链接中说明的'listenUri'参数),在您的代码中,您必须将Endpoint对象的'via'参数设置为物理地址,而端点对象的逻辑地址需要与您在端点标记的'address'属性中指定的地址相匹配。