我一直在客户端获得WCF服务处于故障状态。 如何在不破坏我的WCF服务的情况下捕获WCFexception?

我有一个WCF服务多个UI消耗。 当用户无法访问数据库时,我从数据库中获得了未经授权的exception。 我没有在服务器端捕获exception并将其发送到客户端。

在客户端(asp.net网页)上,我看到exception – 用户无法访问数据库,登录失败。 这一切都很好。 但是……如果我再次调用WCF服务,我会得到服务处于故障状态的exception。 只有open才能重新启动整个WCF服务。 WCF服务作为Windows服务托管。

捕获exception的最佳方法是什么,在服务器端记录exception,将exception详细信息发送回客户端而不破坏服务? 谢谢

未处理的exception将使通信通道出错。 正如其他人所指出的那样,必须通过调用Abort()来中止故障通道 – 它不能被关闭而且不能再次使用。

要解决问题的其他部分,“捕获exception的最佳方法,在服务器端记录exception,将exception详细信息发送回客户端而不破坏服务?”,您需要使用FaultException类 。

此外,您可以使用IErrorHandler接口连接服务主机以捕获未捕获的任何exception(即,全局error handling程序)。 有很多关于如何在网上执行此操作的示例 – 只需google for WCF IErrorHandler。

这是一对夫妇:

使用IErrorHandler进行WCFexception处理

WCF可扩展性 – IErrorHandler

您可以使用此代码创建一个能够正确处理WCFexception的包装类:

 public class ServiceProxyHelper : IDisposable where TProxy : ClientBase, new() where TChannel : class { /// /// Private instance of the WCF service proxy. /// private TProxy _proxy; /// /// Gets the WCF service proxy wrapped by this instance. /// public TProxy Proxy { get { if (_proxy != null) { return _proxy; } else { throw new ObjectDisposedException("ServiceProxyHelper"); } } } public TChannel Channel { get; private set; } /// /// Constructs an instance. /// public ServiceProxyHelper() { _proxy = new TProxy(); } /// /// Disposes of this instance. /// public void Dispose() { try { if (_proxy != null) { if (_proxy.State != CommunicationState.Faulted) { _proxy.Close(); } else { _proxy.Abort(); } } } catch (CommunicationException) { _proxy.Abort(); } catch (TimeoutException) { _proxy.Abort(); } catch (Exception) { _proxy.Abort(); throw; } finally { _proxy = null; } } } 

然后,您可以调用这样的服务:

 using (ServiceProxyHelper svc = new ServiceProxyHelper()) { svc.Proxy.SendMail(fromAddress, fromName, toEmail, toName, message); } 

请参阅以下链接,其中讨论了WCF客户端应如何捕获故障/exception以及C#中使用’using’语句可能遇到的潜在问题:

http://msdn.microsoft.com/en-us/library/aa355056.aspx

通过Baiscally,您需要在客户端代理上调用Abort()。 这将立即将代理的状态设置为Closed。