zoukankan      html  css  js  c++  java
  • Contact Manager Web API 示例[4] 异常处理(Exception Handling)

    联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d

    Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍,

    Contact Manager Web API 示例[2] Web API Routing 介绍Web API Routing。

    Contact Manager Web API 示例[3] 分页和查询(Paging and Querying)主要介绍OData的查询和分页支持。

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

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

    HttpResponseException 类 是一个特别情况。能够构建回应的信息, 这个例外能回传任何 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 的异常。

    参考资料· System.Web.Http

    · System.Net.Http

    · Exception Handling in ASP.NET Web API

    ·ASP.NET Web API Exception Handling

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    Java 语句总结
    存储过程 替换字符串
    解决MyEclipse吃内存以及卡死的方法
    Tomcat启动时自动加载一个类
    oracle sql日期比较:
    项目数据库操作
    Oracle 删除重复数据只留一条
    oracle ORA-00001:违反唯一约束条件
    Oracle ORA-12519: TNS:no appropriate service handler found 解决
    tomecat 配置修改 及启动配置
  • 原文地址:https://www.cnblogs.com/shanyou/p/2497810.html
Copyright © 2011-2022 走看看