.Net Mvc中Filter过滤器需要注意的坑

简介: <p>  啥也不说,先上代码:</p><p>  public class ValidateAttribute : ActionFilterAttribute</p><p>  {</p><p>  private string _Name=null;</p><p>  //Action执行前的过滤器</p><p>  public override void OnActionExecuting(ActionExecutingContext filterContext)</p>

  啥也不说,先上代码:

  public class ValidateAttribute : ActionFilterAttribute

  {

  private string _Name=null;

  //Action执行前的过滤器

  public override void OnActionExecuting(ActionExecutingContext filterContext)

  {

  _Name=filterContext.HttpContext.Request.Form["name"];

  ......

  }

  }

  按我们通常的理解,只要不是static标记的静态变量,每次进入的时候_Name初始值都应该为null对吧,我当初设计时候也是这样想的。

  但是今天多线程下测试发现私有字段_Name第一个线程进入时,_Name被改变、第二个,第三个,第N个线程进入过滤器后,_Name初始值竟然不是Null,已经被前面的线程给改变了,那么只能找问题所在了,下面是我的推断。

  推断

  虽然没有看mvc过滤器的源码,但是个人推测过滤器是以单例的形式在进程中运行,即进程启动时候初始化一个单例,以后所有的线程都公用一个单例,等同于下面的代码。

  public static ValidateAttributeInstance=new ValidateAttribute();

  第一个线程、第二个,第N个线进入时候都是执行。

  ValidateAttributeInstance.OnActionExecuting(filterContext);结论

  在mvc的四种过滤器OnActionExecuting、OnActionExecuted、OnResultExecuting、OnResultExecuted中,如果有字段或属性会在OnActionExecuting方法中发生改变,那么就不能在外部定义,应该定义在内部,如下:

  public class ValidateAttribute : ActionFilterAttribute

  {

  //Action执行前的过滤器

  public override void OnActionExecuting(ActionExecutingContext filterContext)

  {

  string _Name=null; //定义到内部

  _Name=filterContext.HttpContext.Request.Form["name"];

  ......

  }

  }

  以上是本人的踩坑经验总结,希望对大家有帮助。

  如果有兴趣的朋友自己检验一下,在代码中获取当前对象并添加到集合中,最后再检测一下集合中对象是否相同,就知道是否是单例了。

目录
相关文章
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
99 0
|
2月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
40 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
159 5
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
2月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
|
2月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
51 0
|
2月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
136 0
|
11月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
137 0
|
12月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
136 0
|
12月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
163 0