一、WebAPI自定义过滤器的使用

1、注册过滤器

using System.Web.Http;
using KYINT.WebAPIService.Handler; namespace KYINT.WebAPIService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
); //移除XML格式,采用Json进行数据交互
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); //处理DateTime类型序列化后含有T的问题
config.Formatters.JsonFormatter.SerializerSettings.Converters.Insert(, new JsonDateTimeConverter()); //添加全局异常处理器
config.Filters.Add(new KYExceptionFilter()); //添加全局认证过滤器
config.Filters.Add(new KYAuthenticationFilter()); //添加全局统计过滤器
config.Filters.Add(new StatisticsFilter());
}
}
}

2、全局认证过滤器

    /// <summary>
/// 认证过滤器,验证是否含有UUID标头
/// </summary>
public class KYAuthenticationFilter : Attribute, IAuthenticationFilter
{
public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
if (KYAuthenticationFilter.SkipAuthentication(context))
{
return ;
} IPrincipal principal = await this.AuthenticateAsync(context.Request);
if (principal == null)
{
context.ErrorResult = new AuthenticationFailureResult("未授权请求", context.Request);
}
else
{
context.Principal = principal;
}
} /// <summary>
/// 从授权表头中取出授权值并验证,验证通过构建正确的Principal对象
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private Task<IPrincipal> AuthenticateAsync(HttpRequestMessage request)
{
return Task.Run<IPrincipal>(() =>
{
string UUID = request.GetHeader("UUID");
if (string.IsNullOrWhiteSpace(UUID))
{
return null;
} User user = TB_NUsersBLL.GetUser(UUID);
if (user == null)
{
return null;
} request.Properties.Add("UUID", user); IEnumerable<Claim> claims = new List<Claim>()
{
new Claim(ClaimTypes.Sid, UUID),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.MobilePhone, user.TelePhone)
}; return new ClaimsPrincipal(new ClaimsIdentity(claims));
});
} /// <summary>
/// 检查控制器或方法是否启用NoAuthenticationAttribute,如果启用了,则跳过认证
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private static bool SkipAuthentication(HttpAuthenticationContext context)
{
return context.ActionContext.ActionDescriptor.GetCustomAttributes<NoAuthenticationAttribute>().Any<NoAuthenticationAttribute>()
|| context.ActionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<NoAuthenticationAttribute>().Any<NoAuthenticationAttribute>();
}
}

2.1、不需鉴权过滤器

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class NoAuthenticationAttribute : Attribute
{
}

3、全局统计过滤器

    /// <summary>
/// 全局统计过滤器
/// </summary>
public class StatisticsFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
//以下为业务处理
string methodName = actionContext.Request.RequestUri.AbsolutePath;
//异步调用
Task.Factory.StartNew((obj) => TA_InteriorAppModuleInfoBLL.AddModuleInfo((string)obj), methodName);
}
}

4、全局异常过滤器

    /// <summary>
/// 全局异常过滤器
/// </summary>
public class KYExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
#region 标准做法 //var exception = actionExecutedContext.Exception; //if (exception is BusinessException) //业务异常,一般不需记录日志,直接反馈错误信息至前端
//{
// actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse((HttpStatusCode)exception.HResult, new HttpError(exception.Message));
//}
//else //未处理异常如数据库访问出错、代码层面异常等,返回错误信息并记录日志
//{
// actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(exception.Message));
// //LogHelper.Error(typeof(KYExceptionFilter), exception);
// LogHelper.Error(actionExecutedContext.Request.RequestUri.AbsolutePath, exception);
//} #endregion #region 变异做法(受限于现在接口及各终端通行做法,后期需要调整为标准做法) var exception = actionExecutedContext.Exception; if (exception is BusinessException) //业务异常,一般不需记录日志,直接反馈错误信息至前端
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.OK, Utils.AssembleMsg(exception.Message));
}
else if (exception is OperationCanceledException)//ThirdParty/GetMobilePlace 处理已取消该操作异常
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.OK, Utils.AssembleMsg("客户端取消了这次请求"));
}
else //未处理异常如数据库访问出错、代码层面异常等,返回错误信息并记录日志
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.OK, Utils.AssembleMsg("服务器处理出错"));
LogHelper.Error(typeof(KYExceptionFilter), actionExecutedContext.Request.RequestUri.AbsolutePath, exception);
} #endregion
}
}

一、WebAPI自定义过滤器的使用的更多相关文章

  1. WebApi 自定义过滤器实现支持AJAX跨域的请求

    我想关于此类话题的文章,大家一搜铺天盖地都是,我写此文的目的,只是对自己学习过程的记录,能对需要的朋友有所帮助,也百感荣幸!!!废话不多说,直接上代码! 客户端:很简单的AJAX请求 <html ...

  2. 实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Fi ...

  3. lucene自定义过滤器

    先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤 ...

  4. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  5. angular之自定义过滤器的使用

    自定义过滤器需要使用filter函数,格式如下: filter("filterName',function(){ return function(target,args){ .... } } ...

  6. 第六节:Vue过滤器的用法和自定义过滤器

    1.过滤器的用法,用  '|' 分割表达式和过滤器. 例如:{{ msg |  filter}}     {{msg | filter(a)}}  a就标识filter的一个参数. 用两个过滤器:{{ ...

  7. .net中自定义过滤器对Response内容进行处理

    原文:http://www.cnblogs.com/zgqys1980/archive/2008/09/02/1281895.html 代码DEMO:http://files.cnblogs.com/ ...

  8. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  9. Vue自定义过滤器

    gitHub地址: https://github.com/lily1010/vue_learn/tree/master/lesson05 一 自定义过滤器(注册在Vue全局) 注意事项: (1)全局方 ...

随机推荐

  1. 北京麒麟会GITC

    分享ppt:https://pan.baidu.com/s/1Aerqtbi8VpMiFGhfEMUtPQ http://bj.thegitc.com/#meeting-agenda

  2. efcore mysql数据库codefirst生成

    添加引用 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Pomelo.EntityFrameworkCore.My ...

  3. WPF,ComboBox,取汉字首字母,extBoxBase.TextChanged

    1取汉字汉语拼音首字母: private static string GetFirstLetterOfChineseString(string CnChar) { long iCnChar; byte ...

  4. WPF树形菜单--递归与非递归遍历生成树结构的集合

    一.新建了WPF项目作为测试,使用TreeView控件进行界面展示. 第一步创建实体类TreeEntity: public class TreeEntity { private int _mid; p ...

  5. .net基础加强

    1.冒泡排序 请通过冒泡排序法对整数数组{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }实现升序排序 , , , , , , , , , }; BubbleSort(num); C ...

  6. 我是如何一步步编码完成万仓网ERP系统的(一)系统架构

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  7. SQLMap常用教程

    先安装 python环境(2.6.x或2.7版本) ,再将SQLMap 放在安装目录下 注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql ...

  8. Java中配置文件的三种配置位置及读取方式

    XML 和properties properties: 1.存放于src根目录下 //获取到同包下的资源文件,将其转换成流对象 //InputStream is= PropertiesDemo.cla ...

  9. 使用python来反查数据表中的字段名

    1. 链接数据库 import psycopg2 conn = psycopg2.connect(user,host,port,database,password) cur = conn.cursor ...

  10. linux命令提示符解析

    linux命令提示符 命令窗口中[root@chengfeng ~]# 表示什么意思?       root        当前登录终端的用户      chengfeng     主机名(/etc/ ...