【问题标题】:Errors after moving ASP.NET Identity classes to a Class Library将 ASP.NET 标识类移动到类库后的错误
【发布时间】:2015-10-24 16:14:37
【问题描述】:

在将身份类和 AccountController 复制到 ClassLibrary 后,我遇到了一个问题,由于异步方法,我不得不更改一些代码。现在这就是我的 AccountController 中的内容

原来的Register方法是这样的

public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email, AccountNumber = model.AccountNumber };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                // Send an email with this link
                // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我改变了那个方法,现在看起来像这样

public void Register(RegisterAdministrator model)
    {
        var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, AccountNumber = model.AccountNumber };
        var result = UserManager.CreateAsync(user, model.Password);
    }

我对 async 和 await 不熟悉,所以我认为删除它就可以了,但我错了。

我正在使用 JQuery Ajax 在我的控制器中调用一个方法,而控制器中的方法是这样的

[HttpPost]
public void AddNewAdministrator(NewAdministrator administrator)
    {
        #region Initialization

        OAD = new OQOEAdminstrationDAL();

        #endregion

        OAD.CreateNewAdministrator(administrator);
    }

CreateNewAdministrator(administrator)是这个

public void CreateNewAdministrator(NewAdministrator administrator)
    {
        #region Initialization

        RegisterAdministrator rva = new RegisterAdministrator();

        rva.UserName = administrator.administratorName;
        rva.Email = administrator.administratorEmail;
        rva.Password = administrator.administratorPassword;

        #endregion

        AccountController.Register(rva);
    }

那么Register方法就是我上面展示的那个,这里又是一个

public void Register(RegisterAdministrator model)
    {
        var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, AccountNumber = model.AccountNumber };
        var result = UserManager.CreateAsync(user, model.Password);
    }

在我添加之前

var 结果 = UserManager.CreateAsync(user, model.Password);

对于这种方法,我会检查数据库,它不会填充我从该方法传递的内容

var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, AccountNumber = model.AccountNumber };

所以我得出的结论是,除非我的方法中有这个,否则表格不会被填充

var 结果 = UserManager.CreateAsync(user, model.Password);

所以我添加了它,当我单步执行代码时,当我得到 var 结果时,会抛出一个错误,这是错误的堆栈跟踪

System.IO.FileLoadException was unhandled by user code

HResult=-2146234304 消息=无法加载文件或程序集“Microsoft.Owin.Host.SystemWeb,版本=3.0.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) 来源=AdvanceWareDAL 文件名=Microsoft.Owin.Host.SystemWeb,版本=3.0.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35 FusionLog==== 预绑定状态信息=== 日志:DisplayName = Microsoft.Owin.Host.SystemWeb,版本 = 3.0.1.0,文化 = 中性,PublicKeyToken = 31bf3856ad364e35 (完全指定) 日志:Appbase = file:///C:/AdvanceWareRevision/AdvanceWareMVC/ 日志:初始 PrivatePath = C:\AdvanceWareRevision\AdvanceWareMVC\bin

调用程序集:AdvanceWareDAL,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。

LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:C:\AdvanceWareRevision\AdvanceWareMVC\web.config LOG:使用主机配置文件:C:\Users\Simon\Documents\IISExpress\config\aspnet.config LOG:使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 中的机器配置文件。 日志:后策略参考:Microsoft.Owin.Host.SystemWeb,版本=3.0.1.0,文化=中性,PublicKeyToken=31bf3856ad364e35 日志:正在尝试下载新的 URL 文件:///C:/Users/Simon/AppData/Local/Temp/Temporary ASP.NET Files/root/d8b6b64c/32bc7a85/Microsoft.Owin.Host.SystemWeb.DLL。 日志:尝试下载新的 URL 文件:///C:/Users/Simon/AppData/Local/Temp/Temporary ASP.NET Files/root/d8b6b64c/32bc7a85/Microsoft.Owin.Host.SystemWeb/Microsoft.Owin.Host .SystemWeb.DLL。 日志:正在尝试下载新的 URL 文件:///C:/AdvanceWareRevision/AdvanceWareMVC/bin/Microsoft.Owin.Host.SystemWeb.DLL。 警告:比较程序集名称导致不匹配:内部版本号 ERR:无法完成程序集的设置(hr = 0x80131040)。探测终止。

