HttpResponseException-----HTTP响应异常

如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误的HTTP响应。

这个HTTPResponseException类型是一个特殊的类型。这种异常会返回你在异常构造器中指定的任何HTTP状态码。例如,在以下方法中,如果这个id参数无效,那么会返回“404---未找到”

  public Product GetProduct(int id)
{
var item = repository.Get(id);
if (item == null)
//未找到返回一个404的状态码
throw new HttpResponseException(HttpStatusCode.NotFound);
return item;
}

为了响应进行更多的控制,你也可以构造整个响应消息,并用HTTPResponseMessage来包含它:

 public Product GetProduct(int id)
{
var item = repository.Get(id);
if (item == null)
//未找到返回一个404的状态码
{
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(String.Format("No product with ID={0}", id)),
ReasonPhrase = "Product ID Not Found"
};
throw new HttpResponseException(resp);
}
return item;
}

Exception Filters---异常过滤器

通过编写一个异常过滤器,你可以定制Web API如何处理异常。当一个控制器抛出一个未处理异常,且这个异常不是一个HttpResponseException异常时,一个异常过滤器会被执行。HttpResponseException类型是一个特殊情况,因为它是专门设计用来返回一个HTTP响应的。

异常过滤器实现System.Web.Http.Filters.IExceptionFilter接口。编写异常过滤器最简单的方法是通过System.Web.Fitlers.ExceptionFilterAttribute类进行派生,并重写OnException方法。

注意:ASP.NET Web API中的异常过滤器与ASP.NET MVC中是及其相似的。然后,它们被声明在不用的命名空间下,且功能也是独立的。特别强调以下,ASP.NET MVC中使用的HandlerErrorFilterAttribute不会处理Web API控制器抛出的异常。

以下是将NotImplementedException异常转换成HTTP状态码“501 - 未实现”的过滤器:

 namespace WebAPIDemo.Filter
{
public class NotImpleExceptionFilterAttribute:ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception is NotImplementedException)
actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotImplemented);
}
}
}

HttpActionExecutedContext对象的Response属性含有发送到客户端的HTTP响应消息

Registering  Exception Filters --- 注册异常过滤器

以下是注册Web API异常过滤器的几种方式

1.通过Action注册

2.通过Controller注册

3.通过全局注册

要把过滤器应用特定的Action,在Action中添加过滤器的注解属性

 [NotImpleExceptionFilter]
public Product GetProduct(int id)
{
var item = repository.Get(id);
if (item == null)
//未找到返回一个404的状态码
{
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(String.Format("No product with ID={0}", id)),
ReasonPhrase = "Product ID Not Found"
};
throw new HttpResponseException(resp);
}
return item;
}

要把过滤器应用于一个控制器的所有Action,可以在Controller上添加过滤器的注解属性

[NotImpleExceptionFilter]
public class ProductController : ApiController
{
   
}

要全局性的把过滤器运用于所有的Web API控制器将该过滤器的一个实例添加GlobalConfiguration.Configuration.Filter集合。这个集合中的所有异常过滤器会应用于任何Web API控制器Action

public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册全局异常过滤器
GlobalConfiguration.Configuration.Filters.Add(new NotImpleExceptionFilterAttribute());
}
}

HttpError----HTTP错误

HttpError对象为在响应正文中返回错误消息提供了响应的方法。以下实例演示了如何用HttpError在响应中返回HTTP状态码“404--未找到”:

 public HttpResponseMessage GetProduct(int id)
{
var item = repository.Get(id);
if (item != null)
return Request.CreateResponse(HttpStatusCode.OK, item);
var message = string.Format("Product with id = {0} not found", id);
HttpError httpError = new HttpError(message);
return Request.CreateResponse(HttpStatusCode.NotFound, httpError);
}

在这个例子中,如果该方法成功,它会在HTTP响应中返回产品。但如果所请求的产品未找到,则HTTP响应会在请求体中包含一个HttpError。该响应看起来大致像这样

 HTTP/1.1  Not Found
Content-Type: application/json; charset=utf-
Date: Thu, Aug :: GMT
Content-Length: {
"Message": "Product with id = 12 not found"
}

注意。在这个例子中,HttpError会被序列化成JSON。使用HttpError的一个好处是,与其它强类型模型一样,会进行同样的“content-negotiation”(暂未实现)和序列过程

