【发布时间】:2012-04-20 17:26:11
【问题描述】:
因为monotouch编译为native code,所以它有一些限制,比如不允许动态调用。
但是我在 .net 中有很多类,我使用 ChannelFactory 动态调用 wcf 服务:new ChannelFactory(myBinding, myEndpoint);现在在 monotouch 中我应该使用 slsvcutil 来生成 wcf 代理类,但是 slsvcutil 生成了很多不必要的额外代码(巨大),并且由于通过 ClientBase 类与 WCF 基础结构的高度耦合,使消费者难以进行单元测试。
除了 ChannelFactory 有没有更好的解决方案?我宁愿手动编写代码,更好地控制服务的调用方式,例如 ChannelFactory。
===========
ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, endpointAddress);
return factory.CreateChannel();
//==> 抛出异常:MonoTouch 不支持动态代理代码生成。重写此方法或其调用者以返回特定的客户端代理实例
【问题讨论】:
-
这也会影响 WCF 服务的 ClientBase
客户端。 “MonoTouch 不支持动态代理代码生成。覆盖此方法或其调用者以返回特定的客户端代理实例”。 尝试覆盖 ChannelBase 如@Tyson 的回答所描述的那样不起作用@ 987654322@ 方法仅适用于某些目标框架,不属于 netstandard2.0。我们剩下一个 Begin/EndInvoke(),它只抛出 Null ref ex。 -
嗨@StingyJack!是的!这就是发生在我身上的事情,我没有可用的调用。那么,我必须做些什么才能将 Xamarin.Forms 中的 iOS 中的 WCF 与 .Net 标准 2.0 连接起来?
-
@Ignacio - 我还不知道。您应该能够在
ChannelBase<T>中使用BeginInvoke()和EndInvoke()的集合并完成与Invoke()相同的操作,但它对我不起作用。我得到空引用异常,我认为是因为运行时无法将 Begin 调用与正确的 End 调用匹配。我尝试了几种不同的方法,但仍然没有乐趣= -
@StingyJack 我可以在一分钟前让它工作!我所做的是在 Visual Studio 15.8.1 版本中使用 svcutil 重新生成连接服务参考文件,使用此命令 svcutil /async /tcv:Version35 https://... 然后在同步方法上使用它:var iar = BeginInvoke("YourMethod", _args, null, null); return (string)EndInvoke("YourMethod", Array.Empty
-
感谢@Ignacio 的提示,我实际上没有任何服务引用或连接的服务(长期以来一直使用 IChannelFactory 来启用类型共享,而不是在每个服务使用者处生成新类型),但是如果这行得通我确信我可以找到我的尝试和生成的代码之间的不同之处。
标签: ios wcf xamarin.forms xamarin.ios .net-standard