2011-01-25 92 views
23

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

<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

什么是*** silverlightFaults ***? – Kiquenet 2016-04-29 11:01:36

回答

5

如果您不使用安装程序,本页面接受的答案就没有多大用处。 正确的答案在于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> 

这对我来说工作得很好!

1

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

+1

这就是我认为的,直到我这样配置它只是为了看看它是否会起作用,无论出于何种原因,可能是因为IIS中的https绑定已设置为端口443.唯一不行的是,工作正试图让它在没有设置https绑定的机器上运行。 – Zannjaminderson 2011-01-25 19:32:34

+1

由于合同过滤以及端点地址和listenURI之间的区别,您实际上可以在多个端点上拥有相同的地址。有关详细信息,请参阅[单个ListenUri上的多个端点](http://msdn.microsoft.com/zh-cn/library/aa395210.aspx)。 – BitMask777 2013-05-15 19:16:44

+0

我在IIS中有这个_bindings_(`(type:hostname:port)`):*** http:none hostaname:49759 ***,*** https:pre.company.es:443 *** and ** * http:pre.company.es:80 ***和我的** URI ** _。 *** baseaddress ***:_http:// preserver:49759/vdir1/SilverlightServices/serv.svc_和_https://pre.company.es/vdir1/SilverlightServices/serv.svc_这将是**地址* *? – Kiquenet 2016-04-29 10:47:32

4

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

10

最后,我们决定使用configSource属性的web.config中的绑定,行为和服务部分与外部文件中去,像这样:

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

这样,我们部署默认情况下只为那些为http访问设置的外部文件,并向客户提供说明(或协助他们)如何编辑外部文件以设置https访问。这也使我们能够在不覆盖外部配置文件的情况下将未来的更改部署到web.config本身。