2011-08-11 34 views
3

我一直在學習RX和Silverlight,並發現了一篇博客文章,展示如何使用Rx中的Observable.FromAsyncPattern實現silverlight wcf服務。在博客文章中有Silverlight開發人員的筆記...如何取消隱藏Silverlight WCF BeginXXXX和EndXXXX服務調用

Silverlight的一個重要提示!
Silverlight的Web服務生成的客戶端代碼有點煩人 - 它隱藏了BeginXXXX/EndXXXX調用,推測是 使Intellisense更清潔。然而,他們不走了,你的方式 可以通過鑄造MyCoolServiceClient對象到它的 底層接口讓他們回來爲(即LanguageServiceClient對象有它實現了一個 產生ILanguageServiceClient接口)

See entire blog post here

雖然我可以看到BeginXXX和EndXXX方法對我的服務來說肯定是隱藏的,但我不確定他在說什麼時需要將ServiceClient強制轉換爲接口。

如果我已經生成了Service1Client例如

Service1Client scClient = new Service1Client(); 

我該如何施放它?我試過...

((IService1Client) scClient) 

但無濟於事......任何建議非常感謝。

+0

我給這個問題upvote! –

回答

2

你會發現有一個簡單的名稱爲Service1的接口,Service1Client實現了該接口。是的,我知道這很奇怪,但沒有語法規則規定所有接口類型都以字母「I」開頭。因此,改變你的代碼: -

Service1 scClient = new Service1Client(); 

然後用Service1它具有簡單的開始/結束異步模式的工作原理。請小心,因爲傳遞給Begin的回調不會在UI線程上執行。

+0

我想你的意思是IService1 scClient = new Service1Client();然後使用scClient實例工作。 –

+0

@Jim:不,我的意思是'Service1'。如果在Web項目中創建名爲'Service1'的WCF服務,那麼Microsoft.Silverlight.ServiceReference'會自動在您的Silverlight項目中生成一個名爲'Service1'的接口,該接口以BeginInt方式列出所有標記爲OperationContract的方法/結束對。然後它創建了一大堆其他類,其中一個是實現Service1的'Service1Client'。在這種情況下,沒有字母「I」的接口前綴。 – AnthonyWJones

1

這意味着生成的代碼包含explicitly implement接口的類型。做這件事有很多原因。我不確定這裏的架構考慮是什麼,因爲我從來沒有做過你正在做的事情。

您應該檢查您的Service1Client以查看它是否實現了包含這些Begin/End方法的生成接口。如果是這樣,是您必須將服務客戶端類型轉換爲的接口。如果不是,可能事情自一年前以來已經發生了變化。