前言
一个新的Net Core项目,如果要对外进行开放的接口的话,我们肯定是有做一个自己的一个接口校验信息,进行接口验签处理,要是不满足我们的加密格式,我们肯定是不允许进行进行访问的 ,所以这个时候就用到了拦截器进行处理。
我们不可能在每个接口都从新写一个验证方式吧,这样可不灵活的,接下来就是讲一下我对拦截器的一些看法。
详细介绍
ActionFilter
简介
使用过MVC的朋友门应该会比较熟悉这个,在Framework使用中 这个个更多的是特性的使用,而在Net Core使用的时候就不一样了,接下来我来说一说
使用,示例,说明
我们先讲使用的方式,Net Core使用都需要在启动文件进行一个配置(Startup.cs)
public void ConfigureServices(IServiceCollection services)
{
//添加对应的拦截器信息
services.AddMvc(options =>
{
options.Filters.Add<ActionFilter>();
});
//.....
}
/// <summary>
/// MVC中的Action过滤器 这个类的位置可以按照你的规则放
/// 这个地方进行数据格式的校验 一般检查参数是否规范
/// </summary>
public class ActionFilter : IActionFilter
{
/// <summary>
/// 验证对应的信息
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
//校验接口参数是否有传递
if (!context.ModelState.IsValid)
{
ActionResult result = new ActionResult() { code = 0, msg="Action验证失败" };
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
result.msg += error.ErrorMessage + "|";
}
}
context.Result = new JsonResult(result);
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
ApiAuthorizeFilter
简介
一般是用来处理WebApi接口的,校验相关的token是否正确,以及根据token获取或者存储用户信息,用户唯一
示例,使用
//使用方式类似anction拦截器
public void ConfigureServices(IServiceCollection services)
{
//添加对应的拦截器信息
services.AddMvc(options =>
{
options.Filters.Add<ApiAuthorizeFilter>();
});
//.....
}
/// <summary>
/// Api接口拦截器
/// </summary>
public class CUMSApiAuthorizeFilter : IAuthorizationFilter
{
public CUMSApiAuthorizeFilter()
{
}
/// <summary>
/// 只判断参数是否正确,不判断权限
/// </summary>
/// <param name="context"></param>
public void OnAuthorization(AuthorizationFilterContext context)
{
#region 校验参数是否正确
ApiResult result = new ApiResult() { code = 0, msg = "Api验证失败" };
#region API接口校验 校验信息 校验token,或者用户id
//根据对应的信息进行一个判断处理 逻辑暂时不写了
#endregion
return;
#endregion
}
}
中间件
说明
中间件的用法可以有很多种,我个人感觉这个换成一种说法会比较容易理解,相当于Framework中的通道模型(HttpModel),期间可以完成的事情就有很多了。
比如 URL伪静态处理啊,搞一个谁也看不懂 的规则(手动笑哭)
代码展示
//使用方式不一样了 添加的位置要改变了
/// <summary>
/// 中间件启动类
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//拦截器中间件
app.UseMiddleware<ValidateMiddleware>();
}
/// <summary>
/// 中间件校验信息 类似Framework中的HttpModel 管道模型
/// </summary>
public class ValidateMiddleware
{
private readonly RequestDelegate _nextDelegate;
/// <summary>
///
/// </summary>
/// <param name="nextDelegate"></param>
public ValidateMiddleware(RequestDelegate nextDelegate)
{
_nextDelegate = nextDelegate;
}
/// <summary>
/// 处理对应的参数信息 进行拦截校验信息
/// </summary>
/// <param name="httpContext">拦截HTTP请求处理</param>
/// <returns></returns>
public async Task Invoke(HttpContext httpContext)
{
//这个地方可以获取到HttpContext 这个时候 你想干啥都可以 做自己想要实现的功能就好了
//返回执行下一个中间件的处理 不能去掉 去掉参数就会丢失
await _nextDelegate.Invoke(httpContext);
}
}
尾语
慢慢的参与进去发现,Net Core 除了配置起来会麻烦一些,使用的时候,整体是和MVC相似的 ,有些原理是一样的。
但是Net Core用起来就会很舒服,好像是自我感觉的呢。