2013-06-26 5 views
13

Dall'azione del controller MVC3, desidero restituire l'HTTP 403, impostare la "descrizione dello stato" su una stringa specifica e anche restituire quella stringa nel contenuto del risultato in modo che sia visibile nel browser.Come posso restituire un codice di stato, una descrizione dello stato e del testo insieme in MVC3?

Posso restituire ContentResult per specificare il contenuto, ma non un codice di stato (come 403) e non una descrizione di stato. Posso usare HttpStatusCodeResult per specificare un codice di stato e una descrizione dello stato ma non il contenuto del risultato.

Come si crea un risultato di azione che contiene tutti e tre?

+1

perché non utilizzare la chiamata personalizzata JSON ({code: descr:})? – Tigran

+1

@Tigran: IMO per questo semplice scopo che sarebbe eccessivo. – sharptooth

+0

per quanto ne sappia, non è possibile, quindi è necessario creare oggetto composto esplicit. In tal caso, imo, la soluzione più semplice è l'oggetto JSON personalizzato. Ma non sono un esperto di ASP.NET, potrebbe esserci una soluzione più semplice per questo. – Tigran

risposta

9

Se questo non è troppo sporca

Response.Clear(); 
Response.Write("Some specific string"); 
return new HttpStatusCodeResult(403, "another specific string"); 
+2

o in modo simile, 'Response.StatusCode = 403; Response.StatusDescription = "foo"; return Content ("bad request mate"); ' – drch

+2

Non dimenticare di cancellare prima la risposta se stai scherzando prima del codice:' Response.Clear(); ' – Haney

13

Comunemente si potrebbe vedere questo fatto impostando il codice di risposta per poi tornare un ActionResult regolare

public ActionResult Foo() 
{ 
    Response.StatusCode = 403; 
    Response.StatusDescription = "Some custom message"; 

    return View(); // or Content(), Json(), etc 
} 

Se davvero bisogno di questo per essere un ActionResult, tu crea il tuo.

Esempio:

public class HttpStatusContentResult : ActionResult 
{ 
    private string _content; 
    private HttpStatusCode _statusCode; 
    private string _statusDescription; 

    public HttpStatusContentResult(string content, 
            HttpStatusCode statusCode = HttpStatusCode.OK, 
            string statusDescription = null) 
    { 
     _content = content; 
     _statusCode = statusCode; 
     _statusDescription = statusDescription; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.StatusCode = (int) _statusCode; 
     if (_statusDescription != null) 
     { 
      response.StatusDescription = _statusDescription; 
     } 

     if (_content != null) 
     { 
      context.HttpContext.Response.Write(_content); 
     } 
    } 
} 
+3

Se' _statusDescription' è nullo, tu potrebbe assegnargli un valore di 'HttpWorkerRequest.GetStatusDescription (response.StatusCode)', che sotto la cappa è una ricerca molto veloce in 'string [] [] s_HTTPStatusDescriptions' come' s_HTTPStatusDescriptions [StatusCode/100] [StatusCode% 100] '. Il valore recuperato è sempre una breve descrizione del codice di stato come "OK" o "Proibito" o una stringa vuota se non viene trovata alcuna descrizione corrispondente. – Triynko

-1

sono impazzito cercando di ottenere questo codice al lavoro prima ho capito che era il GetAwaiter() OnCompleted (...), che era il problema.. Ecco la versione che ho lavorato:

public class ApiControllerBase : ApiController 
{ 
    ... 
    // Other code 
    ... 

    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    { 
     return base 
     .ExecuteAsync(controllerContext, cancellationToken) 
     .ContinueWith(t => 
     { 
      t.Result.Headers.CacheControl = new CacheControlHeaderValue() 
      { 
       NoStore = true, 
       NoCache = true, 
       MaxAge = new TimeSpan(0), 
       MustRevalidate = true 
      }; 
      t.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache")); 
      t.Result.Content.Headers.Expires = DateTime.Parse("01 Jan 1990 00:00:00 GMT"); 

      return t.Result; 
     }, cancellationToken); 
    } 
} 
Problemi correlati