簡體   English   中英

可以使用可移植類庫通過通道工廠在Silverlight中使用WCF服務嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM