MVC ASP.NET中HttpContext.Current和Controller.Context的区别

Ton*_*onE 71 asp.net-mvc

我正在研究MVC ASP .NET应用程序.我对两者都比较新.

在控制器中,我试图获取当前登录用户,为此似乎有两种方法:

System.Web.HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

要么

HttpContext.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

这些有什么区别?据我所知,在MVC框架中,控制器将当前的HttpContext存储为属性,因此这些方法是相同的.那是对的吗?

Luc*_*ero 90

是的,它们通常是相同的.但是,如果你正在使用其他线程,它们将不会; System.Web.HttpContext.Current是线程的.

  • 只是为了澄清你的优秀答案:ThreadStatic意味着该值与线程相关联.也就是说,在任何其他线程中,您都无法访问HttpContext.Current. (38认同)
  • 另外,不要忘记控制器上还有一个ControllerContext,它包含了像RouteData集合这样的MVC特定信息. (6认同)
  • 更深入的HttpContext和线程http://odetocode.com/articles/112.aspx (5认同)

Lev*_*evi 25

控制器提供的上下文(不是静态HttpContext.Current)是可模拟的.如果您对单元测试代码感兴趣,那么创建一个模拟ControllerContext并在Controller上设置它比通过HttpContext.Current要容易得多.否则,ControllerContext.HttpContext指向与HttpContext.Current相同的数据.