首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 跨機器呼叫常見失敗原因與解決方案清單

     編輯:關於.NET

整理 WCF 跨機器部署時常見的「無法連線」、「拒絕存取」、「安全性協商失敗」等問題,提供逐項排查清單與設定範本。

核心原則:雙邊安全模式必須一致

WCF 預設啟用訊息安全性,跨機器若無憑證、無網域環境,最簡單可行的方式是**雙邊關閉安全模式** (僅限可信內網)。

服務端設定關鍵

<system.serviceModel>
  <services>
    <service name="Services.CalculatorService" behaviorConfiguration="metadataBehavior">
      <endpoint address="https://192.168.1.108:9999/calculatorservice"
                binding="wsHttpBinding"
                bindingConfiguration="NoSecurityBinding"
                contract="Contracts.ICalculator" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="https://192.168.1.108:9999/" />
        </baseAddresses>
      </host>
    </service>
  </services>

  <bindings>
    <wsHttpBinding>
      <binding name="NoSecurityBinding">
        <security mode="None" /> <!-- 關鍵:關閉安全性 -->
      </binding>
    </wsHttpBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="metadataBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

客戶端設定關鍵

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_ICalculator">
        <security mode="None"> <!-- 關鍵:關閉安全性 -->
          <transport clientCredentialType="Windows" proxyCredentialType="None" />
          <message clientCredentialType="Windows" negotiateServiceCredential="true" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <client>
    <endpoint address="https://192.168.1.108:9999/calculatorservice"
              binding="wsHttpBinding"
              bindingConfiguration="WSHttpBinding_ICalculator"
              contract="Contracts.ICalculator"
              name="WSHttpBinding_ICalculator" />
  </client>
</system.serviceModel>

三大必要條件檢查清單

#項目檢查方式常見錯誤
1防火牆服務端開放埠口 (例 9999) 入站規則;或暫時關閉防火牆測試只開啟輸出規則、未針對特定埠口
2URL ACL (HTTP 命名空間預約)管理員執行 `netsh http add urlacl url=https://+:9999/ user=Everyone`未預約、帳號權限不足 (需 SYSTEM/Administrators)
3Binding 位址服務端 `baseAddress`/`endpoint address` 使用實際 IP (非 localhost/127.0.0.1)用 `localhost` 導致客戶端解析到自己機器

進階排查步驟

  1. 啟用 WCF 追蹤:在雙邊 `web.config`/`app.config` 加入 `` 區段,產生 `.svclog`,用 **Service Trace Viewer** (SvcTraceViewer.exe) 分析。
  2. 測試基礎連通:瀏覽器開啟 `https://serverIP:port/servicename?wsdl` 或 `.../mex`,確認元資料可獲取。
  3. 簡化 Binding 測試:先用 `basicHttpBinding` + `security mode="None"` 驗證連通,再換回 `wsHttpBinding`/`netTcpBinding`。
  4. 檢查時間同步:若啟用安全模式,雙方系統時間差超過 5 分鐘會導致 Kerberos/訊息安全失敗。

生產環境建議

  • 內網可信環境:`wsHttpBinding` + `security mode="None"` + 防火牆限制來源 IP
  • 需傳輸加密:`security mode="Transport"` + 自簽/CA 憑證 + `TransportCredentialType="Windows"`
  • 需訊息級加密/簽章:`security mode="Message"` + 憑證,效能較差但端對端安全
  • 高效能/低延遲:改用 `netTcpBinding` (需 Windows 認證、穿透防火牆較難)

「跨機器不通」90% 是防火牆、URL ACL、Binding 位址、安全模式不匹配四大項其中之一。依清單逐項排除,通常 10 分鐘內解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved