博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Contact Manager Web API 示例[4] 异常处理(Exception Handling)
阅读量:6125 次
发布时间:2019-06-21

本文共 3644 字,大约阅读时间需要 12 分钟。

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址。

已经做了一个基本的介绍,

介绍Web API Routing。

主要介绍OData的查询和分页支持。

本文主要介绍WebAPI的异常处理HttpResponseMessage。

如果 Web API 的 controller 掷出一个异常(exception),会发生什么事?默认下,最常是会把例外转译为一个 HTTP 状态代码 500 (Internal Server Error) 回应。

是一个特别情况。能够构建回应的信息, 这个例外能回传任何 HTTP 状态代码。例如,下面例子,如果 id 参数不存在,会回传 404 (Not Found) 状态代码。

public HttpResponseMessage<Contact> Get(int id)

        {
            var contact = this.repository.Get(id);
            if (contact == null)
            {
                var response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.NotFound;
                response.Content = new StringContent("Contact not found");
                throw new HttpResponseException(response);
            }
            var contactResponse = new HttpResponseMessage<Contact>(contact);

            //set it to expire in 5 minutes

            contactResponse.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(30));
            return contactResponse;
        }

异常过滤 (EXCEPTION FILTERS)

你可以通过编写 异常过滤(Exception Filter)来自己处理 Web API 的异常。当一个 controller 方法抛出任何未处理的例外,它并不是 HttpResponseException 异常,异常过滤被会执行。HttpResponseException 型别是一种特别情况,因为它是特别设计来回传 HTTP 响应。

异常过滤实现 System.Web.Http.Filters.IExceptionFilter 接口。不管如何,只需要继承 System.Web.Http.Filters.ExceptionFilterAttribute 然后重写(override) OnException 方法。

namespace ContactManager.Filters

{
    public class LogExceptionFilter : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            //增加二行 Trace 代码

            Trace.TraceError("异常: {0}", actionExecutedContext.Exception.Message);

            Trace.TraceError("请求 URI: {0}", actionExecutedContext.Request.RequestUri);

            base.OnException(actionExecutedContext);

        }
    }
}

你也能自行控制 HTTP 响应让 Client 接收。在 HttpActionExecutedContext 参数 去修改或设置 Result 属性。我们新增一个 NotImplExceptionFilter 类别,一样继承 ExceptionFilterAttribute 类和重写 OnException 方法。

namespace ContactManager.Filters

{
    public class NotImplExceptionFilter : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            //增加二行 Trace 代码

            Trace.TraceError("异常: {0}", actionExecutedContext.Exception.Message);

            Trace.TraceError("请求 URI: {0}", actionExecutedContext.Request.RequestUri);

            if(actionExecutedContext.Result==null)

            {
                actionExecutedContext.Result = new  HttpResponseMessage();

            }

            //HttpStatusCode.NotImplemented = 501 
            actionExecutedContext.Result.StatusCode = HttpStatusCode.NotImplemented ;
            actionExecutedContext.Result.Content = new StringContent("方法未执行");

            base.OnException(actionExecutedContext);

        }
    }
}

注册异常过滤

有二种方法可以去注册异常过滤。

第一,你可以注册到全局的 GlobalConfiguration.Configuration.Filters 集合。当发生未处理的异常,异常过滤集合中会作用在所有 Web API controller action。(异常类型 HttpResponseException 也会被执行)。我们必须在 Global.asax 文件的 Application_Start 注册它。

public static void RegisterApis(HttpConfiguration config)

{
   ……

    config.Filters.Add(new LogExceptionFilter());

}

 

protected void Application_Start()

{
         RegisterApis(GlobalConfiguration.Configuration);
}

第二,你可以注册异常过滤至指定的 action 方法,通过指定属性的方式。例如以下范例:

        [HttpGet]

        [NotImplExceptionFilter]
        public HttpResponseMessage<Contact> Get(int id)
        {
            var contact = this.repository.Get(id);
            if (contact == null)
            {
                //var response = new HttpResponseMessage();
                //response.StatusCode = HttpStatusCode.NotFound;
                //response.Content = new StringContent("Contact not found");
                //throw new HttpResponseException(response);
                throw new NotImplementedException("此方法未执行");
            }
            var contactResponse = new HttpResponseMessage<Contact>(contact);

            //set it to expire in 5 minutes

            contactResponse.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(30));
            return contactResponse;
        }

异常过滤在 ASP.NET Web API 与 ASP.NET MVC 类似。不管如何,他们分布在不同命名空间里。特别说明,HandleErrorAttribute 使用在  ASP.NET MVC,无法拿来处理 Web API controller 的异常。

 

参考资料·

·

·

·

转载地址:http://qlfua.baihongyu.com/

你可能感兴趣的文章
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
BZOJ 2190[SDOI2008]仪仗队
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>