当前设置:Silverlight客户端使用RIA类和生成的服务引用来使用常规WCF服务。
目标:将服务引用和RIA类替换为channel factories和Portable Class Library (PCL)。 (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
的调用会抱怨:
合同&#39; IMyService&#39;包含Silverlight不支持的同步操作。将操作拆分为&#34;开始&#34;和&#34;结束&#34; part并将OperationContractAttribute上的AsyncPattern属性设置为&#39; true&#39;。请注意,您不必在服务器上进行相同的更改。
到目前为止一切顺利。下一步是将客户端和服务器之间共享的代码从RIA .shared类文件移动到PCL。对于DataContract
类,这非常有效 - 但尝试移动OperationContract
类会出现问题。 Silverlight ChannelFactory方法需要对同步方法定义进行条件编译,如上所述(在我的理解中)在PCL中是不可能的。
问题:
如果没有放弃渠道工厂方法或维护RIA项目,最简单的方法(如果有的话)是什么?例如,有没有办法告诉Silverlight简单地忽略同步操作,而不是抛出错误?或以任何方式以某种方式排除Silverlight目标PCL的同步定义(例如,条件构建可能)?