2016-03-24 10 views
6

Sto lavorando su un progetto utilizzando ASP.NET 5 e sto scrivendo una web api.Asp.net 5 web status codice di ritorno api e corpo

Ho ereditato alcune stored procedure di codice e database che utilizzano raiserror per indicare che qualcosa non va (nome utente/password errata, licenza scaduta, ecc.).

La procedura memorizzata non restituisce nulla per identificare univocamente tale errore, ad eccezione del testo del messaggio.

Desidero essere in grado di restituire una risposta HTTP NON AUTORIZZATA, ma anche di inoltrare il messaggio di errore anche al client.

Il metodo integrato IActionResult HttpUnauthorized() non consente di fornire un motivo.

Così ho scritto il mio ActionResult che assomiglia a questo:

public class UnauthorizedWithMessageResult : IActionResult 
{ 
    private readonly string _message; 

    public UnauthorizedWithMessageResult(string message) 
    { 
     _message = message; 
    } 

    public async Task ExecuteResultAsync(ActionContext context) 
    { 
     using (var sw = new HttpResponseStreamWriter(context.HttpContext.Response.Body, Encoding.UTF8)) 
     { 
      await sw.WriteLineAsync(_message); 
     } 

     await new HttpUnauthorizedResult().ExecuteResultAsync(context); 
    } 
} 

Il problema è che il cliente riceve un 200-OK come tutto va bene.

ho fatto un passo attraverso questo e dopo che la delegazione di HttpUnauthorizedResult è stato fatto, il codice di stato è infatti impostato su 403.

Sembra API Web è (a un certo punto), visto che non c'è contenuti nel corpo della risposta e decide che tutto è OK e reimposta il codice di stato.

C'è un modo per aggirare questo senza dover ricorrere a inviare il messaggio come un'intestazione o qualcosa del genere? (O è che il modo corretto di fare questo?)

+0

Non è possibile impostare un codice di stato dopo che si scrive qualsiasi parte del corpo della risposta. Hai provato a chiamare HttpUnauthorizedResult.ExecuteResultAsync prima di scrivere il tuo messaggio? – yaakov

+1

guarda questo link potrebbe risolvere il tuo problema http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-creating-httpstatuscoderesult-with-view-based-body – Gomes

+0

@Gomes che sembra molto promettente! Suppongo che concettualmente abbia senso, dovrò dare un'occhiata presto! – Clint

risposta

4

Funziona in questo modo:

public IActionResult IWillNotBeCalled() 
{ 
    return new UnauthorizedWithMessageResult("MY SQL ERROR");    
} 

public class UnauthorizedWithMessageResult : IActionResult 
{ 
    private readonly string _message; 

    public UnauthorizedWithMessageResult(string message) 
    { 
     _message = message; 
    } 

    public async Task ExecuteResultAsync(ActionContext context) 
    { 
     // you need to do this before setting the body content 
     context.HttpContext.Response.StatusCode = 403; 

     var myByteArray = Encoding.UTF8.GetBytes(_message); 
     await context.HttpContext.Response.Body.WriteAsync(myByteArray, 0, myByteArray.Length); 
     await context.HttpContext.Response.Body.FlushAsync(); 
    } 
} 

Devi imposta StatusCode prima di impostare il corpo e devi svuotare il flusso del corpo per assicurarti che il contenuto venga impostato all'interno della risposta.

enter image description here

Speranza che aiuta :)

0

è possibile restituire qualsiasi codice di stato che si desidera, in questo modo:

return new HttpStatusCodeResult(403); 
+0

Non è il codice di stato che rappresenta il problema, sta aggiungendo del testo al corpo della risposta insieme a un codice di stato che sta dimostrando essere stimolante. – Clint

1

Si può fare questo:

return new ObjectResult("The message") { 
    StatusCode = (int?) HttpStatusCode.Unauthorized 
};