2010-08-24 106 views
7

我有很多webservices在我的项目中运行,但奇怪的事情已经发生了很长一段时间了。我的服务偶尔会无故失败,并显示错误消息“通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态。”这通常发生在我早上运行应用程序的第一件事情之后,它们发生的频率较低。任何有关可能导致此错误的想法?WCF服务出现故障状态

+0

你尝试过WCF跟踪吗? – 2010-08-24 07:41:45

+0

此错误来自使用WCF服务的代码,还是来自服务本身? – 2010-08-24 08:35:08

+0

@拉迪斯拉夫:不,还没有。我不太确定WCF追踪。 Ne好教程让我starteD? @Graham:这基本上来自使用WCF服务的代码 – Farax 2010-08-25 02:43:11

回答

5

这听起来像是一个超时结合不处理失败的服务。

由于代码必须进行JIT编译,可能还需要数据库缓存数据和查询计划,因此需要较长时间才能在早上运行。

这里是让WCF客户端后本身http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/wcf-communicationobjectfaultedexception-quot-cannot-be-used-for-communication-because-it-is-in-the-faulted-state-quot-messagesecurityexception-quot-an-error-occurred-when-verifying-security-for-the-message-quot.aspx

+0

但我没有使用“使用“块。 – Farax 2010-08-25 02:47:47

+0

使用后仍需关闭服务,如果服务处于故障状态,则需要中止服务 – 2010-08-25 07:05:02

+0

事实上,在移除我的USING块后,我可以看到真正的错误。 10x – 2013-06-12 12:07:59

9

清理如果WCF服务抛出一个FaultException的一种方式,客户端将有其状态改为CommunicationState.Faulted。如果您然后尝试使用该客户端对象调用其他服务操作,你会得到错误

“的通信对象, System.ServiceModel.Channels.ServiceChannel, 不能用于通信 因为它处于故障状态。“

你也可以,如果你尝试调用Close()方法的故障客户端上得到这个错误,我不记得了。

您可以通过检查State属性来检查客户端对象的状态。如果您想要正确关闭客户端(您应该这样做),则如果客户端处于Faulted状态,则需要调用Abort()方法;如果客户端处于任何其他状态,则需要调用Close()方法。

+0

这种击败'使用'的目的,不是吗? WCF永远不会让我惊讶它设计得有多糟糕。 – 2015-01-19 12:27:47

相关问题