关于项目中NServiceBus和MEF注入(WCF服务代理失效)的两个问题

问题之一:

最近一个项目两个NServiceBus终结点,一个运行在客户端,一个运行在服务器端。

客户端的MasterNode设置为服务器端的地址,这样就不需要在客户端安装NServiceBus的软件,而不会报RavenDB连接失败的错误了。

但是启动的时候会报错:“无法创建队列,或者没有对应的权限”。win7下面,管理员权限运行也是一样。暂时的解决方法是手动创建一个事务性的消息队列。


然后我又安装服务器端的终结点,首先安装了NServiceBus的软件(这个软件主要就是安装RavenDB,安装消息队列等。),然后启动服务端的终结点,仍然是同样的错误,由此可知这个错误和是否安装了NServiceBus的软件是没有关系的。


这个问题亟需解决,不可能让用户用我的软件还要去手动创建一个消息队列吧。


解决方法: 

目前我暂时的解决方法就是利用.Net中的MessageQueue这个类的create方法显示创建消息队列,注意第一个参数是消息队列名称,第二个参数设置为true表示创建的消息队列为事务型消息队列。


问题之二:

我在NServiceBus启动的start函数中利用MEF注入了两个类,在定时器中定时调用这两个类的方法,开始一段时间大概几十分钟的样子运行没有问题。

但是时间长了,就会抛出异常:“The communication object. System.ServiceModel.Channels.ServiceChannel.  can not be used for communication beacause it is in the faulted state”,有时候异常是“The socket connection has disconnected...


开始我以为是MEF启动时候注入一次对象,之后定时器中定期使用这两个对象,时间长了这两个对象失效了。。。

后来和别人聊到这个问题,才注意到可能和WCF服务有关,然后才发现我是在注入对象的类的构造函数中创建了WCF服务代理,之后每次在定时器的这两个对象的调用的方法中调用了WCF服务,时间长了WCF服务就失效了。。。


解决方法:

(1)每次调用定时器都重新Compose一次,即重新进行一次MEF对象注入;每次都注入,都意味着每次都会创建新的WCF服务代理,所以效率较低。

(2)还是只在start的时候注入一次,我想MEF注入的对象是不会失效的,因为不是远端代理对象嘛!!! 然后每次调用注入对象的方法中,首先判断WCF服务时候失效,如果失效了就显式重新创建WCF服务代理。

如果判断WCf服务是否失效呢?

很简单,在WCF服务中预留一个空方法,每次调用真正的方法之前调用一次这个方法,捕获异常,如果出现异常,则说明失效了。


======================= 还可以通过配置来延长服务访问代理的失效时间,参考:

1、http://blog.csdn.net/sweetwxh/article/details/6738650

2、https://social.msdn.microsoft.com/forums/windowsapps/zh-cn/f9c69b9d-e32e-4d86-a646-bd8cddf03746/wcfsystemservicemodelcommunicationobjectfaultedexception


你可能感兴趣的:(关于项目中NServiceBus和MEF注入(WCF服务代理失效)的两个问题)