Asp.Net Web API(四)

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

HttpResponseException-----HTTP响应异常

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

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

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

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

 1 public Product GetProduct(int id)
 2 {
 3             var item = repository.Get(id);
 4             if (item == null)
 5             //未找到返回一个404的状态码
 6             {
 7                 var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
 8                 {
 9                     Content = new StringContent(String.Format("No product with ID={0}", id)),
10                     ReasonPhrase = "Product ID Not Found"
11                 };
12                 throw new HttpResponseException(resp);
13             }
14             return item;
15 }

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 - 未实现”的过滤器:

 1 namespace WebAPIDemo.Filter
 2 {
 3     public class NotImpleExceptionFilterAttribute:ExceptionFilterAttribute
 4     {
 5         public override void OnException(HttpActionExecutedContext actionExecutedContext)
 6         {
 7             if (actionExecutedContext.Exception is NotImplementedException)
 8                 actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotImplemented);
 9         }
10     }
11 }

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

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

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

       1.通过Action注册

       2.通过Controller注册

       3.通过全局注册

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

 1 [NotImpleExceptionFilter]
 2 public Product GetProduct(int id)
 3  {
 4           var item = repository.Get(id);
 5            if (item == null)
 6             //未找到返回一个404的状态码
 7             {
 8                 var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
 9                 {
10                     Content = new StringContent(String.Format("No product with ID={0}", id)),
11                     ReasonPhrase = "Product ID Not Found"
12                 };
13                 throw new HttpResponseException(resp);
14             }
15            return item;
16 }

要把过滤器应用于一个控制器的所有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--未找到”:

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

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

1 HTTP/1.1 404 Not Found
2 Content-Type: application/json; charset=utf-8
3 Date: Thu, 09 Aug 2012 23:27:18 GMT
4 Content-Length: 51
5 
6 {
7   "Message": "Product with id = 12 not found"
8 }

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

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

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

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

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

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

 1 public HttpResponseMessage GetProduct(int id)
 2 {
 3             var item = repository.Get(id);
 4             if (item != null)
 5                 return Request.CreateResponse(HttpStatusCode.OK, item);
 6             var message = string.Format("Product with id = {0} not found", id);
 7             var err = new HttpError(message);
 8             err["error_sub_code"] = 42;
 9             return Request.CreateErrorResponse(HttpStatusCode.NotFound, err);
10 }

 

Using HttpError with HttpResponseExceptionHttpResponseException的方式来使用HttpError

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

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

 

相关文章
|
9小时前
|
应用服务中间件 API nginx
使用Python和Flask构建RESTful Web API
使用Python和Flask构建RESTful Web API
5 0
|
8天前
|
缓存 API 数据库
构建高效Python Web应用:Flask框架与RESTful API设计原则
【5月更文挑战第20天】 在现代Web开发中,构建一个轻量级且高效的后端服务至关重要。本文将深入探讨如何使用Python的Flask框架结合RESTful API设计原则来创建可扩展和易于维护的Web应用程序。我们将通过分析Flask的核心特性,以及如何利用它来实现资源的合理划分、接口的版本控制和请求处理优化等,来指导读者打造高性能的API服务。文中不仅提供了理论指导,还包括了实践案例,旨在帮助开发者提升开发效率,并增强应用的稳定性和用户体验。
|
11天前
|
缓存 监控 API
利用Python构建高性能的Web API后端服务
随着微服务架构的普及和RESTful API的广泛应用,构建高性能、可扩展的Web API后端服务变得尤为重要。本文将探讨如何利用Python这一强大且灵活的语言,结合现代Web框架和工具,构建高效、可靠的Web API后端服务。我们将分析Python在Web开发中的优势,介绍常用的Web框架,并通过实际案例展示如何设计并实现高性能的API服务。
|
13天前
|
XML 开发框架 .NET
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
21 1
|
13天前
|
开发框架 JSON .NET
.Net4.0 Web.config 配置实践
.Net4.0 Web.config 配置实践
|
13天前
|
弹性计算 JSON Shell
基于Web API的自动化信息收集和整理
【4月更文挑战第30天】
23 0
|
13天前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
|
13天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
36 1
|
13天前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
13天前
|
开发框架 缓存 前端开发
利用Visual Basic构建高效的ASP.NET Web应用
【4月更文挑战第27天】本文探讨使用Visual Basic与ASP.NET创建高效Web应用的策略,包括了解两者基础、项目规划、MVC架构、数据访问与缓存、代码优化、异步编程、安全性、测试及部署维护。通过这些步骤,开发者能构建出快速、可靠且安全的Web应用,适应不断进步的技术环境。