堆栈跟踪: 在 AdvanceWareDAL.Authentication.AccountController.get_UserManager() 在 c:\AdvanceWareRevision\AdvanceWareDAL\Authentication\AccountController.cs:line 201 中的 AdvanceWareDAL.Authentication.AccountController.Register(RegisterAdministrator 模型) 在 c:\AdvanceWareRevision\AdvanceWareDAL\OQOEAdminstrationDAL.cs:line 45 中的 AdvanceWareDAL.OQOEAdminstrationDAL.CreateNewAdministrator(NewAdministrator 管理员) 在 c:\AdvanceWareRevision\AdvanceWareMVC\Controllers\AdministrationController.cs:line 45 中的 AdvanceWareMVC.Controllers.AdministrationController.AddNewAdministrator(NewAdministrator 管理员) 在 lambda_method(闭包,ControllerBase,对象 []) 在 System.Web.Mvc.ActionMethodDispatcher.c__DisplayClass1.b__0(ControllerBase 控制器,Object[] 参数) 在 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 参数) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState) 在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase1.End() 在 System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult,对象标记) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.c__DisplayClass46.b__3f() 内部异常:

我将 Identity 类和 AccountController 添加到 ClassLibrary 的原因是因为我想让它与主项目分开,并假设这样做比“手动滚动”代码更容易这样做。

我在想,如果我能够在 ClassLibrary 中添加一个 App_Start 文件夹和一个配置文件,我可以加载堆栈跟踪正在寻找的内容,从我所阅读的内容来看,ClassLibrary 不会那样工作。 我可以编写自己的方法来填充 AspNetUsers 表,但这会破坏使用 Identity 类的目的。

所以我有点纠结于如何解决所有这些问题,这样我就可以利用我的 ClassLibrary 中的 Identity 框架。

【问题讨论】:

  • 你正在使用异步方法,你必须使用await 或者你必须.Wait() 结果。现在,您的“结果”包含一个任务,而不是方法调用的结果,并且在等待(或运行)之前,用户永远不会登录或注册。我建议将其改回原始代码所具有的模板,并拿起一本关于 async/await 的书。
  • @RonBeyer,我认为你是对的。我对异步/等待的了解不够。我认为移动所有东西时一切都会有所相同。

标签: c# asp.net-mvc entity-framework asp.net-identity


【解决方案1】:

您似乎正在使用 Microsoft.Owin.Host.SystemWeb,它使基于 OWIN 的应用程序能够使用 ASP.NET 请求管道在 IIS 上运行这在类库中不起作用强>。

确保您没有将 OWIN 身份验证管理器与您的代码一起移动。您可以将存储相关的类和代码移动到类库中,并将身份验证管道保留在您的 Web 应用程序中。

This 文章解释了 ASP.NET 身份存储提供程序,在您的情况下可以将其移动到您的类库,,,

【讨论】:

    【解决方案2】:

    不确定这是否能解决您的问题,但它可能会有所帮助。 在我看来,这是由 .NET 使用的引用引起的问题。 尝试再次加载它们并重建。如果错误仍然存​​在,请尝试查找并加载您之前项目中使用的引用。让我知道这是否对您有帮助:)

    【讨论】:

    • 我尝试了你提到的,但仍然得到同样的错误,我查看了我从主项目和类库中的引用,都是一样的。
    • 您是否尝试过将旧文件中的引用重新添加到新文件中?或者只是检查他们的版本看起来很像?
    • 我查看了引用并确保从主项目到类库的引用相同。我打开了 nuget 并更新了类库包。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2013-07-19
    • 2015-12-24
    相关资源
    最近更新 更多