如何确保不会出现WCF故障状态异常?

时间:2009-02-10 01:04:26

标签: wcf exception wcf-client

我得到了这个例外:

  

通讯对象,   System.ServiceModel.Channels.ServiceChannel,   不能用于沟通   因为它处于Faulted状态。

WCF服务使用默认的wsHttpBinding。无论我在哪里使用它,我都会以下列方式使用WCF:

using (var proxy = new CAGDashboardServiceClient())
{
    proxy.Open();
    var result = proxy.GetSiteForRegion(ddlRegions.SelectedValue);
    ddlSites.DataSource = result;
    ddlSites.DataBind();
    proxy.Close();
}

消息中显示的错误行似乎是在last.close之后。不确定发生了什么。我正在视觉工作室08内启动这项服务。

以下是跟踪信息:

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 CAGDashboard.UserControls.ucVolunteerCRUDGrid.ddlRegions_SelectedIndexChanged(Object sender, EventArgs e) in C:\Documents and Settings\rballalx\My Documents\Visual Studio 2008\Projects\DashboardCAG\CAGDashboard\UserControls\ucVolunteerCRUDGrid.ascx.cs:line 81
  at System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
  at System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
  at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
  at System.Web.UI.Page.RaiseChangedEvents()
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

5 个答案:

答案 0 :(得分:65)

答案 1 :(得分:20)


<强>更新

linked answer describes a cleaner, simpler way of doing the same thing with C# syntax.


原帖

这是Microsoft推荐的处理WCF客户端调用的方法:

有关详细信息,请参阅:Expected Exceptions

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

其他信息

许多人似乎在WCF上问这个问题,微软甚至创建了一个专门的示例来演示如何处理异常:

C:\ WF_WCF_Samples \ WCF \基本\客户\ ExpectedExceptions \ CS \客户端

下载示例: C#VB

考虑到在这个问题上有很多问题involving the using statement(heated?) Internal discussionsthreads,我不会浪费时间试图成为一名代码牛仔并找到一个更清洁的人办法。我只是简单地说,并为我的服务器应用程序实现WCF客户端这种冗长(但可信)的方式。

答案 2 :(得分:5)

如果传输模式为缓冲,请确保 MaxReceivedMessageSize MaxBufferSize 的值相同。在解决了几个小时之后,我刚刚以这种方式解决了故障状态问题,并认为如果有人帮助我会在这里发布。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

与Ryan Rodemoyer的回答类似,我发现当合同上的UriTemplate无效时,您可能会收到此错误。在我的情况下,我使用相同的参数两次。例如:

    <xp:dominoDocument
        var="Location"
        formName="Location"
        action="editDocument"
        documentId="#{javascript:param.location}">
    </xp:dominoDocument>