使用http和https绑定/端点部署WCF服务

时间:2011-01-25 19:14:30

标签: wcf iis ssl https wcf-binding

我已经编写了一个WCF Web服务供Silverlight应用程序使用。最初,该服务仅需要基本的http绑定。我们现在需要能够部署服务以在http和https下使用。我找到了web.config的一些设置,允许我这样做:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="SilverlightFaultBehavior">
        <silverlightFaults />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="True" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="SecureHttpBinding">
        <security mode="Transport" />
      </binding>
      <binding name="BasicHttpBinding">
        <security mode="None" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
      <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>
然而,不幸的是,这有一个问题。

此Web服务需要部署到数百个客户的服务器上,并非所有服务器都使用https。将其部署到未在IIS中设置https绑定的服务器会导致其失败。如果在IIS中没有设置https绑定,是否有办法在web.config中默认使用这两种绑定而不会死亡?

我们已经找到了解决此问题的可能方案,但它并不能很好地满足我们的部署要求。

之前有没有其他人遇到这样的事情,你是怎么解决的?

4 个答案:

答案 0 :(得分:10)

最后,我们决定使用configSource属性为web.config的绑定,行为和服务部分使用外部文件,如下所示:

<bindings configSource="bindings.config" />
<behaviors configSource="behaviors.config" />
<services configSource="services.config" />

通过这种方式,我们默认将其部署为仅为http访问设置的外部文件,并向客户提供有关如何编辑外部文件以设置https访问权限的说明(或协助他们)。这也允许我们将未来的更改部署到web.config本身,而不会覆盖外部配置文件。

答案 1 :(得分:9)

如果您不使用安装程序,则此页面上接受的答案没什么用处。 正确答案在于OP自己稍后编辑,所有人需要做的是绑定IIS中的http和https端口,然后使用下面的配置。

            <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
              <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>

这对我来说很好用!

答案 2 :(得分:4)

这将由您用于部署服务的安装程序处理。它应该是部署两个端点或仅部署http端点的先决条件(或至少在安装程序中留下一个选项)。

答案 3 :(得分:1)

您的两个端点具有相同的URI。在WCF中不允许这样做。您应该能够指定具有不同绑定的端点,但URI必须不同(即不同的端口号或不同的合同)。