我得到了这个例外:
通讯对象, 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)
答案 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 \客户端
考虑到在这个问题上有很多问题involving the using statement,(heated?) Internal discussions和threads,我不会浪费时间试图成为一名代码牛仔并找到一个更清洁的人办法。我只是简单地说,并为我的服务器应用程序实现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>