2010-10-06 43 views
10

我正在將HTTP(Dev/UAT)中的現有服務遷移到HTTPS(Production),並且在配置時遇到問題。這裏是我的web.config的system.serviceModel部分:WCF服務通過https返回404,但不是http

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> 
    <services> 
     <service name="MyService"> 
     <endpoint name="MyEndpoint" address="" binding="wsHttpBinding" 
      bindingConfiguration="secureBinding" contract="IMyService" /> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="secureBinding"> 
      <security mode="Transport"></security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
</system.serviceModel> 

我同時使用basicHttpBindingwsHttpBinding試過,相同的結果:

  • 我可以從我的SOAP調用服務使用http://server.domain.com/MyService.svc
  • 我可以用https://server.domain.com/MyService.svc
  • 打從瀏覽器服務客戶,我不能使用https://server.domain.com/MyService.svc從我的SOAP客戶端調用服務 - 呼叫總是呃與404: not found羅斯。

我的HTTPS網站使用的是通過對企業域名的CA頒發的證書認證,我已經驗證了我有一個安裝了CA證書在Trusted Root Certification Authorities我從中作出呼叫系統。

相關客戶端的代碼:

Service service = new Service(); 
service.Url = "http://server.domain.com/MyService.svc"; 
//service.Url = "https://server.domain.com/MyService.svc"; 
service.WebMethodCall(); 

EDIT

下面是WSDL的請求部分:

<wsdl:types/> 
<wsdl:portType name="IMyService"/> 
<wsdl:binding name="BasicHttpBinding_IMyService" type="tns:IMyService"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
</wsdl:binding> 
<wsdl:service name="MyService"> 
    <wsdl:port name="BasicHttpBinding_IMyService" 
     binding="tns:BasicHttpBinding_IMyService"> 
     <soap:address location="http://server.domain.com/MyService.svc"/> 
    </wsdl:port> 
</wsdl:service> 

EDIT

更多信息:

當我改變serviceMetadata元素有httpGetEnabled="false"httpsGetEnabled="true"了.svc頁面顯示我下面的鏈接:

https://boxname.domain.com/MyService.svc?wsdl 

而不是預期的

https://server.domain.com/MyService.svc?wsdl 
+0

如果您在生產服務生成WSDL它包括HTTPS端口? – 2010-10-06 21:29:28

+0

我將在編輯中添加關於WSDL的註釋 – arootbeer 2010-10-06 21:33:15

+0

這是預期的,因爲您的serviceMetadata僅啓用httpGet而不啓用httpsGet。你也不能得到服務引用,因爲你不暴露mex端點。當您通過HTTP訪問WSDL時,重要的是WSDL的內容 - 尤其是描述服務和端口的最後一部分。 – 2010-10-06 21:50:48

回答

11

檢查web.config中的服務元素名稱是否與實現合同的類的完全限定名稱相匹配。

<services> 
    <service name="MyNamespace.MyService"> 
    <endpoint name="MyEndpoint" address="" binding="wsHttpBinding" ... 
+0

原來這是我遇到的問題 - 更新服務名稱值後,https端點開始顯示在我的WSDL中。我必須在IIS中爲該站點設置主機頭以獲取*正確的*端點,但它們確實顯示出來。 – arootbeer 2010-10-07 15:40:06

0

HTTP和HTTPS供應來自不同的虛擬主機。你確定你的服務已經正確安裝嗎?

+0

你是什麼意思?我有一個網站上有兩個綁定:'http:// server.domain.com'和'https:// server.domain.com'。 – arootbeer 2010-10-06 21:32:22

+0

啊,好的。這很奇怪。運行Fiddler或其他東西來捕捉流量會產生什麼有趣的結果嗎? (服務器的訪問日誌顯示什麼?) – Yuliy 2010-10-06 21:37:35

+0

Fiddler顯示請求已經通過,但由於加密,它不能顯示任何有趣的內容。我在哪裏可以看到IIS的流量日誌? – arootbeer 2010-10-06 21:42:35

3

在您的WSDL中,您看到您的服務不會在HTTPS上公開端口,而只會在HTTP上公開端口。此外,您還可以看到您的服務使用BasicHttpBinding(請參閱端口名稱和綁定名稱)。這意味着您的服務配置根本不被使用。檢查服務元素中的名稱與.svc標記中的名稱相同。必須定義包括名稱空間。

+0

如果我在.svc文件中的ServiceHost指令的'Service'屬性中更改了名稱,或者如果我更改web.config中的'service'元素的'name'屬性,我立即得到一個黃色屏幕上顯示指定的服務無法找到。我的端點聲明有什麼問題嗎? – arootbeer 2010-10-07 01:29:22

+0

實際上,更改*端點的任何*部分都會導致中斷。這顯然是解析web.config文件;它真的沒有使用它? – arootbeer 2010-10-07 01:57:27

0

感謝Johann Blais的回答,我發現您需要包含定義服務合約的類的全限定名。

例如,如果你的服務是

namespace MyCompany.WcfService 
{ 

    [ServiceContract(Namespace="http://xsd.mycompany.com/mcy/1_0_0")] 
    public interface IService 
    { 
     [OperationContract(IsOneWay = false)] 
     void DoStuff() 
    } 

    public class Service : IService 
    { 
     void DoStuff() 
     { 
     } 
    } 
} 

在你的web.config相應的服務定義是

<system.serviceModel> 
    <services> 
     <service name="MyCompany.WcfService.IService"> 
      <endpoint address="" binding="basicHttpBinding" contract="MyCompany.WcfService.IService" /> 
     </service> 
    </services> 
    ... 
</system.serviceModel>