我已经编写了一个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中默认使用这两种绑定而不会死亡?
我们已经找到了解决此问题的可能方案,但它并不能很好地满足我们的部署要求。
之前有没有其他人遇到这样的事情,你是怎么解决的?
答案 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必须不同(即不同的端口号或不同的合同)。