Web API 异常包装器

Web API Exception Wrapper

我正在使用 WebAPI 调用一些第三方方法:

public class SessionsController : ApiController
{
    public DataTable Get(int id)
    {
        return Services.TryCall(es => es.GetSessionList(id).Tables[0]);
    }
}

我正在结束对这项服务的所有调用:

internal static class Services
{
    internal static IExternalService ExternalService { get; set; }

    internal static T TryCall<T>(Func<IExternalService,T> theFunction)
    {
        try
        {
            return theFunction(ExternalService);
        }
        catch (FaultException<MyFaultDetail> e)
        {
            var message = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            message.Content = new StringContent(e.Detail.Message);
            throw new HttpResponseException(message);
        }
    }
}

当抛出异常时,它会被捕获并准备好消息。通过重新抛出,我收到一条新的错误消息:

Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.

我怎样才能 return 这个异常正确,而不 Visual Studio 抱怨?当我跳过错误时,浏览器得到 501 错误结果。 方法 Request.CreateResponse() 在我的包装器方法中不可用。

好吧,虽然这可能有效,但我建议您为此创建一个 ExceptionFilterAttribute。这样,您就不必使用相同的臃肿代码来保护每个方法的异常。

例如:

    public class FaultExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is FaultException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }

您可以通过多种方式使用此过滤器:

1.通过行动

要将过滤器应用于特定操作,请将过滤器作为属性添加到操作:

public class SampleController : ApiController
{
    [FaultExceptionFilter]
    public Contact SampleMethod(int id)
    {
       //Your call to a method throwing FaultException
        throw new FaultException<MyFaultDetail>("This method is not implemented");
    }
}

2。通过控制器:

要将过滤器应用于控制器上的所有操作,请将过滤器作为属性添加到控制器 class:

[FaultExceptionFilter]
public class SampleController : ApiController
{
    // ...
}

3。全球

要将过滤器全局应用到所有 Web API 控制器,请将过滤器实例添加到 GlobalConfiguration.Configuration.Filters 集合。此集合中的异常过滤器适用于任何 Web API 控制器操作。

GlobalConfiguration.Configuration.Filters.Add(new FaultExceptionFilterAttribute());

如果您使用 "ASP.NET MVC 4 Web Application" 项目模板创建项目,请将您的 Web API 配置代码放在 WebApiConfig class 中,它位于 App_Start文件夹:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new FaultExceptionFilterAttribute());

        // Other configuration code...
    }
}