if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
验证是否为开发环境 是就正常报错 否则跳转到错误页
app.UseStaticFiles();
验证当前请求是否存在物理物件 存在直接返回 不走MVC路由
以前的管道模型 根据请求传递的控制器 方法 先实例化控制器 然后在invoke 在invoke中 执行管道中的20来个事件
在.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() 执行里面的后还继续往后面执行中间件