ASP.NET C#控制器:如何通过OnResultExecuted存储应用程序对象?
问题解决步骤
1. OnResultExecuted方法的调用问题
OnResultExecuted是ASP.NET MVC控制器生命周期的内置方法,由框架自动触发,不需要你在LoginController的Action中手动调用。它会在Action返回的Result执行完成后自动运行,你只需要在BaseController中正确重写该方法即可。
2. Application对象的存储方式与安全性
你当前的Application["username"] = username;写法语法上可行,但存在严重问题:Application是全局共享存储区,所有网站访客共用该空间,后登录用户的信息会覆盖前一个用户的内容,且明文存储密码属于高危操作,绝对禁止。
正确的处理方式:
- 绝不存储明文密码,验证完成后立即丢弃密码参数
- 若需保存当前登录用户的会话信息,改用Session对象(每个用户独立的会话存储),用法示例:
Session["username"] = username; - 如果确实需要全局存储数据(如统计在线人数),使用Application时必须保证线程安全,用
Application.Lock()和Application.UnLock()包裹操作:
Application.Lock(); Application["globalDataKey"] = value; Application.UnLock();
3. 解决LoginController继承的构造函数错误
MVC框架创建控制器实例时,默认调用无参构造函数。你不需要通过构造函数传递用户名密码——这些参数是在POST请求时才获取到的。
修改BaseController,移除带参数的构造函数,改为无参构造:
public class BaseController : Controller { // 显式定义无参构造函数,供框架实例化控制器 public BaseController() { } protected override void OnResultExecuted(ResultExecutedContext context) { // 可从Session或其他渠道获取用户信息后处理 var username = Session["username"]?.ToString(); if (!string.IsNullOrEmpty(username)) { // 全局存储示例(仅作演示,实际不建议存用户信息到Application) Application.Lock(); Application["latestLoggedInUser"] = username; Application.UnLock(); } base.OnResultExecuted(context); } }
修改后LoginController继承时就不会再报构造函数参数错误。
4. 访问Application对象的方法
在控制器中,直接通过Application["key"]或HttpContext.Application["key"]即可读取存储的内容,示例:
// 在任意Action或控制器方法中读取 var latestUser = Application["latestLoggedInUser"]?.ToString();
注意:读取全局Application数据时,同样要考虑多线程并发场景下的线程安全问题。
修改后的完整代码示例
BaseController
public class BaseController : Controller { public BaseController() { } protected override void OnResultExecuted(ResultExecutedContext context) { var username = Session["username"]?.ToString(); if (!string.IsNullOrEmpty(username)) { Application.Lock(); Application["latestLoggedInUser"] = username; Application.UnLock(); } base.OnResultExecuted(context); } }
LoginController
public class LoginController : BaseController { public ActionResult Login() { return View(); } [HttpPost] public ActionResult LoginPOST(string username, string password) { // 先执行用户名密码验证逻辑(如查询数据库) // 验证通过后,将用户名存入Session Session["username"] = username; // 密码仅用于验证,验证完成后立即丢弃,绝不存储 return View("Login"); } }
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

