2016-03-24 14 views
6

私はASP.NET 5を使用しているプロジェクトで作業しており、Web APIを作成しています。Asp.net 5 web api return status code and body

raiserrorを使用して何かが間違っていることを示すコードとデータベースストアドプロシージャを継承しました(ユーザ名/パスワードが間違っていたり、ライセンスが期限切れになっています)。

ストアドプロシージャは、メッセージテキスト以外のエラーを一意に識別するために何も返しません。

私はHTTP UNAUTHORIZEDレスポンスを返すことができるだけでなく、エラーメッセージをクライアントにも送り返したいと考えています。

組み込みのIActionResult HttpUnauthorized()メソッドでは、理由を指定できません。

だから私はこのようになります私自身のActionResultを書いた:

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

問題は、すべてがうまくているように、クライアントは200-OKを受信して​​いることです。私はこれを通じて段階まし

HttpUnauthorizedResultへの委任が行われた後、ステータスコードが実際に403

に設定されたWeb APIは、内のコンテンツがあることを見て(いくつかの点で)であるように見えますレスポンスの本文を確認し、すべてがOKであることを確認してステータスコードをリセットします。

メッセージをヘッダーなどで送信する必要がないため、これを回避する方法はありますか。 (またはそれがこれを行うための正しい方法は何ですか?)

+0

あなたはステータスコードを設定することはできません。あなたのメッセージを書く前にHttpUnauthorizedResult.ExecuteResultAsyncを呼び出してみましたか? – yaakov

+1

このリンクはあなたの問題を解決するかもしれませんhttp://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-creating-httpstatuscoderesult-with-view-based-body – Gomes

+0

非常に有望な@Gomes!概念的には理にかなっていると思いますが、すぐに見てください! – Clint

答えて

4

それはこのように動作します:

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

あなたがする必要があります本文を設定する前にStatusCodeを設定し、コンテンツが応答内に設定されるように本体ストリームをフラッシュする必要があります。

enter image description here

はそれが役に立てば幸い:)

0

は、あなたが望む任意のステータスコードを返すことができ、そのよう:

return new HttpStatusCodeResult(403); 
+0

それは問題であるわけではありません、レスポンスボディにいくつかのテキストを追加していることを証明しているステータスコード挑戦すること。 – Clint

1

あなたはこれを行うことができます:あなたは、応答本体の任意の部分を書き後

return new ObjectResult("The message") { 
    StatusCode = (int?) HttpStatusCode.Unauthorized 
}; 
関連する問題