2013-08-23 12 views
8

Ich habe ein Problem mit einem ActionFilterAttriute, das nicht richtig umgeleitet wird. Ich kenne die komplette Codebase nicht, aber ich habe genug gesehen, um nicht zu verstehen, was vor sich geht.ActionFilterAttribute nicht umleiten

public class ResolveApplicationRedirectAttribute : ActionFilterAttribute 
{ 
    //some variables 
    private ActionExecutingContext _filterContext; 

    protected string ApplicationRedirectUrl 
    { 
     get { return ConfigurationManager.AppSettings["ApplicationRedirectUrl"]; } 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _filterContext = filterContext; 

     //a lot of logic that decide if we should redirect or not 

     //I added this after the other logic to make it always redirect regardless of what happens inside the logic above 
     _filterContext.Result = new RedirectResult(ApplicationRedirectResult); 
    } 
} 

[ResolveApplicationRedirect] 
public ActionResult Index(CrmQueryStringParameters crmParameters){ 
    //some logic 
} 

wird durch ein paar Anfragen in kurzer Zeit, die Index-Methode endet Hit Dies funktioniert in der Regel, aber wenn die Anwendung:

Um den Code zu simplyfy habe ich die irrelevanten Teile entfernt aufgerufen, und explodiert, weil der View einige Daten fehlen (wir wissen, dass Daten fehlen. Deshalb wollen wir umleiten).

Aber jetzt, wenn ich die _filterContext.Result = new RedirectResult(ApplicationRedirectResult) als letzte Zeile der OnActionExecuting Methode hinzugefügt habe, wie ist es möglich, dass es noch meine Action-Methode aufruft?

Gibt es irgendwelche Bugs/Corner Cases/irgendetwas anderes, die dazu führen können, dass MVC die RedirectResult ignoriert, die ich in die filterContext gesetzt habe und die Aktionsmethode trotzdem abfeuern?

Alles, was speziell in der Logik von OnActionExecuting sein kann, kann Probleme verursachen, auch wenn ich filterContext.Result als letzte Zeile festlegen. Alle Ausnahmen innerhalb des Attributs sollten es einfach in die Luft jagen und das Attribut nicht überspringen und die Action-Methode aufrufen.

Jede Hilfe, um mich in die richtige Richtung zu zeigen, würde hier geschätzt werden.

+0

Wenn Sie sich den Quellcode für MVC ansehen, sehen Sie eine Methode InvokeActionMethodFilter, die OnActionExecuting auf Ihrem Filter ausführt und den ActionExecutingContext übergibt. Wenn es mit einem Nicht-Null-Ergebniswert zurückgegeben wird, gibt es einen ActionExecutedContext zurück und überspringt den Aufruf Ihrer Aktion. In gewisser Weise sollte das, was Sie sehen, nicht möglich sein. Das einzige Problem könnte also ein Nullwert für Result sein. Wenn Sie alle Ihre Logik kommentieren und nur die letzte Zeile behalten, funktioniert Ihre Weiterleitung dann? –

Antwort

0

Ich fand das Problem endlich. Es wurde mit der Klassenvariablen _filterContext verwandt.

Das Problem ist, dass MVC nicht eine neue Instanz des Filters für jede Anfrage erstellt, wodurch mehrere Anfragen die gleiche Instanz des Attributs teilen.

Weitere Einzelheiten finden Sie in der Liste der brechenden Änderungen in the MVC3 release notes.

0

+1 für Woutters Ergebnis. Angesichts des Codes, den Sie gezeigt haben, sollte es nicht möglich sein, die von Ihnen beschriebenen Ergebnisse zu erzielen. Vielleicht gibt // magic logic here eine Null zurück _filterContext.Result?