2017-09-06 94 views
1

我綁得與設置狀態代碼一個很好的和簡單的API,並得到招搖(swashbuckle)的設置狀態代碼和內容

首先文檔,我的控制器是這樣的:

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

一切都很好,Swagger顯示json格式的結果。問題是,我無法設置狀態碼(例如,如果數據庫錯誤,我可以設置爲Err 500或s.th.)。

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

所以,我想這也許是一個招搖-問題。

下一步是檢驗以鉻合金飛鏢插件的API,但是相同的: 狀態代碼是304,但身體(結果/內容)是空的:

enter image description here

肯定是有結果: enter image description here

有關如何正確設置正文與HttpResponseMessage的任何想法? 或者,當返回值例如是什麼時,關於如何在api-method中設置狀態碼的想法。 List<Value>

回答

3

起初,HTTP狀態代碼304沒有。 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'也是錯誤的。返回格式是json,而不是html。 –

+0

你可以試試這個。您只需將內容類型更改爲「application/json」即可。 –

1

Rawitas Krungkaews的回答是部分正確的。

但是,你應該使用一般ObjectContent代替StringContent

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

參數Default是MediaTypeFormatter。我覺得你可以在你的類象它聲明:

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

這工作完美。但仍然不知道爲什麼'CreateResponse'不起作用。 –

+0

猜你想設置的'HttpStatusCode'不是正確的。看一看'HttpStatusCode.NotModified'的文檔:'資源的內容不被傳輸'。如果一切正常,你返回數據,只需給它一個'HttpStatusCode。OK':'OK表示請求成功並且請求的信息在響應中 - - 不需要告訴某人,當請求GET時沒有任何修改。並且看到,我將狀態碼(從Rawitas的答案中複製)更改爲「重定向」。也許這是因爲這個 –