手动配置WCF宿主的.config文件遇到的几种错误
生活随笔
收集整理的這篇文章主要介紹了
手动配置WCF宿主的.config文件遇到的几种错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
手動配置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才發現,要注意的東西還挺多。
今天嘗試用控制臺應用程序作為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才發現,要注意的東西還挺多。
總結
以上是生活随笔為你收集整理的手动配置WCF宿主的.config文件遇到的几种错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟标准c++中的Rtti
- 下一篇: 企业即时通讯市场增长500%