(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
Übersetzung
Original

Filtern in ASP.NET MVC

In ASP.NET-MVC definieren Controller Aktionsmethoden, die normalerweise in einer 1:1-Beziehung möglichen Benutzerinteraktionen zugeordnet sind, z. B. das Klicken auf einen Link oder Senden eines Formulars. Wenn der Benutzer z. B. auf einen Link klickt, wird eine Anforderung an den festgelegten Controller weitergeleitet, und die entsprechende Aktionsmethode wird aufgerufen.

In bestimmten Fällen muss aber direkt vor oder nach einer Aktionsmethode eine spezielle Logik ausgeführt werden. Um dies zu unterstützen, stellt ASP.NET-MVC Filter bereit. Filter sind benutzerdefinierte Klassen, die eine deklarative und eine programmgesteuerte Möglichkeit zum Einfügen vor und nach einer Aktion auszuführender Anweisungen in Controlleraktionsmethoden zur Verfügung stellen.

Zu diesem Thema steht ein Visual Studio-Projekt mit Quellcode zur Verfügung: Download.

ASP.NET MVC unterstützt die folgenden Aktionsfiltertypen:

  • Autorisierungsfilter. Diese implementieren IAuthorizationFilter und entscheiden bei sicherheitsrelevanten Aspekten, ob eine Aktionsmethode – z. B. zur Authentifizierung oder zum Überprüfen von Eigenschaften der Anforderung – ausgeführt wird. Die Klassen AuthorizeAttribute und RequireHttpsAttribute sind Beispiele für Autorisierungsfilter. Autorisierungsfilter werden vor allen anderen Filtern ausgeführt.

  • Aktionsfilter. Diese implementieren IActionFilter und umschließen die Aktionsmethodenausführung. Die Schnittstelle IActionFilter deklariert zwei Methoden: OnActionExecuting und OnActionExecuted. OnActionExecuting wird vor der Aktionsmethode ausgeführt. OnActionExecuted wird nach der Aktionsmethode ausgeführt und kann zusätzliche Verarbeitungsschritte übernehmen, z. B. das Bereitstellen zusätzlicher Daten für die Aktionsmethode, das Überprüfen des Rückgabewerts oder das Abbrechen der Ausführung der Aktionsmethode.

  • Ergebnisfilter. Diese implementieren IResultFilter und umschließen die Ausführung des Objekts ActionResult. IResultFilter deklariert zwei Methoden: OnResultExecuting und OnResultExecuted. OnResultExecuting wird vor dem Objekt ActionResult ausgeführt. OnResultExecuted wird nach dem Ergebnis ausgeführt und kann zusätzliche Verarbeitungsschritte am Ergebnis vornehmen, z. B. die HTTP-Antwort ändern. Die OutputCacheAttribute-Klasse ist ein Beispiel für einen Ergebnisfilter.

  • Ausnahmefilter. Diese implementieren IExceptionFilter und werden ausgeführt, wenn bei der Ausführung der ASP.NET MVC-Pipeline ein Ausnahmefehler ausgelöst wird. Ausnahmefilter können für Aufgaben wie die Protokollierung oder das Anzeigen einer Fehlerseite verwendet werden. Die HandleErrorAttribute-Klasse ist ein Beispiel für einen Ausnahmefilter.

Die Klasse Controller implementiert alle Filterschnittstellen. Sie können beliebige dieser Filter für einen bestimmten Controller implementieren, indem Sie die On<Filter>-Methode des Controllers überschreiben. Sie können z. B. die Methode OnAuthorization überschreiben. Der einfache Controller im herunterladbaren Beispiel überschreibt jeden dieser Filter und schreibt Diagnoseinformationen, während die Filter ausgeführt werden. Sie können die folgenden On<Filter>-Methoden in einem Controller implementieren:

ASP.NET MVC schließt die folgenden Filter ein, die als Attribute implementiert werden. Die Filter können auf der Ebene der Aktionsmethode, des Controllers oder der Anwendung ausgeführt werden.

  • AuthorizeAttribute . Schränkt den Zugriff durch Authentifizierung und optional durch Autorisierung ein.

  • HandleErrorAttribute . Gibt an, wie eine Ausnahme behandelt wird, die von einer Aktionsmethode ausgelöst wird.

    HinweisHinweis:

    Dieser Filter fängt keine Ausnahmen ab, sofern nicht das Element customErrors in der Datei "Web.config" aktiviert ist.

  • OutputCacheAttribute . Stellt Ausgabezwischenspeicherung bereit.

  • RequireHttpsAttribute . Veranlasst, dass nicht geschützte HTTP-Anforderungen erneut über HTTPS gesendet werden.

Sie können einen Filter auf folgende Arten erstellen:

  • Überschreiben Sie mindestens eine der On<Filter>-Methoden des Controllers.

  • Erstellen Sie eine von ActionFilterAttribute abgeleitete Attributklasse, und weisen Sie das Attribut einem Controller oder einer Aktionsmethode zu.

  • Registrieren Sie einen Filter beim Filteranbieter (Klasse FilterProviders).

  • Registrieren Sie mit der Klasse GlobalFilterCollection einen globalen Filter.

Ein Filter kann die abstrakte Klasse ActionFilterAttribute implementieren. Einige Filter wie AuthorizeAttribute implementieren die Klasse FilterAttribute direkt. Autorisierungsfilter werden immer aufgerufen, bevor die Aktionsmethode ausgeführt wird. Sie werden vor allen anderen Filtertypen aufgerufen. Andere Aktionsfilter, z. B. OutputCacheAttribute, implementieren die abstrakte ActionFilterAttribute-Klasse, mit der der Aktionsfilter entweder vor oder nach der Aktionsmethode ausgeführt werden kann.

Sie können das Filterattribut deklarativ mit Aktionsmethoden oder Controllern verwenden. Wenn das Attribut einen Controller kennzeichnet, gilt der Aktionsfilter für alle Aktionsmethoden in diesem Controller.

Im folgenden Beispiel wird die Standardimplementierung der HomeController-Klasse veranschaulicht. Im Beispiel wird das HandleError-Attribut zum Kennzeichnen des Controllers verwendet. Daher gilt der Filter für alle Aktionsmethoden im Controller.


[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}


Sie können mehrere Filteranbieter registrieren. Filteranbieter werden mit der statischen Eigenschaft Providers registriert. Die Methode GetFilters(ControllerContext, ActionDescriptor) aggregiert die Filter aller Anbieter in einer einzelnen Liste. Anbieter können in jeder Reihenfolge registriert werden. Die Reihenfolge ihrer Registrierung hat keine Auswirkungen auf die Reihenfolge der Filterausführung.

HinweisHinweis:

Filteranbieter sind eine neue Funktion von ASP.NET MVC 3.

Standardmäßig registriert ASP.NET MVC die folgenden Filteranbieter:

Die Methode GetFilters gibt alle IFilterProvider-Instanzen im Service Locator zurück.

Filter werden in der folgenden Reihenfolge ausgeführt:

  1. Autorisierungsfilter

  2. Aktionsfilter

  3. Antwortfilter

  4. Ausnahmefilter

Autorisierungsfilter werden also zuerst, Ausnahmefilter zuletzt ausgeführt. Innerhalb eines Filtertyps bestimmt der Wert Order die Ausführungsreihenfolge. Für einen Filtertyp und dessen Ausführungsreihenfolge gibt der Enumerationswert Scope die Reihenfolge der Filter an. Diese Enumeration definiert die folgenden Filterbereichswerte (in der Reihenfolge der Ausführung):

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

Ein Aktionsfilter, dessen Eigenschaft Order 0 und dessen Filterbereich First zugewiesen wurde, wird z. B. vor einem Aktionsfilter ausgeführt, dessen Eigenschaft Order 0 und dessen Filterbereich Action zugewiesen wurde.

Die Ausführungsreihenfolge von Filtern mit identischem Typ, identischer Ausführungsreihenfolge und identischem Filterbereich ist nicht definiert.

Die Filter OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext) und OnAuthorization(AuthorizationContext) werden in normaler Reihenfolge ausgeführt. Die Filter OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext) und OnException(ExceptionContext) werden in umgekehrter Reihenfolge ausgeführt.

