.NET Core 管道过滤器扩展

            if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

验证是否为开发环境     是就正常报错   否则跳转到错误页

app.UseStaticFiles();

验证当前请求是否存在物理物件   存在直接返回   不走MVC路由

以前的管道模型  根据请求传递的控制器 方法  先实例化控制器  然后在invoke    在invoke中 执行管道中的20来个事件

在.NET Core中  先进入授权验证等一系列操作   成功在实例化控制器等后续操作

.NET Core 管道过滤器扩展

扩展过滤器

都需要继承Attribute     接口可以选择继承IActionFilter  IResourceFilter  IResultFilter

  继承IActionFilters的过滤器在管道中的Action Filters环节触发

  继承IResultFilter 的过滤器在管道中的IResultFilter 环节触发(自己在application层写的执行完毕后触发)

  继承ResourceFilters的过滤器其在管道的ResourceFilters环节触发   (适合做一些短路  比如缓存  这里存在就直接返回 )

三种过滤器执行的前后顺序  ResourceFilters入→IActionFilters入→IActionFilters出→IResultFilter入→IResultFilter出→ResourceFilters出

只有ResourceFilters在数据模型绑定之前   其他的都在数据模型绑定之后    异常处理过滤需要在进入数据模型绑定才出发

这些过滤器的 context.Result就是返回的数据    进入下一环节之前  会进行验证context.Result中的数据是否为null   如果不为null  就直接返回了

局部过来:在方法上直接直接加上过滤器

全局过滤: 往容器中添加过滤器

        public IServiceProvider ConfigureServices(IServiceCollection services)
{
// MVC
services.AddMvc(
options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName));
options.Filters.Add(typeof(CustomActionFilterAttribute));
}
);

依赖注入也是在IServiceCollection中实现的

1. 继承IActionFilter过滤器

    public class CustomActionFilterAttribute: Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("ActionFilter 之前!");
//logger.Info("ActionFilter Executing!");
}
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("ActionFilter 之后!");
//logger.Info("ActionFilter Executed!");
}
}

2.继承ResourceFilters过滤器

    public class CustomResourceFilterAttribute : Attribute, IResourceFilter
{
private static readonly Dictionary<string, object> _Cache = new Dictionary<string, object>();
private string _cacheKey; public void OnResourceExecuting(ResourceExecutingContext context)
{
_cacheKey = context.HttpContext.Request.Path.ToString();
if (_Cache.ContainsKey(_cacheKey))
{
var cachedValue = _Cache[_cacheKey] as ViewResult;
if (cachedValue != null)
{
context.Result = cachedValue;
}
}
} public void OnResourceExecuted(ResourceExecutedContext context)
{
if (!String.IsNullOrEmpty(_cacheKey) &&
!_Cache.ContainsKey(_cacheKey))
{
var result = context.Result as ViewResult;
if (result != null)
{
_Cache.Add(_cacheKey, result);
}
}
}
}

********************************

扩展中间件  Middleware   Map适合做一些分发    根据请求条件指定中间件

app.Map("/Jcb",MapTest)    请求到这里就不会继续往后面执行

app.MapWhen()   跟上面的一样  更加灵活  但是都没有回头路  当前中间件就直接结束并返回

UseWhen()  执行里面的后还继续往后面执行中间件

上一篇:20155326《网路对抗》Exp8 WEB基础实践


下一篇:H5 Js图片转base64编码