2017-09-06 5 views
1

内のステータス・コードとコンテンツ(swashbuckle)設定WEBAPI

まず、私のコントローラは、このように見えた:

public class ValuesController : ControllerBase 
{ 
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(List<Value>))] 
    [HttpGet, System.Web.Mvc.Route("api/values/")] 
    public async Task<List<Value>> GetValues(HttpRequestMessage request) 
    { 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
      return await context.Values.Take(10).ToListAsync(); 
     } 
    } 
} 

すべてうまく、スガッガーはjsonフォーマットの結果を示します。問題は、ステータスコードを設定できません(データベースエラーの場合はErr 500またはsththに設定できます)。私が読ん

Hereは、ステータスコードを設定するために、我々はHttpResponseMessage

だから私は変更私のコードを返す必要があります。ステータスコードが正しく設定されている、今

public class ValuesController : ControllerBase 
{ 
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(HttpResponseMessage))] 
    [HttpGet, System.Web.Mvc.Route("api/values/")] 
    public async Task<HttpResponseMessage> GetValues(HttpRequestMessage request) 
    { 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
      var valuesToReturn = await context.Values.Take(10).ToListAsync(); 
      return request.CreateResponse(HttpStatusCode.NotModified, valuesToReturn); 
     } 
    } 
} 

を、しかし闊歩しません結果を示します。

enter image description here

だから、私はこれは多分威張っ-問題であると思いました。

次のステップのchromeブーメラン・プラグインとAPIをテストすることだったが、同じ: ステータスコードは304ですが、ボディ(結果/コンテンツ)が空である:

enter image description here

あり、間違いなくあります結果: enter image description here

HttpResponseMessageで本文を正しく設定する方法については、 また、戻り値がfalseの場合に、api-methodでステータスコードを設定する方法については、 List<Value>

答えて

3

:私はあなたのようなあなたのクラスでそれを宣言することができると思います。 304応答はメッセージ本文を含んではいけません。したがって、ヘッダーフィールドの後の最初の空行で常に終了します。

ステータスコードを変更するだけです。

+0

これも問題でした。 –

+0

@MatthiasBurgerこれは主な問題です;)私の答えに私のコメントを参照してください –

+0

@its_time_for_weekendまあ両方が正しいです。 304であなたのソリューションをテストしただけで、うまくいかなかった。偉大な、今日何かを学んだ。 –

0
var valuesToReturn = new List<string>(); 
valuesToReturn.Add("test01"); 
var res = new HttpResponseMessage() 
{ 
    Content = new StringContent(JsonConvert.SerializeObject(valuesToReturn), Encoding.UTF8, "application/json"), 
    StatusCode = HttpStatusCode.Redirect 
}; 
return res; 
+0

ありがとうございますが、シリアル化はオプションではありません。 Imho、ここでJson.Netを使うのは正しい解決策ではありません。 'text/html'も間違っています。リターン形式はhtmlではなくjsonです。 –

+0

これを試すことができます。コンテンツタイプを "application/json"に変更するだけです。 –

1

Rawitas Krungkaewsの回答は部分的に正しいです。

しかし、あなたの代わりにStringContentのジェネリックObjectContent使用する必要があります。

var res = new HttpResponseMessage() 
{ 
    Content = new ObjectContent<List<Value>>(valuesToReturn, DefaultJsonFormatter), 
    StatusCode = HttpStatusCode.Redirect 
}; 
return res; 

パラメータDefaultはMediaTypeFormatterです。最初にHTTPステータスコード304は、を持っていない

private static readonly MediaTypeFormatter DefaultJsonFormatter 
    = new JsonMediaTypeFormatter(); 
+0

これは完全に機能します。しかし、なぜ 'CreateResponse'がうまくいかなかったのかまだ分かりません。 –

+0

あなたが設定したい 'HttpStatusCode'が正しいものではないと思います。 'HttpStatusCode.NotModified'のドキュメントを見てください:'リソースの内容は転送されません '。すべて正常に動作し、データを返す場合は、単にHttpStatusCodeを与えます。OK ': 'OKはリクエストが成功し、リクエストされた情報がレスポンスにあることを示します' - 誰かに伝える必要はなく、GETをリクエストすると何も変更されませんでした。そして、私は状態コード(Rawitasの答えからコピーされたもの)を 'Redirect'に変更しました。多分それはこのために働いた –

関連する問題