HinweisHinweis:

In ASP.NET MVC 3 wurde die Ausnahmefilter-Ausführungsreihenfolge für Ausnahmefilter mit identischem Order-Wert geändert. In ASP.NET MVC 2 und früheren Versionen wurden Ausnahmefilter im Controller, die den gleichen Order-Wert wie die Ausnahmefilter einer Aktionsmethode aufwiesen, vor den Ausnahmefiltern der Aktionsmethode ausgeführt. Dies würde normalerweise geschehen, wenn Ausnahmefilter ohne angegebenen Order-Wert angewendet werden. In ASP.NET MVC 3 wurde diese Reihenfolge umgekehrt, damit der spezifischste Ausnahmehandler zuerst ausgeführt wird. Weitere Informationen finden Sie unten in diesem Dokument im Abschnitt zur Filterreihenfolge.

Sie können die Filterausführung in den Methoden OnActionExecuting und OnResultExecuting abbrechen, indem Sie der Eigenschaft Result einen Wert ungleich null zuweisen. Ausstehende OnActionExecuted- und OnActionExecuting-Filter werden nicht aufgerufen, und die aufrufende Komponente wird die Methode OnActionExecuted-nicht für den abgebrochenen oder die ausstehenden Filter aufrufen. Der Filter OnActionExecuted für zuvor ausgeführte Filter wird ausgeführt. Alle OnResultExecuting- und OnResultExecuted-Filter werden ausgeführt.

