2015-05-13 15 views
12

AccountController.cs zawiera klasę AccountController. Metoda Login dla tej klasy kończy się niepowodzeniem. W szczególności,SignInManager.PasswordSignInAsync Wyrzucanie wyjątku obiektu zerowego

var result = await SignInManager.PasswordSignInAsync(
    model.Email, model.Password, model.RememberMe, shouldLockout: true); 

w sposób Login rzuca System.NullReferenceException.

Sprawdziłem, że model.Email, model.Password i model.RememberMe nie są puste. Następnym krokiem jest przekopanie się na SignInManager, który jest obiektem na AccountController typu ApplicationSignInManager. get accessor dla SignInManager, która jest wywoływana z wiersza powyżej,

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

którą przepisał jak

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

do debugowania i upewnij się, że get accessor nie wracał null. Nie wraca null. To mówi mi, że coś wymaganego wewnątrz PasswordSignInAsync jest null.

Przyjrzałem się the source z PasswordSignInAsync i dobrze radzi sobie z ochroną przed zerowymi błędami referencyjnymi. Pogłębiłem się również w metodach wywoływanych przez PasswordSignInAsync. Po prostu nie widzę, co mogłoby rzucić zerowy błąd odniesienia.

Ślad stosu z tego błędu jest dość zagadkowy i nie widzę w nim nic, co mogłoby pomóc. Ale ze względu na kompletność, tutaj jest:

[NullReferenceException: Object reference not set to an instance of an object.] 
Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +2112 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +123 
Microsoft.AspNet.Identity.Owin.<SignInAsync>d__2.MoveNext() +408 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 
Microsoft.AspNet.Identity.CultureAwaiter.GetResult() +63 
Microsoft.AspNet.Identity.Owin.<SignInOrTwoFactor>d__23.MoveNext() +2055 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +68 
Microsoft.AspNet.Identity.Owin.<PasswordSignInAsync>d__29.MoveNext() +1828 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
ApexRemingtonExternal.Controllers.<Login>d__2.MoveNext() in c:\Users\me\sc\project\Controllers\AccountController.cs:91 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 
System.Threading.Tasks.TaskHelpersExtensions.ThrowIfFaulted(Task task) +61 
System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +114 
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +66 
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49 
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +117 
System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +323 
System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44 
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72 
System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185 
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44 
System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +39 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651688 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

będę wdzięczny za każdą pomoc lub wskazówki na temat tego, co może być przyczyną tego NullReferenceException. Proszę dać mi znać, czy mogę dodać więcej szczegółów (lub usunąć niektóre (lol!)). To pierwszy projekt MVC mojej i mojej firmy, więc jestem pewien, że coś zepsułem.

Edit

Dodam, że odpędza się Entity Framework z projektu na rzecz LINQ to SQL, który jest co możemy polegać na we wszystkich naszych innych projektów. Oznacza to, że musiałem wdrożyć własne wersje IUserStore, IRoleStore itp.

Odpowiedz

7

Jak zwykle moim zdaniem, problem nie miał nic wspólnego z objawami. Oczywiście SignInManager.PasswordSignInAsync nie jest zepsuty. To był mój kod, który został złamany. To sprawia, że ​​ta kwestia jest dyskusyjna, co skłania mnie do usunięcia pytania.

Istnieje jednak lekcja, której należy się nauczyć. W moim przypadku było to słowo kluczowe as. Po opuszczeniu EF, jak wspomniano w edycji, musiałem dostarczyć implementacje kilku interfejsów. Jedną z metod, którą musiałem dostarczyć, jest GetRolesAsync, która zwraca Task<IList<String>> (w moim przypadku). Nigdy nie miałem do czynienia z IList. Okazuje się, że potrzebuję as. Ale próbowałem rzucić IQueryable na IList, który nie działa. Wynik: as po prostu zwraca null. Dziękujemy, as. To jest przydatne.

Tak. Prawdopodobnie usunę to pytanie.

+2

Nie usuwaj! Właśnie dostałem ten sam błąd, znalazłem to i pomogło mi zrozumieć, że "problem nie miał nic wspólnego z objawami", co zaoszczędziłoby mi sporo czasu. Mój zakończył się jako wyjątek referencyjny o wartości NULL ukryty w wyniku napotkanego wyjątku. –

+0

Hej Jeff, fwiw to różnica między 'as' vs direct cast (zobacz [this] (http://stackoverflow.com/a/132467/1252541)). – shortstuffsushi

9

Czasami (zwłaszcza jeśli aktualizować Microsoft.AspNet.Identity.Owin) można zapomniał dodać linia

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

metody public void ConfigureAuth(IAppBuilder app) w App_Start \ Startup.Auth.cs Po tym to wszystko powinno działa.

Powiązane problemy