2015-07-08 17 views
18

Mi chiedevo se fosse possibile restituire una richiesta non valida con i contenuti di un controller MVC? L'unico modo in cui sono stato in grado di farlo è throw HttpException, ma qui non posso impostare alcun contenuto. Ho provato questo approccio, ma per qualche strana ragione mi viene sempre restituito un OK. È possibile farlo?Il controller MVC restituisce una richiesta errata?

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

     return response;  
    } 
} 
+2

Prova return new HttpStatusCodeResult (HttpStatusCode.BadRequest, "Bad Request"); – greenhoorn

risposta

3

è possibile passare in messaggio di errore per il secondo parametro come return new HttpResponseMessage(HttpStatusCode.BadRequest, "Your message here");.

+0

Facendo questo, mi ritorna un 200 per qualche strana ragione. Ho provato questo utilizzando sia un client di riposo, cioè postino e tramite la dipendenza http di angularjs. –

7

Impostare il codice di stato Http su richiesta errata e utilizzare il metodo Content per inviare il contenuto insieme alla risposta.

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

In aggiunta alla @ risposta di Ekk, assicuratevi di controllare questo:

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

Aggiungere la seguente voce alla tua 'web.config'.

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

...

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

solo una nota a margine per le persone che arrivano in questi giorni: questa firma del costruttore non sembra essere disponibile nell'ultimo Asp.Net MVC 6 ... almeno per Asp.Net Core 1 RC1 – superjos

4

Certo che puoi.

Date un'occhiata al mio Azione

// 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); 
} 

credo che questo sia migliore prassi

  1. di tornare HttpStatusCodeResult(HttpStatusCode.BadRequest); nel caso in cui utente non ha fornito un valore richiesto

  2. per tornare HttpNotFound(); nel caso in cui l'utente abbia fornito un valore richiesto ma non velato

speranza questo aiuterà

Problemi correlati