2015-07-08 20 views
18

Ich frage mich, ob es möglich war, eine schlechte Anfrage mit Inhalt von einem MVC-Controller zurückgeben? Die einzige Möglichkeit, dies zu tun, ist throw HttpException, aber hier kann ich keinen Inhalt einstellen. Ich habe diesen Ansatz versucht, aber aus irgendeinem Grund bekomme ich immer ein OK zurück. Ist es möglich, dies zu tun?MVC Controller eine schlechte Anfrage zurückgeben?

public class SomeController : Controller 
{ 
    [HttpPost] 
    public async Task<HttpResponseMessage> Foo() 
    { 
     var response = new HttpResponseMessage(HttpStatusCode.BadRequest); 
     response.Content = new StringContent("Naughty"); 

     return response;  
    } 
} 
+2

neue HttpStatusCodeResult zurückkehren Versuchen (HttpStatusCode.BadRequest, "Bad Request"); – greenhoorn

Antwort

3

Sie können wie return new HttpResponseMessage(HttpStatusCode.BadRequest, "Your message here"); in Fehlermeldung an den zweiten Parameter übergeben.

+0

Das obige Ergebnis bringt mir aus irgendeinem seltsamen Grund eine 200 zurück. Ich versuchte dies unter Verwendung sowohl eines Rest-Clients, d. H. Postman, als auch über die angularjs-http-Abhängigkeit. –

7

Setzen Sie den HTTP-Statuscode auf eine ungültige Anforderung und verwenden Sie die Methode Content, um den Inhalt zusammen mit der Antwort zu senden.

public class SomeController : Controller 
{ 
    [HttpPost] 
    public async Task<ActionResult> Foo() 
    { 
     Response.StatusCode = 400; 
     return Content("Naughty"); 
    } 
} 
5

Neben der Antwort des @ Ekk, stellen Sie sicher, dass dies zu überprüfen:

ASP.NET+Azure 400 Bad Request doesn't return JSON data

Fügen Sie den folgenden Eintrag in die 'web.config'.

<system.webServer> 
    <httpErrors existingResponse="PassThrough"/> 
</system.webServer> 

...

21
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "naughty"); 
+2

nur eine Randnotiz für Leute, die in diesen Tagen hierher kommen: Diese Konstruktorsignatur scheint im neuesten Asp.Net MVC 6 nicht verfügbar zu sein ... zumindest für Asp.Net Core 1 RC1 – superjos

4

Natürlich können Sie.

einen Blick auf meine Take Action

// GET: Student/Details/5 
public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Student student = db.Students.Find(id); 
    if (student == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(student); 
} 

Ich denke, diese Praxis am besten

  1. HttpStatusCodeResult(HttpStatusCode.BadRequest); falls Benutzer zurück nicht vorgesehen ist ein erforderlicher Wert

  2. HttpNotFound(); zurückzukehren falls der Benutzer einen erforderlichen Wert angibt, aber nicht verschleiert

Hoffnung diese Hilfe Sie