2016-03-24 9 views
6

Ich arbeite an einem Projekt mit ASP.NET 5 und ich schreibe eine Web-API.Asp.net 5 Web API Rückgabestatus Code und Körper

Ich habe einige Code- und Datenbankspeicherprozeduren geerbt, die raiserror verwenden, um anzuzeigen, dass etwas nicht stimmt (Benutzername/Passwort falsch, abgelaufene Lizenz usw.).

Die gespeicherte Prozedur gibt nichts zurück, um diesen Fehler außer dem Nachrichtentext eindeutig zu identifizieren.

Ich möchte in der Lage sein, eine HTTP-UNAUTHORIZED-Antwort zurückzugeben, aber die Fehlermeldung auch an den Client zu senden.

Die eingebaute IActionResult HttpUnauthorized() Methode lässt nicht zu, einen Grund zu geben.

Also schrieb ich meine eigene Action, die wie folgt aussieht:

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

Das Problem besteht darin, dass der Client eine 200-OK empfängt wie alles in Ordnung ist.

Ich habe durch diese und nach der Delegation HttpUnauthorizedResult trat getan worden ist, wird der Statuscode tatsächlich auf 403.

Es ist wie Web API aussieht, ist (irgendwann) zu sehen, dass es in den Inhalt der Körper der Antwort und entscheidet, dass alles in Ordnung ist und setzt den Statuscode zurück.

Gibt es eine Möglichkeit, um dies zu umgehen, ohne auf die Nachricht als Header oder etwas zu senden? (Oder ist das der richtige Weg, dies zu tun?)

+0

Sie keinen Statuscode festlegen können, nachdem Sie einen beliebigen Teil der Antworttext schreiben. Haben Sie versucht, HttpUnauthorizedResult.ExecuteResultAsync aufzurufen, bevor Sie Ihre Nachricht geschrieben haben? – yaakov

+1

sieht dieser Link kann Ihr Problem lösen http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-creating-httpstatuscoderesult-with-view-based-body – Gomes

+0

@Gomes, die sehr vielversprechend aussieht! Ich denke, konzeptionell macht es Sinn, muss bald nachsehen! – Clint

Antwort

4

Es funktioniert so:

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

Sie müssen Stellen Sie StatusCode ein, bevor Sie den Body setzen, und Sie müssen den Body-Stream leeren, um sicherzustellen, dass der Inhalt in der Antwort festgelegt wird.

enter image description here

Hoffe, es hilft :)

0

Sie können zurückkehren jeden Statuscode, den Sie mögen, etwa so:

return new HttpStatusCodeResult(403); 
+0

Es ist nicht der Statuscode, der das Problem ist, es fügt etwas Text der Antwortstelle zusammen mit einem Statuscode, der sich bewährt herausfordernd sein. – Clint

1

Sie dies tun können:

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