如何从wcf中获得业务异常

本文关键字:业务 异常 wcf | 更新日期: 2023-09-27 18:12:50

如何测试从WCF调用返回的此异常?

我有这个错误类。

[Serializable]
public class PermissionDenied_Error : Exception
{
    public PermissionDenied_Error() : base("You are not approved.") { }
}

In my Service, I ' m throw it.

if (notApproved)
{
    throw new FaultException<PermissionDenied_Error>(new PermissionDenied_Error()
              , new FaultReason("Permissions Denied!"));
}

在我的测试中,我期待它。

[Test]
[ExpectedException(typeof(FaultException<PermissionDenied_Error>))]

当前结果为:

Expected: System.ServiceModel.FaultException`1[[PermissionDenied_Error
    , Project.API, Version=1.0.4318.24332, Culture=neutral, PublicKeyToken=null]]
 but was: System.ServiceModel.FaultException : Permissions Denied!

如何从wcf中获得业务异常

您的PermissionDenied_Error应该是一个数据合同。它不应该从Exception派生。

同样,您需要将FaultContractAttribute放在您的操作契约上,以便客户端知道会发生异常。

Valamas添加

public interface IAccess
{
        [OperationContract]
        [FaultContract(typeof(PermissionDenied_Error))]
        DtoResponse Access(DtoRequest request);
}

在WCF中根本不是这样工作的。

有关于如何设置和使用FaultExceptions的文章

检查这一步一步在这里:异常处理在Windows通信框架和最佳实践

使用ExpectedException属性是一种不好的做法。而不是使用这个:

[Test]
[ExpectedException(typeof(FaultException<PermissionDenied_Error>))]

尝试:

[Test]
public void Test1()
{
    .....
    try{
       WfcServiceCall(...);
       Assert.Fail("a FaultException<PermissionDenied_Error> was expected!");
    }catch(FaultException<PermissionDenied_Error>){
       Assert.Sucess();
    }catch(Exception e){
       Assert.Fail("Unexpected exception!")
    }
}