得到下面的消息:
The communication object System.serviceModel.ChannelFactory~1,cannot be used for communication because it is in faulted state.
使用客户端代理类。 应用的是哪个代理类的工程。
生成代理类是使用了 using ( using (clientObject = new clientproxy()) { ...}
后来引用的是这个类编译成的DLL(Release模式)
然后就报了上面的错误。怎么回事?使用引用工程时不出错,引用DLL就出错。
网上找到了一个方法。 是移除掉using. 然后根据这个我也看到dudu 在园子里发布了一个随笔。
但是我还是不太明白为什么引用DLL就出错呢? 求解答。
你这个报错和你用什么无关,你信道已经处于出错状态了,你需要abort掉它。
都会有哪些错误呢?
如果我移除掉 using .. 然后手动的close 如果不能close 我就 abort . 然后我将这些改动,发布后
再到 实际使用环境中 还会出错么?
也就是问问, 这个信道 Channel 是有使用记忆之类的功能么?
需要重启那个服务之类的?
@二十二号同学: 一旦出现这种问题,proxy对象实例就不要使用了,最好每次都是new出来的。
引发这种问题的原因很多,我没太研究过,比如服务端就抛异常了就可以导致这种问题。
@Daniel Cai: 是的,现在就是每次New出来的,但是有什么办法可以去掉那些不用的没关闭的,有错误需要关闭的么?是重启一下IIS 对应的 网站就行么? 我使用 IIS 作为寄宿程序的
@二十二号同学: 根据标准写法,应该就是try,然后出现异常对client实例进行abort,如果正常处理完成就是close。正常情况下这样就可以了。
@Daniel Cai: 嗯,整个 的操作不明白的是为什么引用工程的时候就好使,然后引用DLL(Release的DLL)就不好用。 不得其解。然后我使用 try {} finally { try { client.close() }catch{client.abort()}} 就正常的关闭了。 你能就这方面给说说么?
@二十二号同学: 不太明白你所谓的引用工程好用,用dll不好用的意思。
后面一个问题:
一般我们针对实现IDisposable接口的对象的使用方式都是using(){}这种,其语法糖展开了就是
IDispose obj=new....;
try{obj.Dosth();}
finally{obj.Dispose();}
但当obj在Dosth时抛出异常(obj为你代理对象的实例),这将导致finally被执行,但finally中的Dispose方法再抛出异常导致连接未完全关闭,致使你信道为faultstate,这个状态不是你客户端的,而是你服务端针对这个连接的。
所以针对这种问题我们就不能在老老实实的用这个语法糖了,只能自己把整个处理逻辑写完整,也就是你下面catch中的处理了,比如说abort等。
@Daniel Cai: 好吧~ 解释的很清楚了~ 其实原理就是你说的这样,但是 就是 obj.Dosth() 的obj . 我引用了 obj 工程编译出来的DLL。但是这个类库又引用了其他两个类库,但是我编译的时候没提示说有异常,就这样的我出了错误~! 我是这个感觉有点怪~ 我以后注意引用DLL的完整性吧~
谢谢你的耐心解答!