在webapi中设置状态代码和内容

时间:2017-09-06 08:02:16

标签: c# asp.net-web-api http-status-codes

我想通过设置状态代码来获得一个漂亮而简单的API,并获得swagger(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

所以,我认为这可能是一个招摇的问题。

下一步是使用Chromes Boomerang-Plugin测试API,但同样: Status-Code为304,但正文(结果/内容)为空:

enter image description here

肯定有结果: enter image description here

有关如何使用HttpResponseMessage正确设置正文的任何​​想法? 或者,当返回值为例如,如何在api-method中设置状态代码的任何想法。 List<Value>

3 个答案:

答案 0 :(得分:3)

首先,HTTP状态代码304没有正文。 304响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。

只需更改状态代码。

答案 1 :(得分: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();

答案 2 :(得分: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;