应用开发

如何友好的处理 WebApi 中抛出的错误

时间:2010-12-5 17:23:32  作者:系统运维   来源:应用开发  查看:  评论:0
内容摘要:本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一

本文转载自微信公众号「码农读书」,何友好作者码农读书。处理出的错误转载本文请联系码农读书公众号。中抛

微软的何友好 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的处理出的错误rest服务,异常是中抛一种运行时错误,异常处理是何友好一种处理运行时错误的技术,每一个开发者都应该知道如何处理 Web API 中的处理出的错误异常,并且在 Action 中使用合适的中抛 错误码 和 错误信息 进行包装。

WebAPI 中的何友好 HttpResponseException

你可以在 Action 中使用 HttpResponseException 来包装指定的 HttpCode 和 HttpMessage,如下例子所示:

public Employee GetEmployee(int id) {      Employee emp = employeeRepository.Get(id);     if (emp == null)     {          var response = new HttpResponseMessage(HttpStatusCode.NotFound)         {              Content = new StringContent("Employee doesnt exist",处理出的错误 System.Text.Encoding.UTF8, "text/plain"),             StatusCode = HttpStatusCode.NotFound         }         throw new HttpResponseException(response);     }     return emp; } 

如果你的 Action 返回的云南idc服务商是 IHttpActionResult,那么可将 GetEmployee() 方法修改如下:

public IHttpActionResult GetEmployee(int id) {      Employee emp = employeeRepository.Get(id);     if (emp == null)     {          var response = new HttpResponseMessage(HttpStatusCode.NotFound)         {              Content = new StringContent("Employee doesnt exist",中抛 System.Text.Encoding.UTF8, "text/plain"),             StatusCode = HttpStatusCode.NotFound         }         throw new HttpResponseException(response);     }     return Ok(emp); } 

从上面的代码可以看出,错误码 和 错误消息 都赋给了 Response 对象,何友好然后包装到了 HttpResponseException 进行返回。处理出的错误

WebAPI 中使用 HttpError

除了直接实例化 HttpResponseMessage 类,中抛还可以使用 Request.CreateErrorResponse() 快捷的创建 HttpResponseMessage 类,如下代码所示:

public IActionResult GetEmployee(int id) {      Employee emp = employeeRepository.Get(id);     if (emp == null)     {         string message = "Employee doesnt exist";         throw new HttpResponseException(             Request.CreateErrorResponse(HttpStatusCode.NotFound, message));     }     return Ok(emp); } 

WebAPI 中使用 异常过滤器

异常过滤器是一种可以在 WebAPI 中捕获那些未得到处理的异常的过滤器,要想创建异常过滤器,你需要实现 IExceptionFilter 接口,不过这种方式比较麻烦,更快捷的方法是直接继承 ExceptionFilterAttribute 并重写里面的 OnException() 方法即可,这是因为 ExceptionFilterAttribute 类本身就实现了 IExceptionFilter 接口,如下代码所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]    public abstract class ExceptionFilterAttribute : FilterAttribute, IExceptionFilter, IFilter    {         protected ExceptionFilterAttribute();        public virtual void OnException(HttpActionExecutedContext actionExecutedContext);        public virtual Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken);    } 

下面的代码片段展示了如何通过重写 ExceptionFilterAttribute.OnException() 方法来创建一个自定义异常过滤器,请注意下面的站群服务器代码是如何捕获在 Action 中抛出的异常,并将捕获到的异常转换为 HttpStatusResponse 实体,然后塞入合适的 httpcode 和 httpmessage,如下代码所示:

public class CustomExceptionFilter : ExceptionFilterAttribute  {       public override void OnException(HttpActionExecutedContext actionExecutedContext)      {           HttpStatusCode status = HttpStatusCode.InternalServerError;          String message = String.Empty;          var exceptionType = actionExecutedContext.Exception.GetType();          if (exceptionType == typeof(UnauthorizedAccessException))          {               message = "Access to the Web API is not authorized.";              status = HttpStatusCode.Unauthorized;          }          else if (exceptionType == typeof(DivideByZeroException))          {               message = "Internal Server Error.";              status = HttpStatusCode.InternalServerError;          }          else          {               message = "Not found.";              status = HttpStatusCode.NotFound;          }          actionExecutedContext.Response = new HttpResponseMessage()          {               Content = new StringContent(message, System.Text.Encoding.UTF8, "text/plain"),              StatusCode = status          };          base.OnException(actionExecutedContext);      }  } 

接下来将自定义的异常过滤器添加到 HttpConfiguration 全局集合中,如下代码所示:

public static void Register(HttpConfiguration config)         {              config.MapHttpAttributeRoutes();             config.Routes.MapHttpRoute(                 name: "DefaultApi",                 routeTemplate: "api/{ controller}/{ id}",                 defaults: new {  id = RouteParameter.Optional }             );             config.Formatters.Remove(config.Formatters.XmlFormatter);             config.Filters.Add(new CustomExceptionFilter());         } 

除了将自定义异常设置到全局上,你还可以缩小粒度到 Controller 或者 Action 级别上,下面的代码分别展示了如何将其控制在 Action 和 Controller 上。

[DatabaseExceptionFilter] public class EmployeesController : ApiController {      //Some code }  [CustomExceptionFilter]  public IEnumerable<string> Get()  {      throw new DivideByZeroException();   } 

ASP.NET Web API 提供了强大的 HttpResponseException 来包装异常信息,默认情况下,当 WebAPI 中抛出异常,系统默认使用 Http StateCode = 500 作为回应,也即:Internal Server Error. ,场景就来了,如果你会用 HttpResponseException 的话,就可以改变这种系统默认行为,自定义错误码和错误信息让结果更加清晰语义化。

译文链接:https://www.infoworld.com/article/2994111/how-to-handle-errors-in-aspnet-web-api.html

copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap