2015-05-13 54 views
12

AccountController.cs ospita la classe AccountController. Il metodo Login di quella classe ha esito negativo. Specificamente,SignInManager.PasswordSignInAsync Eccezione di oggetti nulli Throwing

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

all'interno del metodo Login sta gettando System.NullReferenceException.

Ho verificato che model.Email, model.Password e model.RememberMe non sono nulli. Il passaggio successivo è scavare in SignInManager, che è un oggetto su AccountController di tipo ApplicationSignInManager. Il get di accesso per i SignInManager, che si chiama dalla linea di cui sopra, è stato

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

che ho riscritto come

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

per eseguire il debug e assicurarsi che la funzione di accesso get non stava tornando null. Non sta restituendo null. Questo mi dice che qualcosa richiesto all'interno di PasswordSignInAsync è null.

Ho visto the source di PasswordSignInAsync e fa un buon lavoro di protezione contro errori di riferimento nulli. Ho anche approfondito i metodi chiamati da PasswordSignInAsync. Semplicemente non vedo cosa potrebbe generare un errore di riferimento null.

La traccia di stack dall'errore è piuttosto criptica, e non vedo nulla che aiuti. Ma per amor di completezza, qui è:

[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 

Apprezzerei qualsiasi aiuto o indicazioni su che cosa potrebbe causare questo NullReferenceException. Per favore fatemi sapere se posso aggiungere ulteriori dettagli (o rimuovere alcuni (lol!)). Questo è il primo progetto MVC della mia e della mia azienda, quindi sono sicuro di aver infranto qualcosa.

Modifica

Vorrei aggiungere che ho messo a nudo fuori Entity Framework dal progetto a favore di LINQ to SQL, che è quello che ci affidiamo a tutti i nostri altri progetti. Ciò significa che ho dovuto implementare le mie versioni di IUserStore, IRoleStore, ecc.

risposta

7

Come di solito è il mio solito, il problema non aveva nulla a che fare con il sintomo. Ovviamente SignInManager.PasswordSignInAsync non è rotto. Era il mio codice che era rotto. Ciò rende discutibile questa domanda, che mi chiede di eliminare la domanda.

C'è, tuttavia, una lezione da apprendere qui. Nel mio caso era la parola chiave as. Avendo abbandonato EF, come menzionato nella modifica, ho dovuto fornire implementazioni di diverse interfacce. Un metodo che ho dovuto fornire è GetRolesAsync, che restituisce Task<IList<String>> (nel mio caso). Non ho mai avuto a che fare con IList. Risulta che as è ciò di cui avevo bisogno. Ma stavo cercando di trasmettere un IQueryable a un IList, che non funziona. Il risultato: as restituisce semplicemente null. Grazie, as. È utile

Sì. Probabilmente cancellerò questa domanda.

+2

Non cancellare! Ho appena ottenuto lo stesso errore, ho trovato questo e mi ha aiutato a capire "il problema non aveva nulla a che fare con il sintomo", il che mi avrebbe risparmiato un sacco di tempo. La mia ha finito per essere un'eccezione di riferimento null nascosta dall'eccezione che hai incontrato. –

+0

Ehi Jeff, questa è la differenza tra 'as' vs un cast diretto (vedi [this] (http://stackoverflow.com/a/132467/1252541)). – shortstuffsushi

9

A volte (soprattutto se si aggiorna Microsoft.AspNet.Identity.Owin) è possibile dimenticato di aggiungere la linea

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

al metodo public void ConfigureAuth(IAppBuilder app) in App_Start \ Startup.Auth.cs Dopo aver incluso questo tutto dovrebbe opere.

Problemi correlati