Mono 3.0.2 基于双工通信的WCF应用 Demo 的讨论中 深蓝医生 提到了一个问题:
楼主,找了几天,终于明白我的程序错误在哪里了,在服务契约上加入下面的接口方法:
[OperationContract]
double Sub(double x, double y);
这样客户端调用的时候,能够直接得到Sub方法的返回值,但同样功能的服务在mono 上面运行的时候,出现下面的错误:
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at System.ServiceModel.Description.CallbackDebugBehavior.System.ServiceModel.Description.IEndpointBehavior.ApplyClientBehavior (System.ServiceModel.Description.ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) [0x00000] in <filename unknown>:0
at System.ServiceModel.Description.ServiceEndpoint.CreateClientRuntime (System.Object callbackDispatchRuntime) [0x00000] in <filename unknown>:0
---------------
所以,问题出在mono的WCF双工服务中,方法不支持
IsOneWay = false的情况,也就是服务的双向调用。
============
向楼主求解,万分感谢!
这样的方法在Windows 下运行良好,把它放到了Mono环境下不正常了。有时候需要“同步”的回调,这也是合理的需求呀,我把他这个方法进去进行测试:
![af6816e71db8d6fe04cded352b140a1500316d42](https://yqfile.alicdn.com/af6816e71db8d6fe04cded352b140a1500316d42.png?x-oss-process=image/resize,w_1400/format,webp)
WCF的service操作默认实现了对Host service的当前线程的SynchonizationContext实现了关联。与Callback操作的线程关联性通过CallbackBehavior的UseSynchronizationContext 进行控制,我们将CalculateService的UseSynchronizationContext 设为false。
客户端的调用代码:
![fc9ffaa2d3f162cdebd50c200a3ea3092a5f85f7](https://yqfile.alicdn.com/fc9ffaa2d3f162cdebd50c200a3ea3092a5f85f7.png?x-oss-process=image/resize,w_1400/format,webp)
在Windows From的UI线程下使用的时候是需要明确指定UseSynchronizationContext 为false的,在控制台下是不需要的。在Mono的运行环境都需要明确的指定UseSynchronizationContext 为false。这是否可以说明Mono的实现更加统一呢?
本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号