一、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. ubuntu删除文件和文件夹的rm命令

    在Ubuntu中好多文件或文件夹是不能使用右键删除的,因此知道删除文件或文件夹的rm命令显得尤为重要. rm命令的语法 rm [选项] 文件名或文件夹名 rm命令的一些选项 -f.--force 强力 ...

  2. 微软官方 Github 上的 EF 示例项目 EntityFramework.Docs

    项目地址:https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core 谢谢浏览!

  3. NLP第二课(搜索)

    最近压力太大了,持续性修改0注释的代码,变量为阿拉伯数字的代码,压力山大,摆正心态,没有那些bug,还需要我们来做些什么呢?如果一个特别出色的项目,也体现不出来你个人的出色.几句牢骚,我们今天来继续说 ...

  4. Lucene的全文检索学习

    Lucene的官方网站(Apache的顶级项目):http://lucene.apache.org/ 1.什么是Lucene? Lucene 是 apache 软件基金会的一个子项目,由 Doug C ...

  5. 如何查询正在运行的SQL Server agent job

    运行"msdb"系统数据库下的存储过程"dbo.sp_help_job",可以得知现在SQL Server中有多少个正在运行的agent job: USE [m ...

  6. C# 委托补充01

    上一篇文章写了委托的最基本的一些东西,本篇咱们扯扯委托其他的东西. 示例1插件编程 根据对委托的理解,委托可以把一个方法当作参数进行传递,利用这个特性我们可以使用委托,实现插件编程. public d ...

  7. python3.0安装django2.0、xadmin

    1.操作环境 Windows10.python3.8 2.安装django2.0 pip install django==2.0 x   1 pip install django==2.0 3.安装相 ...

  8. 腾讯WeTest&TesterHome深圳线下沙龙

    腾讯官方的一站式品质开放平台「腾讯WeTest」携手知名测试社区「TesterHome」以及3家金融相关企业为我们带来的金融专场. 本次活动内容主要以金融公司的测试落地和测试技术为主,我们希望你是一个 ...

  9. elasticsearch7 配置篇

    学习了这么多,终于开始搭建生产环境了,这一篇主要讲解配置项,以及支持中文分词的ik安装,集群的搭建. 配置项确实挺多的,但把几个常用配置熟悉就好,而且就像elasticsearch官方文档所说,不存在 ...

  10. Google Analytics 学习笔记四 —— GA的Channels划分规则

    一.流量的Source.Medium和Campaigns 1.Source Source或traffic source通常表示流量的来源,一般通过urm_source参数跟踪 在GA中,流量来源的名字 ...