直接替代创建HttpError对象的一种方法是:你可以使用CreateErrorResponse方法:

 public HttpResponseMessage GetProduct(int id)
{
var item = repository.Get(id);
if (item != null)
return Request.CreateResponse(HttpStatusCode.OK, item);
var message = string.Format("Product with id = {0} not found", id);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
}

CreateErrorResponseSystem.Net.Http.HttpRequsetMessageExtensions类中被定义的一个扩展方法。本质上,CreateErrorResponse会创建一个HttpError实例,然后创建一个包含该HttpError的HttpResponseMessage

  Adding Custom Key-Values to HttpError 把自定义的键值添加到HttpError

  HttpError类实际上是个键--值集合,(派生与于Dictionary<String,Object>),因此你可以添加自己的键--值对

 public HttpResponseMessage GetProduct(int id)
{
var item = repository.Get(id);
if (item != null)
return Request.CreateResponse(HttpStatusCode.OK, item);
var message = string.Format("Product with id = {0} not found", id);
var err = new HttpError(message);
err["error_sub_code"] = ;
return Request.CreateErrorResponse(HttpStatusCode.NotFound, err);
}

Using HttpError with HttpResponseExceptionHttpResponseException的方式来使用HttpError

前面的例子是从Action返回一个HttpResponseMessage消息,但你也可以使用HttpResponseException来返回一个HttpError。这让你能够在正常成功情况下返回强类型模型,而在错误时,仍返回HttpError

 public Product GetProduct(int id)
{
var item = repository.Get(id);
if (item != null)
return item;
var message = string.Format("Product with id = {0} not found", id);
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, message));
}

Asp.Net Web API(四)的更多相关文章

  1. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  2. Asp.Net Web API 2第四课——HttpClient消息处理器

    Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web A ...

  3. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  4. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  5. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  6. How ASP.NET Web API 2.0 Works?[持续更新中…]

    一.概述 RESTful Web API [Web标准篇]RESTful Web API [设计篇] 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 二.路由 ...

  7. 初试ASP.NET Web API/MVC API(附Demo)

    写在前面 HTTP RESTful 创建Web API 调用Web API 运行截图及Demo下载 ASP.NET Web API是​​一个框架,可以很容易构建达成了广泛的HTTP服务客户端,包括浏览 ...

  8. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  9. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

随机推荐

  1. [转载] Java集合---HashMap源码剖析

    转载自http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射 ...

  2. 两种数据传输的方式——get和post。

    Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  3. 开源巨献:Google最热门60款开源项目

    文章整理于互联网.本文收集了 60款 Google 开源的项目,排名顺序按照 Github ★Star 数量排列. 0.机器学习系统 TensorFlow  ★Star 62533 TensorFlo ...

  4. 拼写纠错的利器,BK树算法

    BK树或者称为Burkhard-Keller树,是一种基于树的数据结构,被设计于快速查找近似字符串匹配,比方说拼写纠错,或模糊查找,当搜索”aeek”时能返回”seek”和”peek”. 本文首先剖析 ...

  5. YOLO 算法框架的使用一(初级)

    YOLO官方框架使用C写的,性能杠杠的,YOLO算法,我就不做过多介绍了.先简单介绍一下这个框架如何使用.这里默认是yolo2,yolo1接近过时.环境 推荐ubuntu 或者centos YOLO是 ...

  6. 通过ELK快速搭建一个你可能需要的集中化日志平台

    在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散 落在各个服务器的logs文件夹下,确实有点不大方便,这个时候 ...

  7. Abp后台工作者类使用hangfire

    一.Abp中的后台工作及后台工作者类 请阅读这篇文章 二 .Abp官方实现的缺点 Abp官方实现方式很简单,也很容易上手,但缺点是工作者类依赖了具体的基类(PeriodicBackgroundWork ...

  8. Nvidia TX2 Robot 环境配置记录

    p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #454545 } p. ...

  9. Thinkphp导入外部类的方法

    相信很多人在使用TP时候都苦恼使用外部类各种不成功 下面为大家详细介绍下引用方法和注意细节 手动加载第三方类库 由于第三发类库没有具体的命名空间,所以需要使用以下几种方法手动导入 1.import方法 ...

  10. eric6 中 designer 无法启动的解决办法

    1.安装环境:win10+python3.6+Eric6 2.问题:使用 pip install PyQt5 安装 PyQt5.9 版本后,发现 Eric6 中无法打开 designer.exe 工具 ...