2011-12-29 13 views
1

在爲通過HTTP公開的簡單WCF服務實現MonoTouch客戶端時,我得到以下InvalidOperationException正在努力重寫System.ServiceModel.ClientBase <T> .CreateChannel()

MonoTouch不支持動態代理代碼生成。重寫此方法或其調用方以返回特定的客戶端代理實例。

來自this file中的第141行。

所以我需要覆蓋我自己的ClientBase的子類System.ServiceModel.ClientBase<T>CreateChannel()方法與不使用動態代碼生成的實現。該方法返回一個T的實例。

如果我返回服務客戶端的新實例,System.ServiceModel.ClientBase<T>會在InnerChannel的獲取方上拋出異常Unable to cast object of type 'MyServiceClient' to type 'System.ServiceModel.IClientChannel'

我不清楚如何從這一點着手 - 任何指針讚賞。

回答

0

這是一個非常簡單的界面 - 所以我只寫了一個基於System.Net.WebClient的簡單客戶端,它完美運行並且大概有10行代碼。

+0

我有同樣的問題,你能提供示例代碼來解決這個問題嗎?謝謝。 – Neal 2012-03-17 17:00:08

+0

只需爲該服務構建一個非常簡單的桌面客戶端,就可以啓動Wireshark以查看線路上發生的情況,然後使用使用WebClient的簡單代碼複製它(http://msdn.microsoft.com/zh-cn/library/system .net.webclient(v = vs.100).aspx)。然後將這些代碼隱藏在MonoTouch解決方案的某個位置,當您最終在MonoTouch上正常工作時,請使用正確的代碼替換基於WebClient的實現。 – tomfanning 2012-03-18 21:56:21

0

從源代碼看來,框架無法通過反射創建頻道的新實例,因此它需要您自己重寫該方法。

很多WCF基礎設施都不明顯,主要是因爲它不尋常地使用了泛型(這隻有在你穿過管道後纔有意義)。在這種情況下,由CreateChannel()返回的頻道必須IClientChannel(因爲您處於對話的客戶端)。確保您的頻道上存在此界面,並且您的錯誤應該消失(可能由另一個問題替代)。

+0

如果您需要更多幫助,請發送您的覆蓋'CreateChannel()' – 2011-12-29 12:48:17

+0

實現IClientChannel看起來像一場噩夢。我已經轉向創建一個2.0樣式的Web引用,讓我們看看我們從哪裏去。 – tomfanning 2011-12-29 13:09:29

+0

您通常不會創建自己的頻道(除非您正在執行WCF不支持的特定內容)。您只應構建WCF庫已提供的頻道 - 選擇頻道的類型和配置是最難的部分。 – 2011-12-29 14:40:12