一、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. Laravel 创建指定表 migrate

    解决方案:打开创建表的那个 migration 文件,在创建表的方法执行之前加一个判断条件 if (!Schema::hasTable('password_resets')) { Schema::cr ...

  2. SQL行转列,列转行

    SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...

  3. [b0017] python 归纳 (三)_类名当参数传入

    # -*- coding: UTF-8 -*- """ 测试传入类名 总结: 似乎python里面的一切东西都可以当参数传入 函数或者方法 ""&qu ...

  4. Spark(4)

    Spark Core官网学习回顾 Speed disk 10x memory 100x Easy code interactive shell Unified Stack Batch Streamin ...

  5. MySQL详细安装(windows)

    一.在MySQL官网上下载MySQL Community Server(目前推荐5.7版本,8.0版本在安装的时候遇到的问题比较多) 点击DOWNLOADS→Community→MySQL Commu ...

  6. Jenkins的CI持续集成

    Jenkins的CI持续集成 全局配置 系统管理->全局工具配置,配置Git,JDK和Maven 1)解压maven到当前目录 tar zxf apache-maven-3.5.4-bin.ta ...

  7. 第五篇:Python函数基础篇

    本篇介绍什么是函数.函数的特性.函数的定义.函数的调用.以及函数的参数.以及关于全局变量和局部变量的使用等等. 一.什么是函数: 函数是最基本的一种代码抽象方式,为了实现某种特定的功能而组织的带名字的 ...

  8. 全球唯一标识符 System.Guid.NewGuid().ToString()

    System.Guid.NewGuid().ToString(); //ToString() 为 null 或空字符串 (""),则使用"D". 结果:8209 ...

  9. adb命令之解锁打卡

    adb devicesadb shell input keyevent 26                       按手机电源键adb shell input swipe 400 1080 40 ...

  10. xenserver 添加和卸载硬盘

                最近在浪潮服务器上安了xenserver系统,创建虚拟机,没注意磁盘超负载就重启了服务导致各种坑,一言难尽,忧伤逆流成河啊,所以准备将各种操作整理总结记录下,持续更新ing~~ ...