在将身份类和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);
}
我不熟悉异步和等待,所以我认为删除它就可以了,我错了。
我正在使用JQuery Ajax来调用控制器中的方法,而控制器中的方法就是这个
[HttpPost]
public void AddNewAdministrator(NewAdministrator administrator)
{
#region Initialization
OAD = new OQOEAdminstrationDAL();
#endregion
OAD.CreateNewAdministrator(administrator);
}
CreateNewAdministrator(管理员)就是这个
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 result = UserManager.CreateAsync(user,model.Password);
这个方法,我会检查数据库,它不会填充我从
传递的内容var user = new ApplicationUser {UserName = model.UserName,Email = model.Email,AccountNumber = model.AccountNumber};
所以我得出的结论是,除非我的方法中有这个,否则表格不会被填充
var result = UserManager.CreateAsync(user,model.Password);
所以我添加了它,当我单步执行代码时,当我得到var结果时会抛出错误,这里是错误的堆栈跟踪
System.IO.FileLoadException was unhandled by user code
的HResult = -2146234304 消息=无法加载文件或程序集&#39; Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35&#39;或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040) 来源= AdvanceWareDAL FileName = Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 FusionLog ====预绑定状态信息=== 日志:DisplayName = Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 (完全指定的) 日志:Appbase = file:/// C:/ AdvanceWareRevision / AdvanceWareMVC / 日志:初始PrivatePath = C:\ AdvanceWareRevision \ AdvanceWareMVC \ bin
日志:此绑定在默认加载上下文中启动。 日志:使用应用程序配置文件:C:\ AdvanceWareRevision \ AdvanceWareMVC \ web.config 日志:使用主机配置文件:C:\ Users \ Simon \ Documents \ IISExpress \ config \ aspnet.config 日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config中的计算机配置文件。 日志:政策后参考:Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,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。 警告:比较程序集名称导致不匹配:构建号 错误:无法完成程序集的设置(hr = 0x80131040)。探测终止。
堆栈跟踪:
在AdvanceWareDAL.Authentication.AccountController.get_UserManager()
在AdvancedWareDAL.Authentication.AccountController.Register(RegisterAdministrator模型)的c:\ AdvanceWareRevision \ AdvanceWareDAL \ Authentication \ AccountController.cs:第201行
在AdvancedWareDAL.OQOEAdminstrationDAL.CreateNewAdministrator(NewAdministrator administrator)的c:\ AdvanceWareRevision \ AdvanceWareDAL \ OQOEAdminstrationDAL.cs:第45行
在AdvancedWareMVC.Controllers.AdministrationController.AddNewAdministrator(NewAdministrator administrator)中的c:\ AdvanceWareRevision \ AdvanceWareMVC \ Controllers \ AdministrationController.cs:第45行
在lambda_method(Closure,ControllerBase,Object [])
在System.Web.Mvc.ActionMethodDispatcher。&lt;&gt; c__DisplayClass1.b__0(ControllerBase controller,Object []参数)
在System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object []参数)
在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2个参数)
在System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()
在System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState)
在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.End()
在System.Web.Mvc.Async.AsyncResultWrapper.End [TResult](IAsyncResult asyncResult,Object tag)
在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()
在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters。&lt;&gt; c__DisplayClass46.b__3f()
的InnerException:
我之所以将Identity类和AccountController添加到ClassLibrary是因为我想将它与主项目分开,并且假设这样做比使用滚动更容易&#34;手动滚动&#34;代码比执行此操作。
我在想,如果我能够在ClassLibrary中添加一个App_Start文件夹和一个配置文件,我可以加载堆栈跟踪正在查找的内容,从我读过的内容看,ClassLibrary并不像那样工作。 我可以编写自己的方法来填充AspNetUsers表,但那会破坏使用Identity类的目的。
所以我有点坚持如何解决所有问题所以我可以利用我的ClassLibrary中的Identity框架。
答案 0 :(得分:1)
您似乎正在使用Microsoft.Owin.Host.SystemWeb,它使基于OWIN的应用程序能够使用ASP.NET请求管道在IIS上运行,而这不适用于类库强>
确保您没有将OWIN身份验证管理器与代码一起移动。您可以将与存储相关的类和代码移动到类库中,并将身份验证管道保留在Web应用程序中。
This文章解释了ASP.NET身份存储提供程序,在您的情况下可以将其移动到您的类库中,
答案 1 :(得分:0)
不确定这是否可以解决您的问题,但它可能有所帮助。 在我看来,这是由.NET使用的引用引起的问题。 尝试再次加载它们并重建。如果错误仍然存在,则尝试查找并加载先前项目中使用的引用。如果这有助于您,请告诉我:)。