【问题标题】:How to handle exceptions in wcf service call back如何处理 wcf 服务回调中的异常
【发布时间】:2012-02-18 20:43:33
【问题描述】:

我正在尝试使用 AppDomain.CurrentDomain.UnhandledException 记录我的异常。

AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;
public static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
        HandleException(e.ExceptionObject as Exception);
}

当我在服务器中遇到异常时,我会在调试时在客户端中遇到错误,但永远不会触发与 AppDomain.CurrentDomain.UnhandledException 挂钩的事件。

服务器:

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class Service : IService
{        

    public string GetError()
    {
       throw new ApplicationException();
    }
}

客户:

public void GetError()
{
   this.service.BeginGetError(OnGetErrorCompleted, null);
}

public void OnGetErrorCompleted(IAsyncResult result)
{ 
    var value = this.service.EndGetError(result);
}

这不起作用,除非我使用 Distpacher.BeginInvoke..

public void OnGetErrorCompleted(IAsyncResult result)
{
    this.Dispatcher.BeginInvoke((Action)(() =>
    {
        var value = this.service.EndGetError(result);
    }));           
}

有人知道为什么吗? 我认为 AppDomain.CurrentDomain.UnhandledException 会在任何线程出现异常的情况下被触发! :S

【问题讨论】:

    标签: c# .net web-services exception


    【解决方案1】:

    更好的解决方案是使用IErrorHandler 之类的东西并抛出FaultExceptions。使用FaultContract 属性装饰您的操作以引发FaultExceptions。现在您可以在客户端捕获特定的 FaultExceptions。您不应将服务器上的异常暴露给客户端。

    【讨论】:

    • 我已经使用 [ServiceBehavior(IncludeExceptionDetailInFaults=true)] 将服务器中的异常转换为故障。我还尝试使用 Entreprise 库异常进行故障转换,并按照您所说的使用 FaultContracts。所以我没有得到客户端的异常,而是错误。
    • 您仍在向客户端公开服务器异常。您的客户端应该如何处理服务器上发生的事情?不要使用IncludeExceptionDetailInFaults,而是使用IErrorHandler 之类的东西来提供故障。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多