2012-05-18 75 views
0

我想用自簽名SSL設置WCF服務。沒有端點偵聽在https:// wserver:442/service1.svc

我可以瀏覽到HTTPS並顯示元數據,我可以創建服務參考。

但是它引發了異常:在https://wserver:442/service1.svc 沒有端點偵聽,可以接受該消息。

wserver是我的服務器的名稱,但我不使用它的任何地方,所以我不知道它從哪裏得到它?

我的服務器Webhost.config(其中我認爲問題可能出)是:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="Binding1"> 
      <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 

    </bindings> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="AutoSenderWCFService.AutoSenderService"> 
     <endpoint binding="wsHttpBinding" bindingConfiguration="Binding1" 
      contract="AutoSenderWCFService.IService1" /> 
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceCredentials> 

      <userNameAuthentication userNamePasswordValidationMode="Custom" 
       customUserNamePasswordValidatorType="AutoSenderWCFService.MyValidator, AutoSenderWCFService"/> 

      </serviceCredentials> 

      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

或者,也許我做了自我簽名的SSL錯誤?

我的客戶方就是:

private void button1_Click(object sender, EventArgs e) 
    { 

     ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); 
     client.ClientCredentials.UserName.UserName = "test"; 
     client.ClientCredentials.UserName.Password = "testPassword";    
     ServiceReference1.Contact[] test = client.GetDrivers(); 

    } 
} 
+0

您的服務如何託管? 442端口是否正確? - HTTPS的默認值爲443.連接URL來自客戶端代理 - 這是它唯一可能來自的地方,因爲您沒有明確指定要連接的端點。 –

+0

我已經有一臺服務器在443上運行HTTPS,所以我用了442. – michael

+0

好的。爲了解決這個問題,我建議你在客戶端啓用WCF跟蹤並查看輸出。 –

回答

0

有上爲什麼出現這種情況有兩個原因。由於您有一個在443上運行的默認https,因此您的服務使用的是https端口442。

您是否執行過有關在端口442上偵聽https的任何映射?您可以使用netsh命令做到這一點,如下圖所示:

C:\> netsh http add sslcert ipport=0.0.0.0:442 certhash=6797aea29440de9389bc636e15a35b741d8c22a3 appid={2e80948d-9ae6-42c9-ad33-294929333965} 

你的證書哈希必須指紋ID和的appid是WCF項目dll的哈希值的id,你會在你的assembly.cs其他文件創建一個和在構建您的項目之前包含。

接下來你有一個MEX終結定義了可以被刪除,改變你的serviceMetaData元素有httpsGetEnabled ="true"httpGetEnabled="false"

現在確保瀏覽到您的服務頁面,看看是否出現罰款。

調用調用你需要執行下面的步驟,以繞過證書驗證檢查WCF服務之前在客戶端代碼下一頁:

System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => 
                      { 
                       return true; 
                      }; 

使用上面的代碼的原因是因爲您正在使用自簽名證書。如果你有一個由某個可信任機構頒發的證書,那麼你不需要在你的客戶端應用程序中擁有上述代碼。

0

我更改了服務器端Web.Config文件中的WCF服務中的HTTPSEnabled和HTTPEnabled屬性,如上所示。 它工作正常,但沒有發出「沒有端點在......監聽」問題。 由於網站嚴格要求SSL,所以HTTPEnabled屬性應設置爲false。 感謝您在上面發佈解決方案。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留下評論 - 您可以隨時對自己的帖子發表評論,一旦您擁有足夠的聲譽,您就可以對任何帖子發表評論。 – Kmeixner

相關問題