2013-08-16 16 views
16

Also ich gebe detaillierte 400 Fehler Antworten von meiner MVC Web App zurück. SettingResponse = "PassThrough" funktioniert, aber das ist nicht was ich will. Ich möchte nicht alle Fehler offen legen, ich möchte sie nur offen legen, wenn ich benutzerdefinierte Antworten habe.Wie kann ich existingResponse = "Auto" erfolgreich verwenden?

Auto, ist standardmäßig eingestellt, aber ich habe es absichtlich eingestellt. In der Dokumentation steht zwar "SetStatus" -Flag, aber ich habe keine Ahnung, wie ich das machen soll. Ich habe die folgenden vier Controller-Methoden geschrieben, um sie zu testen, und nur BadRequestD funktioniert. Die anderen setzen den Statuscode und den Status gut, aber der Body-Inhalt ist "Bad Request".

public ActionResult BadRequestA() 
{ 
    Response.StatusCode = 400; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestB() 
{ 
    Response.Status = "400 U DUN MESSED UP"; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestC() 
{ 
    Response.Status = "400 U DUN MESSED UP"; 
    Response.StatusCode = 400; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestD() 
{ 
    Response.StatusCode = 400; 
    Response.TrySkipIisCustomErrors = true; 
    return Content("weeeeee"); 
} 

Antwort

31

Jedoch sagt die Dokumentation „SetStatus“ Flag gesetzt werden müssen, aber ich habe keine Ahnung, wie so zu tun, um eine Sache

Es spricht tatsächlich über die fTrySkipCustomErrors Flagge/Argument für die IHttpResponse::SetStatus Methode im IIS C++ SDK (siehe Hinweis, den ich am Ende von documentation here hinzugefügt habe). In ASP.NET wird das Flag jedoch als Response.TrySkipIisCustomErrors angezeigt. So nach:

http://www.iis.net/configreference/system.webserver/httperrors

Auto = Blätter die Antwort unangetastet nur, wenn die SetStatus Flag gesetzt ist

Ich würde erwarten, IIS zu sehen ersetzen Sie die Antwort mit einem eigenen HTML-Fehlerseite Inhalt (Sie können konfigurieren, was dieser Inhalt ist), wenn Sie Folgendes festlegen:

Das ist, was Sie sehen Ing.


Weitere interessante Informationen, in MVC5 scheint es, als zu handeln, wenn das Flag wahr ist, auch wenn es für nicht abgefangene Ausnahmen falsch ist, die ich nicht sehe, in WebForms. Als Abhilfe können in Global.asax Ich bin:

protected void Application_Error() 
{ 
    var error = Server.GetLastError(); 
    Server.ClearError(); 
    //code to log error here 
    var httpException = error as HttpException; 
    Response.StatusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError; 
} 
+0

Vielen Dank für den MVC5-Tipp! Ich hatte das gleiche Problem und Ihr Workaround scheint für mich zu funktionieren. –

+0

Danke, geholfen. Sollte als Antwort markiert sein. – LaoR

0

Wenn Sie benutzerdefinierte Antworten mit 4xx http Status haben und immer noch hier Custom Error Pages verwenden möchten, was Sie tun sollten:

  • Set existingResponse="Auto" in web.config;
  • TrySkipIisCustomErrors = true in Ihrer Aktion (eine, die 4xx-Status und einen Inhalt zurückgibt);
  • klar Serverfehler in global.asax (in Application_Error()-Server.ClearError()) und den Statuscode (Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode())

Es ist komisch, neu eingestellt, dass IIS-Team nicht existingResponse Attribut für bestimmten Statuscodes umgesetzt hat, so ist es unmöglich, existingResponse="PassThrough" nur für einen (oder wenige) Codes zu verwenden.

Verwandte Themen