Frage

Problem

Mein aktuelles Projekt erfordert mich verschiedene Dinge für fast jede Aktion auf der Basis verschiedenen HTTP-Request-Header zu tun.

Derzeit habe ich einen massiven Controller (alle für den gleichen Ressource-Typen), und jede Aktion Methode hat ein Actionattribut (so dass ich mehrere Versionen derselben Aktion haben kann, die die gleichen Parameter nehmen, aber tue verschiedene Dinge) und eine benutzerdefinierte FilterAttribute (fast genauso aus wie das AcceptVerbsAttribute in Vorschau implementiert 5), der überprüft, ob bestimmte Header bestimmte Werte haben.

Ich möchte wirklich den Code in separaten Controller drücken, und haben die Routetable zwischen ihnen wählen den Header basierend auf, kann aber von der sauberste Weg nicht denken, dies zu tun.

Beispiel

Zum Beispiel, sagen, ich habe eine Liste von Dateien. Der Dienst muss den Antrag auf eine von zwei Arten verarbeiten:

  1. Der Kunde möchte eine Zip-Datei und übergibt „akzeptieren: application / zip“. Als Header, ich die Liste der Dateien nehmen, sie in eine ZIP-Datei packen, und es zurück an den Client senden

  2. Der Kunde möchte eine HTML-Seite, so dass es passiert "akzeptieren: text / html"., Sendet die Website eine tabellenformatierte HTML-Seite mit einer Liste der Dateien zurück

War es hilfreich?

Lösung

Es klingt wie Sie etwas anderes Verhalten von Ihren Aktionen haben auf dessen Basis-Header kommt. Ich würde versuchen, die Unterschiede so weit wie möglich zu isolieren.

Zum Beispiel, wenn die Anwendungslogik ist die gleiche, aber der einzige Unterschied ist, wie Sie die Antwort an den Benutzer übertragen, könnte man erwägen, einen benutzerdefinierten Action schreiben, die verschiedene Aktionen nimmt auf der Grundlage der Http-Header.

Wenn jedoch die Logik völlig anders ist, könnten Sie eine benutzerdefinierte Routing-Einschränkung (IRoutConstraint) implementieren, die Sie jede Route befestigen. Werfen Sie einen Blick auf die Umsetzung von HttpMethodConstraint für Ideen.

Andere Tipps

Ich bin mir nicht sicher, dass Sie basierend auf Header separaten Controller benötigen; diese Struktur klingt durchaus sinnvoll. Wenn Ihr Controller massiv ist, wie Sie sagen, zu prüfen, ob es mit mehreren Ressourcen zu tun hat, und wenn ja, vielleicht sollte es in mehrere Controller auf Ressource basiert aufgeteilt werden?

Nicht sicher, ob es möglich ist, aber es scheint, wie dies wäre so etwas wie die AcceptVerbs Attribut, das war hinzugefügt Vorschau 5 . Ich würde einen Blick auf, wie das umgesetzt wurde (Holen Sie sich die MVC-Quelle), um zu sehen, wenn Sie etwas ähnliches basierend auf Inhaltstyp hinzufügen können.

Sie sollten unter diesen Beitrag suchen. Es beschreibt Implementierung für json und XML-Antworten basierend auf HTTP-Header.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top