Als Beispiel soll eine ASP.NET MVC-Anwendung mit einem Home-Controller und einem einfachen Controller dienen. Ein globaler Anforderungszeitsteuerungsfilter wird der Anwendung zugewiesen. Der Anforderungszeitsteuerungsfilter implementiert die vier Aktions- und Ergebnisfilter (OnActionExecuting, OnActionExecuted, OnResultExecuting und OnResultExecuted). Jede Filtermethode in der Anwendung schreibt Ablaufverfolgungsinformationen mit dem Namen des Filters, des Controllers und der Aktion sowie dem Filtertyp. In diesem Fall ist der Filtertyp ein Anforderungszeitsteuerungsfilter. Eine Anforderung an die Aktion Index des Home-Controllers zeigt die folgende Ausgabe im Ablaufverfolgungslistener (Debugfenster) an.

Filtermethode

Controller

Aktion

Filtertyp

OnActionExecuting

POS1

Index

Anforderungszeitsteuerungsfilter

OnActionExecuted

POS1

Index

Anforderungszeitsteuerungsfilter

OnResultExecuting

POS1

Index

Anforderungszeitsteuerungsfilter

OnResultExecuted

POS1

Index

Anforderungszeitsteuerungsfilter

Stellen Sie sich diese Anwendung vor, wenn dem einfachen Controller ein Ablaufverfolgungsaktionsfilter zugewiesen wird. Der einfache Controller implementiert ebenfalls vier Aktions- und Ergebnisfilter. Der einfache Controller besitzt drei Filter, die jeweils vier Aktions- und Ergebnismethoden implementieren. Eine Anforderung an die Aktion Details des Simple-Controllers zeigt die folgende Ausgabe im Ablaufverfolgungslistener an:

Filtermethode

Controller

Aktion

Filtertyp

OnActionExecuting

Einfach

Details

Einfacher Controller

OnActionExecuting

Einfach

Details

Ablaufverfolgungsaktion

OnActionExecuting

Einfach

Details

Zeitliche Steuerung der Anforderung

OnActionExecuted

Einfach

Details

Zeitliche Steuerung der Anforderung

OnActionExecuted

Einfach

Details

Ablaufverfolgungsaktion

OnActionExecuted

