0

我正在考虑 Windsor 方面的方面或拦截器,它可以捕获从 Web 服务抛出的已知异常并将其重新包装在FaultException<T>.

假设有合同

[ServiceContract]
public interface IMyContract
{
    [OperationContract]
    [FaultContract(typeof(MyException))]
    void DoSome();
}

绑定到实现类的拦截器将FaultContractAttribute在操作上定义并在它捕获时DoSome重新抛出。FaultException<MyException>MyException

这有任何意义吗?有什么注意事项吗?

您能否建议一个可以识别它何时在 WCF 上下文中执行并在这种情况下执行的实现。当不作为 WCF 服务执行时(例如,在单元测试中),这将重新引发所有异常。

4

1 回答 1

0

你可以试试这样的 Castle Windsor Interceptor:

public class FaultContractInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed();
        }
        catch (MyException myException)
        {
            var faultAttributes = invocation.Method.GetCustomAttributes(typeof (FaultContractAttribute), inherit: true) as FaultContractAttribute[];

            if (faultAttributes.Any(f => f.DetailType.FullName == typeof (MyException).FullName))
            {
                throw new FaultException<MyException>(myException, myException.Message);
            }
            else
            {
                throw;
            }
        }
    }
}
于 2013-09-17T14:51:26.877 回答