今天在除錯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>
<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安全開發的時候是比較常見的。
參考連結:
本文轉自 frankxulei 51CTO部落格,原文連結:http://blog.51cto.com/frankxulei/320448,如需轉載請自行聯絡原作者