WCF不能用于通信,因为它处于Faulted状态

时间:2012-02-23 08:18:36

标签: c# .net wcf service

当我尝试使用webservice时,我得到以下异常。我的主要问题是这个例外何时发生?在服务器或客户端?错误在哪里?服务器是否针对各种故障抛出此内容?

我自己做了一些似乎有效的改动

它实际上现在有效。我删除了使用并在服务客户端上添加了som cleanup。

if (Service != null && Service.State != CommunicationState.Faulted)
                {
                    success = true;
                    Service.Close();
                }

            }
            catch (Exception ex)
            {
                msg = "Error" + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace;
            }
            finally{
                if (!success)
                {
                    if (Service != null) Service.Abort();
                }
            }

这是例外:

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Server stack trace: 
at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
 at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
at System.ServiceModel.ClientBase`1.Close()
at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
at bNet.Services.Customers.Cres.Helios.ServiceForm.Send(ServiceFormAction task) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Services\Customers\Cres\Helios\ServiceForm.cs:line 99
at bNet.Web.Sites.Public.Customers.Cres.ServiceSkjema.Units.Page.ServiceFormControl.SubmitFormClick(Object sender, EventArgs e) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Web.Sites.Public\Customers\Cres\ServiceSkjema\Units\Page\ServiceFormControl.ascx.cs:line 192
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

3 个答案:

答案 0 :(得分:15)

故障状态表示服务器端出现意外异常。在之前的电话中。

你也应该在客户端得到一个例外,也许你的代码会忽略它?

您可以通过重新打开连接来解决此问题。但似乎你需要更好的错误处理。

答案 1 :(得分:2)

使用OperationContract属性标记零方法也可能导致此错误。在构建新服务并对其进行长期测试时,这是我的问题。

答案 2 :(得分:0)

代替使用using语句,尝试在不使用该语句的情况下运行代码。

来自

using(var client = new WCFClient())
{
    // ... code
}

var client = new WCFClient()

// ... code

这样做后,我们可以看到原始的 WCF由于处于{故障状态”消息而无法用于通讯,该消息是由using()调用本身引起的。 为什么?我们使用WCF客户端的代码传递了无效的凭据,并且服务器响应时出错,并将代理的状态更改为Faulted。 using()as we know在对象上调用Dispose()-在本例中是我们的WCF客户端。

由于WCF客户端发生故障,并且WCF客户端处于故障状态,因此调用Dispose()导致错误 WCF无法用于通信,因为它处于故障状态抛出。

通过将使用WCF客户端的代码包装在try...catch块中,我们能够看到这一点。