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; 
        }
AI 代码解读

异常过滤 (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; 
        }
AI 代码解读

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

本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

目录
打赏
0
0
0
0
176
分享
相关文章
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
40 2
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Gemini Coder 是一款基于 Google Gemini API 的 AI 应用生成工具,支持通过文本描述快速生成代码,并提供实时代码编辑和预览功能,简化开发流程。
216 38
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
141 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
120 1
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
377 2
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
109 2
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
2585 0
Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面
随着大数据技术的发展,Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面,方便管理和监控 Kafka 集群。本文详细介绍了 Kafka Manager 的部署步骤和基本使用方法,包括配置文件的修改、启动命令、API 示例代码等,帮助你快速上手并有效管理 Kafka 集群。
99 0

热门文章

最新文章

下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等