我喜欢在using块中实例化我的WCF服务客户端,因为它几乎是使用实现的资源的标准方法IDisposable:
using (var client = new SomeWCFServiceClient())
{
//Do something with the client
}
Run Code Online (Sandbox Code Playgroud)
但是,正如本MSDN文章中所述,在using块中包装WCF客户端可能会掩盖导致客户端处于故障状态的任何错误(如超时或通信问题).简而言之,当调用Dispose()时,客户端的Close()方法会触发,但会因为处于故障状态而抛出错误.然后,第二个异常掩盖了原始异常.不好.
MSDN文章中建议的解决方法是完全避免使用using块,而是实例化您的客户端并使用它们,如下所示:
try
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}
Run Code Online (Sandbox Code Playgroud)
与using块相比,我认为这很难看.每次需要客户端时都需要编写很多代码.
幸运的是,我发现了一些其他的解决方法,例如IServiceOriented上的这个.你从:
public delegate void UseServiceDelegate<T>(T proxy);
public static class Service<T>
{
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
public static void Use(UseServiceDelegate<T> codeBlock)
{ …Run Code Online (Sandbox Code Playgroud) 我有一个客户端应用程序,每10秒尝试通过WCF Web服务发送一条消息.这个客户端应用程序将在船上的计算机上,我们知道它将具有不稳定的互联网连接.我希望应用程序尝试通过服务发送数据,如果不能,则排队消息,直到它可以通过服务发送它们.
为了测试这个设置,我启动了客户端应用程序和Web服务(都在我的本地机器上),一切正常.我试图通过杀死Web服务并重新启动它来模拟糟糕的Internet连接.一旦我终止服务,我就开始获得CommunicationObjectFaultedExceptions - 这是预期的.但是在我重新启动服务之后,我继续得到这些例外.
我很确定我对Web服务范例有些不了解,但我不知道那是什么.任何人都可以提供有关此设置是否可行的建议,如果可行,如何解决此问题(即重新建立与Web服务的通信渠道)?
谢谢!
克莱 -
如果我有一个无会话绑定,在任何情况下客户端通道都会出错吗?
在我的具体情况下,我有以下自定义绑定:
<customBinding>
<binding name="MyCustomBinding">
<mtomMessageEncoding/>
<httpTransport/>
</binding>
</customBinding>
Run Code Online (Sandbox Code Playgroud)
在客户端,我使用派生自的默认生成代理ClientBase<T>.
我期待如果服务抛出一个未处理的异常,FaultException那将导致通道出现故障,并使客户端代理也出错.但事实并非如此 - 代理仍处于开放状态,之后可以使用.我也试图违反Binding的一个超时 - 这也没有使通道出错并且客户端代理仍处于打开状态.
是否有任何情况会导致客户端代理出现故障?
有关:
我有一个WorkflowServiceHost我在Windows服务中启动.一切正常,但一段时间后服务停止响应请求.通过跟踪日志,我可以看到抛出异常 - 在这种情况下是通过简单加载元数据页面 - 关于被中止的通信对象:
The communication object, System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel, cannot be used for communication because it has been Aborted.
Run Code Online (Sandbox Code Playgroud)
跟踪文件中没有指示问题的先前日志.我们每分钟监控它以确保它正在运行(因为出现此问题)并且我可以在元数据页面突然开始报告它处于中止状态之前看到许多成功的请求.
此时恢复的唯一方法是重启我的服务.我以前曾多次使用WCF,但从未作为WF的前端.我之前从未遇到过我的WCF服务这个问题,WorkflowServiceHost会发生什么事情?
谢谢!
更新:
以下是WCF的一些跟踪日志:

我使用netNamedPipeBinding创建了一个WCF单例服务.发生通道异常时,会使通道处于故障状态,并且所有后续操作都会引发异常.我怎么能阻止这个?我希望TimeoutException或任何其他常见异常只使一个操作失败,而不是使服务无响应.