2011-01-25 67 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本身。