ControllerBase中的HttpContext.Current.User为null(asp.net mvc)

tak*_*shi 8 authentication asp.net-mvc controller

ControllerBase在ASP.NET MVC应用程序中有一个类.其他控制器继承自ControllerBase.

我想进入HttpContext.User.Identity.Name,但HttpContextnull.怎么了?

public ControllerBase()
        {
            var dataManager=new DataManager();
            if (HttpContext.User.Identity.IsAuthenticated) // throws error
            {                    
                ViewData["assets"] = ud.BalanceFreeze + ud.Balance + ud.BalanceRealty;
                ViewData["onaccount"] = ud.Balance;
                ViewData["pending"] = ud.BalanceFreeze;
                ViewData["inrealty"] = ud.BalanceRealty;
            }
Run Code Online (Sandbox Code Playgroud)

Nik*_*Nik 11

尝试在ControllerBase中将此代码添加到此事件:

protected override void Initialize(RequestContext requestContext){

}
Run Code Online (Sandbox Code Playgroud)

  • 我发现我需要在这个覆盖中调用base.Initialize(requestContext),否则我将在稍后获得NullReferenceException. (2认同)

Str*_*ior 5

在ASP.NET设置HttpContext之前构造您的控制器.就像Nik说的那样,你需要把这个代码放在你班级的重写方法中.

我还要指出,直接依赖于HttpContext将无法在任何扩展此类的控制器上执行单元测试.这就是为什么类中的许多方法(如Execute方法)ControllerBase将a RequestContext作为参数.你可以说:

protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
    var currentUser = requestContext.HttpContext.User;
    ...
}
Run Code Online (Sandbox Code Playgroud)

...这使得可以使用"假"上下文创建和执行控制器以进行单元测试.