Web API异常包装器

本文关键字:包装 异常 API Web | 更新日期: 2023-09-27 18:09:58

我使用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);
        }
    }
}

当抛出异常时,将捕获异常并准备消息。与重新抛出,我得到一个新的错误消息:

处理HTTP请求导致异常。有关详细信息,请参阅此异常的' response '属性返回的HTTP响应。

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

Web API异常包装器

虽然这可能有效,但我建议您为此创建一个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。控制器:

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

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

3。全球

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

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

如果您使用"ASP. net ". NET MVC 4 Web应用程序"项目模板来创建您的项目,将您的Web API配置代码放在WebApiConfig类中,该类位于App_Start文件夹中:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new FaultExceptionFilterAttribute());
        // Other configuration code...
    }
}