2017-07-18 2 views
3

Ich habe ein Standardformular mit Html.BeginForm, die Beiträge zu einem Asynchron-Aktion in einem Controller. Es sieht wie folgt aus (dies ein Umriss ist, nicht der eigentliche Code):ASP.NET MVC POST auf unbestimmte Zeit auf dem ersten Versuch warten

[HttpPost] 
    public async Task<ActionResult> Index(UserCreds creds) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       var user = await loginRep.Login(creds.Username, creds.Password); 

       if (user != null) 
       { 
        _context.SetAuthenticationToken(user); 

        return RedirectToAction("Index", "Landing"); 
       } 
       else 
       { 
        ModelState.AddModelError("", "Login failed."); 
       } 
      } 
      else 
      { 
       _logger.Debug(string.Format("User failed authentication.")); 
      } 

     } 
     catch (Exception ex) 
     { 
      throw new HttpException(500, string.Format("An error occured during the execution of the action {0} from Controller {1}", "Index", "Login"), ex); 
     } 

     return View(); 
    } 

von der Form zum ersten Mal vorlegt, wird der Browser auf unbestimmte Zeit auf eine Antwort warten, auch wenn man mit dem Schritt sehen Debugger, dass die RedirectToAction erreicht ist. Wenn man dann die Anfrage im Browser stoppt und einfach erneut absendet, passiert die Weiterleitung. Alle nachfolgenden Anmeldeversuche werden ebenfalls erfolgreich umgeleitet. Das Authentifizierungstoken wird während dieses ersten Versuchs ebenfalls nicht gesetzt.

Das hat wahrscheinlich etwas mit Delegierten Nutzung innerhalb loginRep.Login zu tun. Inside tut es schließlich so etwas:

Versteht jemand, was passiert? Wenn es sich um einen Deadlock handelt, hätte ich nicht erwartet, dass der Debugger die Umleitung erreicht, und ich hätte auch nicht erwartet, dass die Anmeldung für alle anderen Versuche als die erste funktioniert.

Beachten Sie die Form beim ersten Mal nicht funktioniert, wenn man eine Login-Anfrage nur überspringt das Senden und nur hart codieren, was eine erfolgreiche Antwort aussehen würde.

+1

Gibt es etwas (vielleicht einen Einstellungsanbieter oder ähnliches), die nur auf dem ersten Aufruf initialisiert wird, die mit dem asynchronen Methode ist nicht schön zu spielen? – Porschiey

+0

Unsicher. Die Login-Antwort funktioniert jedoch das erste Mal. Ich habe vergessen zu erwähnen, dass das Projekt ursprünglich MVC 2.0 war und dann zu MVC 5.0 migriert wurde. Ich habe mir gedacht, ich sollte vielleicht die Web.config löschen und dann neu machen, um auszuschließen, dass alte Konfigurationen stören. Lass mich das versuchen. –

+0

Das Erstellen einer neuen Web.config erwies sich als zu zeitaufwendig. Wurden der aktuellen Web.config Laufzeitinformationen hinzugefügt, das Problem besteht jedoch weiterhin. –

Antwort

2

Ok. Das Problem wurde behoben. Mit den beiden Codebeispielen, die ich zeigte, war nichts falsch. Der Fehler war bei der Einrichtung meines Sicherheitsdienstes, also war es leider eher spezifisch für diese Anwendung.

Das heißt, geschah das unendliche Warte weil die Application_Error in Global.asax.cs effektiv bestimmte Ausnahmen beim Schlucken wurde. Sobald ich es änderte, um immer auf meine Fehlerseite umzuleiten, egal was, zumindest wurde es sofort auf die Fehlerseite umgeleitet, wenn das Problem passierte, anstatt aus der Sicht des Benutzers zu hängen.

Verwandte Themen