/ / Die beste Möglichkeit, MVC-Controller basierend auf HTTP-Headern zu unterscheiden - .net, asp.net, asp.net-mvc, routing

Die beste Möglichkeit, MVC-Controller auf der Basis von HTTP-Headern zu unterscheiden - .net, asp.net, asp.net-mvc, routing

Problem

Mein aktuelles Projekt erfordert, dass ich für fast jede Aktion unterschiedliche Dinge auf der Grundlage verschiedener HTTP-Anforderungsheader ausführt.

Derzeit habe ich einen massiven Controller (alle fürdesselben Ressourcentyps), und jede Aktionsmethode verfügt über ein ActionName-Attribut (sodass ich mehrere Versionen derselben Aktion haben kann, für die dieselben Parameter verwendet werden, jedoch unterschiedliche Aktionen ausführen) und ein benutzerdefiniertes FilterAttribute (fast genauso implementiert wie das AcceptVerbsAttribute in Preview 5) prüft, ob bestimmte Header bestimmte Werte haben.

Ich würde den Code wirklich gerne in separate Controller verschieben und die RouteTable anhand der Header auswählen lassen, aber ich kann mir nicht die sauberste Methode vorstellen.

Beispiel

Angenommen, ich habe eine Liste von Dateien. Der Dienst muss die Anforderung auf zwei Arten verarbeiten:

  1. Der Client möchte eine ZIP-Datei und übergibt "Accept: Application / Zip" als Header. Ich nehme die Liste der Dateien, packe sie in eine ZIP-Datei und schicke sie an den Client zurück.

  2. Der Client wünscht eine HTML-Seite, also übergibt "Accept: text / html". Die Site sendet eine tabellarisch formatierte HTML-Seite mit den Dateien zurück.

Antworten:

4 für die Antwort № 1

Es klingt so, als ob Sie sich ein wenig von Ihren Aktionen unterscheiden, je nachdem, welcher Header verwendet wird. Ich würde versuchen, die Unterschiede so gut wie möglich zu isolieren.

Zum Beispiel, wenn die Anwendungslogik der istDer gleiche Unterschied besteht nur darin, wie Sie die Antwort für den Benutzer rendern. Möglicherweise erstellen Sie ein benutzerdefiniertes ActionResult, das auf der Grundlage der HTTP-Header verschiedene Aktionen ausführt.

Wenn jedoch die Logik völlig anders ist,Sie können eine benutzerdefinierte Routing-Einschränkung (IRoutConstraint) implementieren, die Sie an jede Route anhängen. Schauen Sie sich die Implementierung von HttpMethodConstraint für Ideen an.


0 für die Antwort № 2

Ich bin nicht sicher, ob Sie separate Controller benötigenim Header; Diese Struktur klingt vollkommen vernünftig. Wenn Ihr Controller massiv ist, wie Sie sagen, sollten Sie überlegen, ob er mit mehreren Ressourcen arbeitet, und wenn ja, sollte er in mehrere Controller aufgeteilt werden, die auf Ressourcen basieren.


0 für die Antwort № 3

Ich bin nicht sicher, ob es möglich ist, aber es scheint so, als wäre dies mit dem AcceptVerbs-Attribut identisch hinzugefügt in Vorschau 5. Ich schaue mir an, wie das implementiert wurde (holen Sie sich die MVC-Quelle), um zu sehen, ob Sie je nach Inhaltstyp etwas ähnliches hinzufügen können.


0 für die Antwort № 4

Sie sollten sich anschauen dieser Beitrag. Es beschreibt die Implementierung für Json- und XML-Antworten basierend auf dem http-Header.