2013-06-19 9 views
36

Projekt: ASP MVC 4 läuft unter .NET 4.0 Framework:Return Mvc.JsonResult Plus-Set Response.StatusCode

Wenn eine Anwendung unter VS 2010 Express ausgeführt wird (oder im Einsatz und unter IIS 7.5 auf meinem lokalen Rechner ausgeführt wird) die Beobachtet (Pseudo-Code) resultieren aus einer Aktion arbeitet als

erwartet
[HttpPost] 
public ActionResult PostWord(Model model) 
{ 
    .... 
    Response.StatusCode = 400; 
    Return new JsonResult { data = new {fieldName = "Word", error = "Not really a word!" } }; 

(und ich habe Content und Contenten Eigenschaften des JsonResult Objekt, wobei kein Unterschied im Verhalten zugewiesen)

Wenn der ausfahrbare auf eine Bahn bewegt wird Host (mit IIS 7) Firebug sagt mir, dass die Antwort wie erwartet ist (400), aber es gibt kein JSON in der Antwort (dh es gibt keinen Text). Wenn ich die Linie

Response.StatusCode = 400; 

von der Aktion zu entfernen, wird die JSON perfekt in der Reaktion gebildet wird, aber natürlich auch der Antwortstatuscode 200 (OK), die mit den Verbrauchern Javascript und entsprechendem Funktionsaufruf stört.

Haben Sie irgendwelche Gedanken darüber, was passieren könnte und wie Sie das beheben können? Danke

+0

Warum möchten Sie 400 zurückgeben? Ist das nicht nur eine Fehlerseite mit einer freundlichen Fehlermeldung – TGH

+0

http://stackoverflow.com/questions/6123425/rest-response-code-for-invalid-data vielleicht sollte ich Dinge anders machen, aber JSON wird unabhängig zurückgegeben - Der Antwortcode gibt die Postback-Funktionsinformation an, um zu wissen, was mit dem JSON zu tun ist. 200 für mich bedeutet "Datenbank aktualisiert wie angefordert". – Brent

+0

Ich würde das Fehlerfeld in JSON anstelle des HTTP-Statuscodes überprüfen – TGH

Antwort

47

Ich hatte genau dasselbe Problem; um sicherzustellen, dass die richtige Antwort nicht in den Kommentaren (wie es für mich war) vergraben ist, möchte ich @ Spockincat's Kommentar wiederholen:

Für mich zumindest war es in der Tat ein Problem mit benutzerdefinierten IIS-Fehlern, und kann gelöst werden mit:

Response.TrySkipIisCustomErrors = true; 

@Sprockincat - Sie sollten Kredit dafür erhalten. Ich mache es nur sichtbarer, weil es eine so subtile Lösung für ein Problem ist, das ziemlich schwer zu diagnostizieren ist.

+0

Danke dafür unschätzbar! –

+2

@Robert, wenn ich diese Antwort jeden Tag für das nächste Jahr upvote würde ich !! Danke dafür!Dieses Frikkin-Problem ließ mich die letzten 12 Stunden graben! Danke, danke, danke, danke. Und danke an Brent für den Eröffnungsbeitrag! –

+1

Ich musste hinzufügen, da existingResponse = "Replace" die TrySkipIisCustomErrors ignorieren würde! –

1

Ich habe eine Unterklasse von JsonResult erstellt, mit der Sie den HttpStatusCode angeben können.

Dann können Sie dies als Ihr Ergebnis zurückgeben und der Statuscode wird auf die Antwort gesetzt werden. Sie können den Statuscode des Ergebnisses in Ihren Tests auch testen.