Einfach

Details

Einfacher Controller

OnResultExecuting

Einfach

Details

Einfacher Controller

OnResultExecuting

Einfach

Details

Ablaufverfolgungsaktion

OnResultExecuting

Einfach

Details

Zeitliche Steuerung der Anforderung

OnResultExecuted

Einfach

Details

Zeitliche Steuerung der Anforderung

OnResultExecuted

Einfach

Details

Ablaufverfolgungsaktion

OnResultExecuted

Einfach

Details

Einfacher Controller

Gehen Sie jetzt erneut von dieser Anwendung aus, wobei der Ablaufverfolgungsaktionsfilter die Ergebniseigenschaft wie im folgenden Beispiel auf "Home/Index" festlegt:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) {
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}

Die Anforderung an die Aktion Details des Simple-Controllers mit dem abgebrochenen Ergebnis führt zu folgender Ausgabe im Ablaufverfolgungslistener:

Filtermethode

Controller

Aktion

Filtertyp

OnActionExecuting

Einfach

Details

Einfacher Controller

OnActionExecuting

Einfach

Details

Ablaufverfolgungsaktion

OnActionExecuted

Einfach

Details

Einfacher Controller

OnResultExecuting

Einfach

Details

Einfacher Controller

OnResultExecuting

Einfach

Details

Ablaufverfolgungsaktion

OnResultExecuting

Einfach

Details

Zeitliche Steuerung der Anforderung

OnResultExecuted

Einfach

Details

Zeitliche Steuerung der Anforderung

OnResultExecuted

Einfach

Details

Ablaufverfolgungsaktion

OnResultExecuted

Einfach

Details

Einfacher Controller

OnActionExecuting

POS1

Index

Anforderungszeitsteuerungsfilter

OnActionExecuted

POS1

Index

Anforderungszeitsteuerungsfilter

OnResultExecuting

POS1

Index

Anforderungszeitsteuerungsfilter

OnResultExecuted

POS1

Index

Anforderungszeitsteuerungsfilter

Im herunterladbaren Beispiel für dieses Thema wird die in diesen Tabellen beschriebene Filterung implementiert.

Speichern Sie den Filterzustand nicht in einer Filterinstanz. Der anforderungsspezifische Zustand wird üblicherweise in der Eigenschaft Items gespeichert. Diese Auflistung wird so initialisiert, dass sie für jede Anforderung geleert und nach Abschluss der Anforderung freigegeben wird. Der flüchtige benutzerspezifische Zustand wird in der Regel in der Sitzung des Benutzers gespeichert. Benutzerzustandsinformationen werden oft in einer Datenbank gespeichert. Das herunterladbare Beispiel für dieses Thema schließt einen Zeitsteuerungsfilter ein, der den anforderungsspezifischen Zustand verwendet. Informationen zum Erstellen von zustandsbehafteten Filtern finden Sie im Video Advanced MVC 3.

Titel

Beschreibung

ASP.NET MVC 3 Service Location, Part 4: Filters

(Blogeintrag) Beschreibt ASP.NET MVC-Filter in einem Dienstspeicherortkontext.

AuthorizeAttribute

Beschreibt, wie das Authorize-Attribut verwendet wird, um den Zugriff auf eine Aktionsmethode zu steuern.

OutputCacheAttribute

Beschreibt, wie das OutputCache-Attribut verwendet wird, um ein Ausgabecaching für eine Aktionsmethode bereitzustellen.

HandleErrorAttribute

Beschreibt, wie das HandleError-Attribut verwendet wird, um Ausnahmen zu behandeln, die von einer Aktionsmethode ausgelöst werden.

Erstellen von benutzerdefinierten Aktionsfiltern

Beschreibt, wie benutzerdefinierte Aktionsfilter implementiert werden.

Gewusst wie: Erstellen eines benutzerdefinierten Aktionsfilters

Erklärt, wie einer ASP.NET MVC-Anwendung ein benutzerdefinierter Aktionsfilter hinzugefügt wird.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft