WCF分布式開發常見錯誤(28):The requested upgrade is not supported by...
今天在調試WCF4.0 Routing 路由服務例子代碼的時候,啟動客戶端測試WCF 路由服務,遇到這個錯誤。
因為網上資料很少,目前搜索不到任何中文資料。英文資料也十分少, google.com搜索的連接也被屏蔽了,不能訪問。所以把這個問題的解決辦法發出 來,共大家參考,希望對後來遇到類似錯誤的人一個參考。
【1】調試環境:
1)操作系統:Windows XP 專業版
2)IDE環境:Visual Studio 2010 Beta2
3)Framework: .NET Framework 4.0
【2】錯誤信息:
Error : The requested upgrade is not supported by 'net.tcp://localhost:9002/WCFServiceB'. This could be due to mismatched bindings (for example security enabled on the client and not on the server).
錯誤:服 'net.tcp://localhost:9002/WCFServiceB'不支持請求升級。這可 能是由於綁定不匹配導致的錯誤(例如客戶端啟用安全,而服務器沒有。)。
【3】錯誤截圖:
運行時客戶端拋出的英文異常信息如下圖所示:
【4】問題分析:
這個錯誤的原因,在異常信息裡有部分提示:可能綁定不匹配導致的錯誤。
1)客戶端和服務端安全模式不同,例如客戶端啟用安全,而服務端沒有啟用 安全;
2)客戶端和服務端編碼模式不同;導致無法匹配錯誤信息。
3)客戶端和服務端SOAP版本不同。也可能導致問題。
4)客戶端和服務端事務設置不同等等。
都可能導致這個錯誤。我們先來檢查服務端和客戶端的配置,發現服務端沒 啟用安全,而路由服務在對於客戶端綁定的配置使用的是默認的設置,也就是啟 用了傳輸安全模式。
【5】解決辦法:
為了解決這個問題,必須保持客戶端配置和服務的一致性。就是在客戶端針 對終結點,添加如下配置:
<system.serviceModel> <services> <client> <endpoint name="EndPointB" bindingConfiguration="netTcpConfig" address="net.tcp://localhost:9002/WCFServiceB" binding="netTcpBinding" contract="*" /> </client> <bindings> <netTcpBinding> <binding name="netTcpConfig"> <security mode="None"> </security> </binding> </netTcpBinding> </bindings> </system.serviceModel> </configuration>
這樣就保證了客戶端和服務端配置的一致性 。重啟程序,這樣就可以調用成功了。
【總結】
因為WCF針對消息屬性的設置,大部分都是通過綁定來控制的。如果客戶端和 服務端綁定不同,或者綁定的設置不同,就可能導致消息的編解碼或者結構不同 ,進而出現無法解析等錯誤,也就是我們通常看到的客戶端無法和服務端通信, 這個在WCF安全開發的時候是比較常見的。
參考鏈接:
1.http://social.microsoft.com/Forums/zh- CN/wcfzhchs/thread/1112d059-1dbb-4f97-9536-14956b68061a
2.http://snahta.blogspot.com/2009/06/wcf-error-requested-upgrade- is-not.html