我在使用ServiceStack
返回没有正文的HTTP 204时遇到问题如果我回来:
return new HttpResult() {
StatusCode = HttpStatusCode.NoContent
};
第一次完美运行,但重复调用将导致Fiddler抛出一个错误,说明最后的响应没有正确形成。我相信这是因为内容类型没有明确地设置为application/json
,并且响应带有空字符串或单个空格字符。
由于某种原因在ContentType = "json"
对象上设置HttpResult
会返回HTTP 405响应。 (这是一种好奇心 - 不是我主要的关注点)
如果我返回void,那么响应是HTTP 200,我目前正在使用它,但我想我可以提供首选的204响应。
感谢您的时间。
答案 0 :(得分:4)
如果没有响应,我使用简单的响应过滤器在响应上设置No Content
标头。
使用AppHost
Configure
方法设置过滤器:
GlobalResponseFilters.Add((req, res, obj) => {
// Handle void responses
if(obj == null && res.StatusCode == 200)
{
res.StatusCode = (int)HttpStatusCode.NoContent;
res.StatusDescription = "No Content";
}
});
然后当方法返回void
时,将设置正确的标题。
public void Delete(TestRequest request)
{
// I don't return anything
}
关于JSON的405
错误响应。仅当您发送空响应和状态200
时才会出现这种情况,因为这是格式错误的JSON。但是发送上述204 No Content
可以防止此错误。 See this answer for more info
答案 1 :(得分:3)
我通常会沿着这些方向做点什么
public void Delete(FooRequest request) {
// Perform deletion
base.Response.StatusCode = (int)HttpStatusCode.NoContent;
}
我喜欢这种方法而不是全局响应过滤器,因为这允许我在同一个地方拥有与此请求相关的所有逻辑,而不必记住我拥有的响应过滤器。