2009-02-21 5 views
5

Ich bin mit ASP.Net MVC als eine Plattform für einen REST-basierten Service suchen. Ich weiß, WCF hat Unterstützung für REST-Dienste eingebaut; Ich versuche jedoch, abhängig von der Anfrage mehrere Datentypen zurückzugeben.mit asp.net mvc für REST-basierte Endpunkt

Ich möchte, dass der Client den Inhaltstyp anfordert. Wenn sie zum Beispiel text/html senden, würde ich mein Modell in Html rendern, wenn sie text/xml anfordern, würde es xml zurückgeben. Wir könnten auch JSON machen.

Hat jemand irgendwelche Probleme damit?

Wenn Sie WCF nicht verwenden, kann dies die Komplexität des Clients beim Aufrufen des Dienstes erhöhen, da ein Proxy nicht automatisch generiert werden kann. In meinem Fall sind die Clients jedoch entweder Browser, die HTML anfordern, oder Java-Client-Bibliotheken, die das XML verarbeiten.

Da WCF nicht verwendet wurde, müssen wir den Dienst sichern; Ich denke jedoch, dass wir dies mit der Formularauthentifizierung tun können.

Der Vorteil davon ist, dass egal welche Art von Daten ist der Kunde aufgefordert wird, alle durch den gleichen Controller/Modelle usw. geht ...

Antwort

2

Nach dem Lesen von Haack's Post, über die Verwendung von Erweiterungen, um den Inhaltstyp anzugeben, denke ich, dass Sie besser den Accept Header abtasten. Scheint mehr Rest'ish zu mir, obwohl gewährt es ein wenig schwieriger zu starten einen Browser und testen Sie Ihre URL.

Ich durch zusammen einen kleinen Blog-Artikel über dies tun und mit einem ModelBinder den HttpContext von Ihrem Controller abstrahieren: http://jberke.blogspot.com/2009/03/aspnet-mvc-model-binder.html.

Zusätzlich als Antwort auf Troys Opt-in-Kommentar, nutzte ich die Ansicht, um Xml von meinem Modell zu rendern. Dies erlaubte mir verschiedene XML-Formate für das gleiche Modell. Was macht Sinn. Was ist, wenn Sie die Versionierung oder verschiedene Formate für verschiedene Clients unterstützen müssen? Ich mag die Idee, dass das Framework automatisch nichts rendert.

2

Sie können einen Blick auf diesen Blog-Post zu übernehmen wollen und die folgende Diskussion von Phil Haack:

http://haacked.com/archive/2009/01/06/handling-formats-based-on-url-extension.aspx

Sein Code verwendet die Dateierweiterung angefordert (.html, .json, .xml), um den Ausgang zu bestimmen, aber man könnte genauso gut Accept-Encoding (oder beide).

Hinweis: Ich habe einen Kommentar zu Phils Beitrag hinterlassen und bin immer noch der festen Überzeugung, dass Aktionen erforderlich sein sollten, um die von ihnen unterstützten Rendering-Methoden zu aktivieren. Mit HTML-Rendering steuern Sie, wie viel von den Viewdaten dem Endnutzer angezeigt wird. Das XML/JSON-Rendering würde wahrscheinlich alles wiedergeben, was Sie an die viewdata übergeben, unabhängig davon, ob Sie es öffentlich sichtbar machen wollten oder nicht.

3

Haacks Lösung ist sicherlich nicht der beste Weg, aber es ist ein guter Ausgangspunkt. Wenn Sie mit dem Entity Framework arbeiten (oder zu einem späteren Zeitpunkt von SQL zu SQL wechseln), bricht JsonResult zuerst ab, weil Objektgrafiken nicht mit kreisförmigen Referenzen (typischerweise die meisten Datenmodelle) serialisiert werden können. Zweitens werden mehrere Endpunkte für die gleiche Ressource verfügbar gemacht.

Der richtige Weg, dies zu tun, ist zu sehen X-Requested-With HTTP-Header, um festzustellen, ob dies eine XHR-Anfrage ist. Oder Content-Type: text/xml Anfrage Header für XML.

Ich würde empfehlen, installieren Sie das Firefox-Plugin für REST testing, die XHR-Anfragen simuliert. Das Tamper Data-Plugin und einige andere erlauben eine bessere Kontrolle beim Testen/Debuggen. WFetch ist ein einfaches rohen HTTP-Anfrage-Tool, das auch für das Testen und Debuggen unerlässlich ist.

Ich habe eine JSON/POX action filter für genau dies geschrieben. Sie müssen nur Ihre Klassen oder Methoden mit dem Attribut [JsonPox] dekorieren und sie werden je nach Client automatisch als JSON oder XML verfügbar gemacht.

+0

Ich habe den Inhalt-Typ verwendet, um anzuzeigen, ob der Benutzer wishesh Xml oder Html (Welche heute ich eigentlich nur Xml unterstützen). Ich plane, dass mein Controller entweder eine Html- oder eine Xml-Ansicht auswählt, die dann für die Umwandlung des Modells in das Ergebnis verantwortlich ist. Ich denke, das funktioniert gut. Danke für die Rückmeldung und zusätzliche Informationen. – JoshBerke