手動配置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中的web.config配置檔案Web
- WCF配置檔案
- WCF配置檔案詳解
- 用jquery呼叫wcf下的各種錯誤碼的解釋。jQuery
- 後臺動態配置config檔案
- Spring Boot讀取配置檔案的幾種方式Spring Boot
- 【JavaEE】讀取配置檔案路徑的幾種方式Java
- 兩種讀寫配置檔案的方案(app.config與web.config通用)APPWeb
- 一次搞懂WCF 配置檔案
- 專案整合Swagger遇到的錯誤Swagger
- mongodb和python互動遇到的錯誤MongoDBPython
- python config配置檔案的讀寫Python
- X的配置檔案XF86Config
- 檔案上傳的幾種方式
- MAC將 /etc/sudoers檔案修改錯後的幾種解決方法Mac
- spring-boot-route(二)讀取配置檔案的幾種方式Springboot
- NodeJs 的幾種檔案路徑NodeJS
- 計算檔案Checksum的幾種方法
- JavaScript~檔案下載的幾種方式JavaScript
- php讀取檔案的幾種方式PHP
- Java檔案下載的幾種方式Java
- 開發中遇到的錯誤
- github上傳遇到的錯誤Github
- git config配置檔案詳解Git
- php生成配置檔案config.php 生成陣列配置檔案PHP陣列
- Structs的配置檔案都在一個檔案(struct-config.xml)中嗎?StructXML
- IT專案管理的六種錯誤思維專案管理
- 在.net中讀寫config檔案的各種方法
- python儲存檔案的幾種方法Python
- PG獲取檔案大小的幾種方式
- Java寫入檔案的幾種方法分享Java
- .net內常用的幾種檔案型別型別
- Maven建立專案遇到導包錯誤:Maven
- 安裝.NET Core遇到的錯誤
- JPA 開發中遇到的錯誤
- 【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句API
- 你的專案使用的是哪種配置檔案?
- Laravel Config—— 配置檔案的載入與原始碼解析Laravel原始碼