2010-12-03 43 views
19

我花了很多時間弄清楚如何配置我的WCF服務,以便它們可以在生產環境中用於https。如何在一個web.config中將http和https的WCF服務配置組合在一起?

基本上,我需要做的是:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

添加bindingNamespace屬性端點,使得它的工作的最後一件事。

但是,此配置不工作在我在常規http下工作的本地開發環境中。所以,我的配置有:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

的這裏的區別是,我已經設置了httpsGetEnabled屬性設置爲false,和我刪除了bindingConfiguration和bindingNamespace。

問題是:如何創建一個處理BOTH的配置塊?

我真的很討厭每次發佈時都要對配置進行大量的特殊修改。是的,我知道我可以有一個後期構建任務,可以自動更改這些值,但如果可能的話,我想合併這些配置。

我想是這樣的:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

我計算過,把兩個端點想給它兩個選項看起來激活服務時。但是,這不起作用。我收到此錯誤:

無法找到與具有綁定BasicHttpBinding的端點匹配scheme https的基地址。註冊的基地址方案是[http]。

從環顧SO和其他互聯網,看起來其他人都有問題殺死這條龍。

+0

你在IIS託管你的WCF服務,還是你自己託管? – 2010-12-03 15:55:16

+0

它們作爲.svc文件託管在ASP.NET Web應用程序中。在dev和prod上使用IIS7。 – sohtimsso1970 2010-12-03 16:25:38

+0

@ sohtimsso1970:你找到了解決辦法嗎? – Learner 2014-03-25 11:18:39

回答

11

那麼,你的組合配置的一個問題是你的兩個端點在同一個地址 - 這是行不通的。

如果您在IIS中託管,那麼您的服務器,虛擬目錄和*。SVC文件需要將決定你的基本地址 - 這將是這樣的:

http://yourservername/VirtualDirectory/YourService.svc 

如果你想有兩個端點,其中至少有一個需要定義一個相對地址:

<services> 
    <service name="MyNamespace.MyService" 
      behaviorConfiguration="MyServiceBehavior"> 
     <endpoint 
      address="basic" 
      binding="basicHttpBinding" 
      contract="MyNamespace.IMyService"/> 
     <endpoint 
      address="secure" 
      binding="basicHttpBinding" bindingConfiguration="HttpsBinding" 
      contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

在這種情況下,你必須對你的HTTP端點:

http://yourservername/VirtualDirectory/YourService.svc/basic 

和你的安全的HTTPS端點上:

https://yourservername/VirtualDirectory/YourService.svc/secure 

此外:您的安全端點使用HttpsBinding配置 - 但你缺乏這樣的綁定配置 - 所有你必須是:

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

您需要添加HttpsBinding配置!

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
2

問題不在於配置文件,而是在於IIS設置。 您需要在IIS中啓用HTTP & HTTPS。 在IIS 7.5中,轉到您的站點,然後單擊編輯站點操作下的綁定。確保已添加http & https。 然後,您需要爲<basicHttpBinding>下的HTTP創建綁定,並將安全模式設置爲無。 將新創建的綁定配置添加到http端點。 你很好走。讓我知道你是否需要進一步的問題。

相關問題