我得到这个例外:
通信对象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
块中.
您应该避免将客户端代理放在using
块中.
更新:
这个链接的答案描述了一种使用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客户端这种冗长(但可信)的方式.
如果传输模式为Buffered,则确保MaxReceivedMessageSize和MaxBufferSize的值相同.我刚刚解决了这个问题,经过几个小时的努力解决了这个问题,我想如果有人帮助的话,我会把它发布在这里.