联系人管理器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

转载于:https://www.cnblogs.com/shanyou/archive/2012/05/13/2497810.html

Contact Manager Web API 示例[4] 异常处理(Exception Handling)相关推荐

  1. Contact Manager Web API 示例[1]CRUD 操作

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

  2. Asp.net Web Api 路由 和 异常处理

    一.路由: 新建一个ASP.NET MVC4 Web Application项目之后,我们会发现在网站根目录下有个App_Start文件夹.找到下面的RouteConfig.cs文件,如下: publ ...

  3. java调用asp.net webapi_通过HttpClient 调用ASP.NET Web API示例

    在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介 ...

  4. Dynamics CRM2016 Update or Create parentcustomerid in Contact using web api

    联系人实体中有个特殊的字段parentcustomerid 在通过web api创建或更新记录时,如果在给这个字段赋值时当做查找字段对待的话,那你就会遇到问题了,报错信息如下 正确的赋值方式如下 转载 ...

  5. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs 第2章 创建各种Web API 本文引自:http://www.asp ...

  6. ASP.NET Core和Web API:用于管理异常和一致响应的自定义包装器

    目录 介绍 为什么? 怎么做? VMD.RESTApiResponseWrapper Nuget软件包 安装及使用 ASP.NET Core集成 ASP.NET Web API集成 样本响应输出 定义 ...

  7. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序

    目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...

  8. ASP.NET Core Web API基于RESTFul APIs的集合结果过滤和分页

    译者荐语:如何在RESTFul APIs中进行集合结果分页?还是用客户端来拼接链接地址么? 原文来自互联网,由长沙DotNET技术社区[邹溪源]翻译.如译文侵犯您的版权,请联系小编,小编将在24小时内 ...

  9. Asp.Net Web API 2第七课——Web API异常处理

    Asp.Net Web API 2第七课--Web API异常处理 原文:Asp.Net Web API 2第七课--Web API异常处理 前言 阅读本文之前,您也可以到Asp.Net Web AP ...

最新文章

  1. npm安装出错Unexpected end of input at 1:2307
  2. MongoDB 字符串值长度条件查询
  3. 【JavaScript】编写一个炫彩的网页时钟
  4. datagridview单元格合并居中_系统地学习Excel第17课,设置单元格格式
  5. 哈工大-操作系统的引导
  6. python公式_魔方字母公式转ABC公式python小工具
  7. GB2312、GBK、UTF-8 如何转换
  8. html为知笔记模板,新建笔记模板二次开发
  9. Gilbert Strang-线性代数总结
  10. 升级数据库增加字段之OrmLite
  11. 夹水晶头8根网线的顺序
  12. 安师大计算机专业排名多少,安师大的计算机专业怎么样
  13. 计算机图像识别的原理、过程、应用前景
  14. dtm文件生成等高线 lisp_CAD2000下DTM的建立
  15. 金沙滩51单片机74HC138 三八译码器的应用
  16. 中国人工智能学会通讯——AI时代的若干伦理问题及策略 1.1人工智能时代正在加速到来,算法决策开始兴起...
  17. DOSBox编译汇编程序(debug、MASM)
  18. 社区折腾日志:基于python搭建个人微信/支付宝免签支付功能
  19. Win10中的ERDAS 9.2安装(附下载链接)
  20. matlab函数重名,matlab无法定义具有重复名称 f 的函数。

热门文章

  1. ConvMLP:你见过长得像CNN的MLP吗?UOUIUC提出了用于视觉任务的层次卷积MLP
  2. Kaggle Human Protein Atlas 比赛总结—如何闯入Top1%拿到金牌
  3. Java程序员如何提升技能
  4. 教你些技巧,用 Python 自动化办公做一些有趣的事情 太方便了
  5. Python的优缺点介绍
  6. 神经网络“炼丹炉”内部构造?牛津大学博士小姐姐用论文解读
  7. CVPR2019 oral 目标跟踪算法之SiamRPN++
  8. python计算最大回撤_最大回撤线性算法实现
  9. 饿了么java_eleme-openapi-java-sdk
  10. Java 集合框架详解