【发布时间】: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