首页 新闻 赞助 找找看

WCF client Application error.

0
[已解决问题] 解决于 2016-04-11 08:53

得到下面的消息:

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就出错呢? 求解答。

二十二号同学的主页 二十二号同学 | 小虾三级 | 园豆:790
提问于:2016-03-21 14:27
< >
分享
最佳答案
0

你这个报错和你用什么无关,你信道已经处于出错状态了,你需要abort掉它。

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-03-21 15:52

都会有哪些错误呢?

如果我移除掉 using .. 然后手动的close 如果不能close  我就 abort .  然后我将这些改动,发布后

再到 实际使用环境中 还会出错么?

也就是问问, 这个信道 Channel 是有使用记忆之类的功能么?

需要重启那个服务之类的?

 

二十二号同学 | 园豆:790 (小虾三级) | 2016-03-21 16:40

@二十二号同学: 一旦出现这种问题,proxy对象实例就不要使用了,最好每次都是new出来的。

引发这种问题的原因很多,我没太研究过,比如服务端就抛异常了就可以导致这种问题。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-21 16:57

@Daniel Cai: 是的,现在就是每次New出来的,但是有什么办法可以去掉那些不用的没关闭的,有错误需要关闭的么?是重启一下IIS 对应的 网站就行么? 我使用 IIS 作为寄宿程序的

二十二号同学 | 园豆:790 (小虾三级) | 2016-03-22 08:46

@二十二号同学: 根据标准写法,应该就是try,然后出现异常对client实例进行abort,如果正常处理完成就是close。正常情况下这样就可以了。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-22 09:24

@Daniel Cai: 嗯,整个 的操作不明白的是为什么引用工程的时候就好使,然后引用DLL(Release的DLL)就不好用。 不得其解。然后我使用 try {} finally { try { client.close() }catch{client.abort()}} 就正常的关闭了。 你能就这方面给说说么?

二十二号同学 | 园豆:790 (小虾三级) | 2016-03-24 10:32

@二十二号同学: 不太明白你所谓的引用工程好用,用dll不好用的意思。

后面一个问题:

一般我们针对实现IDisposable接口的对象的使用方式都是using(){}这种,其语法糖展开了就是

IDispose obj=new....;

try{obj.Dosth();}

finally{obj.Dispose();}

但当obj在Dosth时抛出异常(obj为你代理对象的实例),这将导致finally被执行,但finally中的Dispose方法再抛出异常导致连接未完全关闭,致使你信道为faultstate,这个状态不是你客户端的,而是你服务端针对这个连接的。

所以针对这种问题我们就不能在老老实实的用这个语法糖了,只能自己把整个处理逻辑写完整,也就是你下面catch中的处理了,比如说abort等。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-25 09:51

@Daniel Cai: 好吧~ 解释的很清楚了~ 其实原理就是你说的这样,但是 就是 obj.Dosth() 的obj . 我引用了 obj 工程编译出来的DLL。但是这个类库又引用了其他两个类库,但是我编译的时候没提示说有异常,就这样的我出了错误~! 我是这个感觉有点怪~ 我以后注意引用DLL的完整性吧~

谢谢你的耐心解答!

二十二号同学 | 园豆:790 (小虾三级) | 2016-04-11 08:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册