[英]Possible to consume a WCF service in Silverlight via a channel factory, using a Portable Class Library?
當前設置 :Silverlight客戶端使用RIA類和生成的服務引用來消耗常規WCF服務。
目標 :用通道工廠和可移植類庫(PCL)替換服務引用和RIA類。 (XY目標:擺脫生成的代碼。)
迄今為止的方法 :
第一部分 - 使用渠道工廠 - 很簡單,並且有很好的文檔記錄。 基本上,WCF服務保持原樣,但需要注意必須在接口上定義ServiceContract
。 然后在客戶端上創建一個ChannelFactory<IMyService>
,提供服務URL,並創建代理魔術(不需要服務引用)。
Silverlight有一個問題,即你必須使用條件編譯來定義異步操作契約。 (當我嘗試將操作合同移交給PCL時,這將非常重要。)因此,服務合同將如下所示:
[ServiceContract]
public interface IMyService
{
#if SILVERLIGHT
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetAString(AsyncCallback callback, object state);
string EndGetAString(IAsyncResult result);
#else
[OperationContract]
string GetAString();
#endif
}
請注意,(顯然)必須從Silverlight編譯中排除同步操作,如上所述。 否則,對ChannelFactory.CreateChannel
的調用會抱怨:
合同“IMyService”包含Silverlight不支持的同步操作。 將操作拆分為“Begin”和“End”部分,並將OperationContractAttribute上的AsyncPattern屬性設置為“true”。 請注意,您不必在服務器上進行相同的更改。
到現在為止還挺好。 下一步是將客戶端和服務器之間共享的代碼從RIA .shared類文件移動到PCL。 對於DataContract
類,這非常有效 - 但是嘗試移動OperationContract
類會出現問題。 Silverlight ChannelFactory方法需要對同步方法定義進行條件編譯,如上所述,(在我的理解中)在PCL中是不可能的。
問題 :
如果沒有放棄渠道工廠方法或維護RIA項目,最簡單的方法(如果有的話)是什么? 例如,有沒有辦法告訴Silverlight簡單地忽略同步操作,而不是拋出錯誤? 或以任何方式以某種方式排除Silverlight目標PCL的同步定義(例如,條件構建可能)?
你看過這篇文章嗎? 本文將向您展示如何在Silverlight中使用純WCF服務,而無需靜態生成服務代理的代碼(又名VS添加服務引用向導)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.