首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获特定的WCF FaultException

捕获特定的WCF FaultException
EN

Stack Overflow用户
提问于 2013-04-17 03:43:40
回答 2查看 3.5K关注 0票数 4

单层应用程序可以通过以下方式区分异常:

代码语言:javascript
运行
复制
Exception ex;

if (ex is System.DirectoryServices.AccountManagement.PasswordException)
    ...

其中,ex只是一个通用的异常。

当你迁移到多层的WCF时,你失去了所有这些,你需要使用FaultException机制。

问题是,我找不到任何方法来做到这一点。

在我的客户机中,我希望捕获FaultException类型,然后区分它们,例如:

代码语言:javascript
运行
复制
catch (FaultException ex)
{
    if FaultException is (PasswordExceptionFault)
      ...
    etc
}

有没有办法做到这一点?

否则,我必须有许多catch构造--每种类型的FaultException都有一个。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 04:21:59

在使用WCF服务时,您必须使用FaulException,因为它是处理错误的原生Soap方法(异常也是不可序列化的)。

在典型的场景中,您将首先在每个操作契约上添加类型化的FaultContract。

代码语言:javascript
运行
复制
// NOTE: This is the std wcf template
[ServiceContract]
public interface IService1
{
    [FaultContract(typeof(int))]
    [FaultContract(typeof(string))]
    [FaultContract(typeof(DateTime))]
    [OperationContract]
    string GetData(int value);
}

对于您决定客户端需要故障信息的所有故障情况,您的服务将发送类型化的faultexception。

您的客户端可以捕获表示操作契约中指定的自定义SOAP错误的FaultException类型。

代码语言:javascript
运行
复制
 ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client();

    try
    {
        Console.WriteLine("Returned: {0}", proxy.GetData(-5));
    }
    catch (FaultException<int> faultOfInt)
    {
        //TODO
        proxy.Abort();
    }
    catch (FaultException<string> faultOfString)
    {
        //TODO
        proxy.Abort();
    }
    catch (FaultException<DateTime> faultOfDateTime)
    {
        //TODO
        proxy.Abort();
    }
    catch (FaultException faultEx)
    {
        Console.WriteLine("An unknown exception was received. "
          + faultEx.Message
          + faultEx.StackTrace
        );
        proxy.Abort();
    }
    catch (Exception e)
    {
        //generic method
        Type exceptionType = e.GetType();
        if (exceptionType.IsGenericType && exceptionType.GetGenericTypeDefinition() == typeof(FaultException<>))
        {
            PropertyInfo prop = exceptionType.GetProperty("Detail");
            object propValue = prop.GetValue(e, null);
            Console.WriteLine("Detail: {0}", propValue);
        }
        else
        {
            Console.WriteLine("{0}: {1}", exceptionType, e.Message);
        }
    }

最后,因为FaultException继承了异常,所以您仍然可以使用反射来获取内部错误类型和详细信息,如下所示。

还要注意,来自WCF客户端上的通信方法的常见预期异常包括TimeoutException、CommunicationException和CommunicationException的任何派生类(如FaultException)。这些指示通信过程中出现的问题,可以通过中止WCF客户端并报告通信故障来安全地处理该问题。

票数 8
EN

Stack Overflow用户

发布于 2015-03-10 08:23:27

只需使用类似以下内容:

代码语言:javascript
运行
复制
if (error is FaultException<ServerTooBusyException>) 
{
    // Do something
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16045726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档