.NET WebAPI 利用特性捕捉异常
声明:本方式及代码只使用与.NET Web API.
先创建类继承ExceptionFilterAttribute类型并复写OnException方法。
代码如下:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Web.Http.Filters;
using FrameWork.Common;
using FrameWork.Common.Const; namespace FrameWork.Web.Handle
{
/// <summary>
/// 处理错误信息
/// </summary>
public class ErrorHandleAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext filterContext)
{
// 错误处理
base.OnException(filterContext);
var sb = new StringBuilder();
sb.AppendLine("参数:"+ GetExceptionMessage(filterContext));
sb.AppendLine("异常内容:"+ filterContext.Exception.ToJson());
Log4NetHelp.Error(sb.ToString());
filterContext.Response = GetResponse(sb.ToString());
} /// <summary>
/// 处理错误信息为方便开发人员阅读的格式,包括接口地址以及参数
/// </summary>
/// <param name="actionExecutedContext">异常内容</param>
private string GetExceptionMessage(HttpActionExecutedContext actionExecutedContext)
{
var session = System.Web.HttpContext.Current.Session;
var request = System.Web.HttpContext.Current.Request;
var guid = Guid.NewGuid().ToString();
var task = actionExecutedContext.ActionContext.Request.Content.ReadAsStreamAsync();
var content = string.Empty;
try
{
var sm = task.Result;
if (sm != null)
{
sm.Seek(, SeekOrigin.Begin);
var len = (int)sm.Length;
var inputByts = new byte[len];
sm.Read(inputByts, , len);
sm.Close();
content = Encoding.UTF8.GetString(inputByts);
sm.Close();
}
}
catch (Exception e)
{
return e.Message;
} var sessionId = session == null ? "" : session.SessionID;
var pars = string.Format("error:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n content = {2};"
, sessionId
, request.RawUrl
, content
, guid
, request.ContentType); return pars;
} /// <summary>
/// 处理错误信息后执行的方法
/// </summary>
/// <param name="mes">错误信息</param>
private HttpResponseMessage GetResponse(string mes)
{
return JsonHelper.ToJson(new
{
Info = CommonConst.FailStr,
Message = mes,
Msg = false,
ResultCode = CommonConst.FailCode
});
}
}
}
如何使用呢?
只需要在需要捕捉异常的控制器加上[ErrorHandle]即可。
例如:
[ErrorHandle]
public abstract class AdminControllerBase : Controller
{
//代码逻辑
}
如果继承AdminControllerBase或者带有[ErrorHandle]特性的类和方法出现了错误,都会执行OnException方法。
可以在处理异常的方法里面加上自己想要的逻辑处理。
也可以直接在WebApiConfig.cs文件中加上
config.Filters.Add(new WebApiErrorHandleAttribute());
这样就是全局捕捉异常了,只要接口内部没有try…catch,那么其他所有的异常都会捕捉到。
.NET WebAPI 利用特性捕捉异常的更多相关文章
- .NET [MVC] 利用特性捕捉异常
声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...
- .NET Core[MVC] 利用特性捕捉异常
声明:本方式适用于MVC.本代码只适用于.NET Core MVC. 先创建一个类继承ExceptionFilterAttribute这个抽象类,并override它的方法OnException. 代 ...
- 如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求
在方法上贴上attribute(特性)捕捉方法的异常,其实这么做也是为了在项目中不会大量使用try-cacth这样的语句,同时使我们的代码看起来更简洁,更直观,将逻辑业务分离使得后期维护方便.这里我们 ...
- MVC 应用程序级别捕捉异常
捕捉异常: using System; using System.IO; using System.Net; using System.Net.Http; using System.Net.Http. ...
- C#开发---利用特性自定义数据导出到Excel
网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据 1.在NuGet上安装Aspose.Cells或 ...
- webapi 利用webapiHelp和swagger生成接口文档
webapi 利用webapiHelp和swagger生成接口文档.均依赖xml(需允许项目生成注释xml) webapiHelp:微软技术自带,仅含有模块.方法.请求-相应参数的注释. swagge ...
- MVC WebAPI框架里设置异常返回格式统一
webApi里设置全局异常返回格式今天为了设置api返回格式统一,在网上找了一推资料,各种资料参差不齐的,最后自己捣鼓,终于弄出来了,直接上代码 /// <summary> /// 消息代 ...
- ABP捕捉异常错误代码
在服务层或者CORE层 随便哪里都可以 创建一个捕捉异常的文件夹 里面写一个LonsidException类 继承后面的接口 然后重写继承的方法 这样在ABP项目运行阶段 无论在哪里出现异 ...
- zzw原创_oracle循环中的异常捕捉_捕捉异常后并继续循环
例子如下 set serveroutput on; declare V_SQL VARCHAR2(255); errorCode number; --异常编码 errorMsg var ...
随机推荐
- Three.js学习笔记02
1.改变相机的位置,让物体移动 通过下面的代码改变相机的位置: camera.position.x =camera.position.x +1; 将相机不断的沿着x轴移动1个单位,也就是相机向右移动. ...
- Azure Web连接到Azure MySql Db
这个问题折腾了好一会,简单记录一下. 两种方式: 输入"规则名称"."起始 IP"和"结束 IP",然后单击"保存". ...
- 算法与数据结构(八) AOV网的关键路径(Swift版)
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- Vue 学习笔记 -- inline-template
简书 更方便的使用私有子组件 定义一个私有子组件时,如果子组件的template过长会使得代码非常难以阅读 这时可以使用内联模版 但是如果写成这样 为毛用要子组件呢?
- 在vue中使用svg sprite
概述 这几天研究了一下在vue中使用svg sprite,有些心得,记录下来,供以后开发时参考,相信对其它人也有用. 在vue中导入svg 在vue中导入svg的方法有很多种,比如在img标签的src ...
- 配置Zookeeper、Dubbox
CentOS的配置: 1.给CentOS安装Zookeeper: 网络配置成仅主机 上传tar.gz:比如用FTP tar -xvzf ... cd zookeeper mkdir data cd c ...
- [Swift]LeetCode395. 至少有K个重复字符的最长子串 | Longest Substring with At Least K Repeating Characters
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- [Swift]LeetCode528. 按权重随机选择 | Random Pick with Weight
Given an array w of positive integers, where w[i] describes the weight of index i, write a function ...
- [Swift]LeetCode867. 转置矩阵 | Transpose Matrix
Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...
- Python - 命令式编程与符号编程
原文链接:https://zh.d2l.ai/chapter_computational-performance/hybridize.html本文是对原文内容的摘取和扩展. 命令式编程(imperat ...