提问者:小点点

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


我想要得到一个漂亮而简单的带有设置状态代码的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格式的结果。问题是,我不能设置状态代码(比如,如果database-error我可以设置为err500或s.th.)。

null

null

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

现在,状态代码设置正确,但swagger没有显示任何结果。

所以,我想这可能是个大摇大摆的问题。

下一步是用Chromes Boomerang-Plugin测试API,但是相同:Status-Code是304,但是正文(result/content)是空的:

关于如何用HTTPressonSemessage正确设置正文有什么想法吗?或者,当返回值为/code>时,如何在api-method中设置状态代码?


共3个答案

匿名用户

首先,HTTP状态代码304没有正文。304响应不能包含message-body,因此总是由头字段之后的第一个空行终止。

只要更改状态代码。

匿名用户

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

但是,您应该使用泛型而不是:

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

参数是MediaTypeFormatter。我认为你可以像这样在你的类中声明它:

private static readonly MediaTypeFormatter DefaultJsonFormatter 
    = new JsonMediaTypeFormatter();

匿名用户

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;