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