首页 > 解决方案 > UNITY MVC 容器在具有授权属性的帐户控制器中捕获 NULL 异常

问题描述

我有个问题。我是新手UnityContainer。我使用 Unity 进行 DI。

我的 ASP.NET MVC Web 应用程序有一个AccountController(由 ASP.NET Identity 自动生成)具有该[Authorize]属性。

[Authorize]
public class AccountController : Controller
{
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;

    [InjectionConstructor]
    public AccountController() { }

    public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
    {
        UserManager = userManager;
        SignInManager = signInManager;
    }

    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }

    public ApplicationUserManager UserManager
    {
        get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        private set { _userManager = value; }
    }

    [AllowAnonymous]
    public ActionResult Login(string returnUrl) { ViewBag.returnUrl = returnUrl; return View(); }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel model) 
    {
       //My code
       return RedictToAction("Index","Home");
    }
   
    //Some Methods
    
}

查看我的完整代码:我的简单 AccountController 由 VS - Identity 自动生成

我尝试为AccountController.

我的代码在App_Start > UnityConfig.cs

public static class UnityConfig
{
    public static IUnityContainer Container;

    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        //register all my components with the container here            

        container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
        container.RegisterType<DbContext, ApplicationDbContext>(new PerRequestLifetimeManager());
        container.RegisterType<UserManager<ApplicationUser>>();
        container.RegisterType<ApplicationUserManager>();
        container.RegisterType<AccountController>(new InjectionConstructor());            
        
        DependencyResolver.SetResolver(new Unity.AspNet.Mvc.UnityDependencyResolver(container));
    }
}

我的 UnityConfig

当我开始运行应用程序并在 上调用方法时AccountController,我收到以下错误消息:

值不能为空。参数名称:容器

请点击以下链接查看错误信息:

异常被抛出。Url 的 localhost:xxxxx/Account/Login

我发现当我删除[Authorize][ValidateAntiForgeryToken]属性时,一切正常。

但是当我添加[Authorize][ValidateAntiForgeryToken]属性时,抛出了异常。

请帮我修复它。

对此,我真的非常感激!

标签: c#asp.net-mvcwebasp.net-identityunity-container

解决方案


我找到了我的答案。在Application_Start

protected void Application_Start()
{
       AreaRegistration.RegisterAllAreas();
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
       RouteConfig.RegisterRoutes(RouteTable.Routes);
       BundleConfig.RegisterBundles(BundleTable.Bundles);
       UnityConfig.RegisterComponents(); //<--- Incorrect
}

我调整了它

protected void Application_Start()
{
       AreaRegistration.RegisterAllAreas();
       UnityConfig.RegisterComponents(); //<========
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
       RouteConfig.RegisterRoutes(RouteTable.Routes);
       BundleConfig.RegisterBundles(BundleTable.Bundles);
}

推荐阅读