当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何确保不会出现WCF故障状态异常?》经验,为你挑选了3个好方法。

我得到这个例外:

通信对象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 proxy.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)

Brian.. 65

您应该避免将客户端代理放在using块中.



1> Brian..:

您应该避免将客户端代理放在using块中.


我写了一些包装代码,帮助WCF +使用块问题http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/wcf-communicationobjectfaultedexception-quot-cannot-be-used-for-通信因为-IT-是-内式故障状态-QUOT-messagesecurityexception-QUOT-AN-错误出现-时-验证安全换的消息-quot.aspx
这是WCF团队IMO的非常糟糕的设计.
但它是IDisposable."使用"是最好的做法!

2> goodguys_act..:

更新:

这个链接的答案描述了一种使用C#语法做同样事情的更简洁的方法.


原帖

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

有关更多详细信息,请参阅:预期的例外情况

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

考虑到涉及使用声明的问题很多,(加热?)内部讨论和线程就此问题,我不会浪费时间试图成为代码牛仔并找到一种更清洁的方式.我只是简单地说,并为我的服务器应用程序实现WCF客户端这种冗长(但可信)的方式.



3> 小智..:

如果传输模式为Buffered,则确保MaxReceivedMessageSizeMaxBufferSize的相同.我刚刚解决了这个问题,经过几个小时的努力解决了这个问题,我想如果有人帮助的话,我会把它发布在这里.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有