WCF服务端异常捕获FaultException

时间:2013-01-29 23:11:51

标签: wcf exception fault

我正在使用WCF学习故障异常,并且遇到了一些问题。我想看看是否有人可以建议采取适当的方法来执行以下操作。

在我的示例中,情况是我有一个Login服务方法。当进行无效登录尝试时,我抛出自定义错误异常。我在方法中也有一个try catch,以便捕获任何其他未知错误并将其作为自定义的未知错误异常发送到客户端。

问题在于,当我抛出AuthenticationFault异常时,一般异常catch也会抓取并强行发送UnknownFault。

在查看代码后,我能理解 - 为什么 - 这种情况正在发生。那么,它让我问社区应该如何处理这个问题?

我是否应该在服务中使用常规异常catch并始终允许客户端处理此问题?我真的不想使用这种方法,因为那时我如何处理服务器上的其他可能的未知异常并可能记录它们?

是否有可能使捕获状态与&#34相似;捕获任何异常 - 例外 - 错误"?

谢谢,代码如下。

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}

&#34; catch(Exception ex)&#34;上面的代码捕获了之前抛出的错误异常。

try
{
    //--proxy call to the service Login method
}
catch (FaultException<AuthenticationFault> af)
{
    //--Never gets here
}
catch (FaultException<UnknownFault> uf)
{
    //--This is what is handling although I threw the AuthenticationFault
}
catch (Exception ex)
{
    //--any other unknown error
}

以上是客户端错误处理

1 个答案:

答案 0 :(得分:1)

您需要在第一个块中明确捕获并重新抛出AuthenticationFault。您的一般情况是将其转换为FaultException<UnknownFault>

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (FaultException<AuthenticationFault>
{
    throw;
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}