手動配置WCF宿主的.config檔案遇到的幾種錯誤

一劍平江湖發表於2013-08-23
手動配置WCF宿主的.config檔案遇到的幾種錯誤  
今天嘗試用控制檯應用程式作為WCF宿主,遇到幾個問題,這幾個問題雖然都不難,但尋找解決方案相當費時費力,做記錄。 
 
WCF標準的配置檔案為:
 
<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
                <!-- Service Endpoints -->
        <!-- This endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc-->
                <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">
                    <!-- 
              部署時,應刪除或替換下列標識元素,以反映
              在其下執行部署服務的標識。刪除之後,WCF 將
              自動推導相應標識。
          -->
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
        <!-- This mex endpoint is exposed at the base address provided by the host : http://localhost:1808/Service.svc/mex-->
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="CalculatorServiceBehavior">
                    <!-- 為避免洩漏後設資料資訊,請在部署前將以下值設定為 false 並刪除上面的後設資料終結點-->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- 要接收故障異常詳細資訊以進行除錯,請將以下值設定為 true。在部署前設定為 false 以避免洩漏異常資訊-->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
 
 
 
遇到問題:
 
1.“服務XXXXX有零個應用程式(非基礎結構)終結點”。
 
  這是因為<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">的name屬性沒有對應到正確的名稱。 
 
在上面的例子中使用的是Microsoft.ServiceModel.Samples名稱空間下的CalculatorService類,如果名稱空間命或類名寫錯,或者寫的不完全(比如只寫了名稱空間名字或者類名),則會出現上述錯誤。
 
2.WCF服務釋出以後,Client 端無法引用WCF服務,檢視錯誤為“application soap+xml charset utf-8 客戶端和服務繫結可能不匹配”。或者使用IE訪問WCF服務地址的時候顯示“當前已禁用此服務後設資料的釋出”。
 
  按著《ASP.NET 3.5高階程式設計(第4版)》中的WCF案例一步步進行,書上說為了使初學者更好的關注WCF細節,先不使用WCF模版,但是進行到最後報出上述錯誤。書上寫的配置是不包含<behaviors>節點的,這時Client 端無法正常連線服務,於是在網上各種找解決方法,在http://www.cnblogs.com/lanpei/archive/2009/10/29/1592218.html上找到累死問題解決方法,於是加上<behaviors>節點,此時仍然會報相同錯誤。因為書上的例子中沒有<behaviors>節點,所以<service>節點中也不包含behaviorConfiguration屬性,設定好behaviorConfiguration="CalculatorServiceBehavior",徹底沒問題了。
 
 3.使用NetTcpBinding繫結WCF服務,Client端引無法引用WCF服務,檢視錯誤為“後設資料包含無法解析的引用”。
 
  剛開始加了各種節點都不好使,後來查MSDN,下載了一個NetTcpBinding的案例仔細對比才發現是<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>中的contract="IMetadataExchange"寫錯了,本以為這個屬性應該與<endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator">中的contract相同,後來發現理解錯誤,在使用http繫結的時候寫錯好像無所謂,但是使用NetTcpBinding的時候,必須是IMetadataExchange,暫時還不太理解為什麼。
 
 4.使用NetTcpBinding繫結WCF服務,本機Client 端可以正常訪問,但跨機器訪問時提示錯誤“net.tcp://XXXXXX不支援請求的升級。這可能是由於不匹配的繫結”。
 
  這個問題很困擾,Google上查“不支援請求的升級”居然沒有任何相關線索,後來忘了怎麼找到解決辦法的。該問題是因為服務端和客戶端的安全設定不一致,也就是<security mode=""/>節點中的mode值不一致,設定成一致的(比如None,Transport)就沒問題了。
 
 
 
個人覺得,的確像書上說的那樣,不使用模板會關注WCF的一些細節,可以更好的理解WCF,之前直接用WCF模板做成類似WebService的服務,然後部署到IIS上,覺得很簡單,根本沒想過改變宿主或者安全性之類的問題。最近重新學習WCF才發現,要注意的東西還挺多。

相關文章