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()
在我的包装器方法中不可用
虽然这可能有效,但我建议您为此创建一个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...
}
}