You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:55:21