C# 是否可以使用可移植类库,通过通道工厂在Silverlight中使用WCF服务?

C# 是否可以使用可移植类库,通过通道工厂在Silverlight中使用WCF服务?,c#,wcf,silverlight,portable-class-library,channelfactory,C#,Wcf,Silverlight,Portable Class Library,Channelfactory,当前设置:Silverlight客户端使用RIA类和生成的服务引用使用常规WCF服务 目标:将服务引用和RIA类替换为和。(XY目标:摆脱生成的代码。) 到目前为止的方法: 第一部分——使用渠道工厂——非常简单,并且有很好的文档记录。基本上,WCF服务保持原样,但需要注意的是,ServiceContract必须在接口上定义。然后在客户端上创建一个ChannelFactory,提供服务URL,然后像魔术一样创建代理(不需要服务引用) Silverlight有一个缺点,即必须使用条件编译来定义异步操

当前设置:Silverlight客户端使用RIA类和生成的服务引用使用常规WCF服务

目标:将服务引用和RIA类替换为和。(XY目标:摆脱生成的代码。)

到目前为止的方法

第一部分——使用渠道工厂——非常简单,并且有很好的文档记录。基本上,WCF服务保持原样,但需要注意的是,
ServiceContract
必须在接口上定义。然后在客户端上创建一个
ChannelFactory
,提供服务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不支持这些操作。将操作拆分为“开始”和“结束”部分,并将OperationContractAttribute上的AsyncPattern属性设置为“true”。请注意,您不必在服务器上进行相同的更改

到目前为止还不错。下一步是将客户端和服务器之间共享的代码从RIA.shared类文件移动到PCL。对于
DataContract
类,这非常有效——但是尝试移动
OperationContract
类会出现问题。Silverlight ChannelFactory方法需要同步方法定义的条件编译,如上所述,这(据我所知)在PCL中是不可能的

问题

除了放弃渠道工厂方法或维护RIA项目外,最直接的方法(如果有的话)是什么?例如,有没有办法告诉Silverlight忽略同步操作,而不是抛出错误?或者以某种方式排除Silverlight目标PCL的同步定义(例如,可能是条件构建)