如何使用ServiceStack成功DELETE返回HTTP 204响应

时间:2014-08-12 09:18:06

标签: c# servicestack

我在使用ServiceStack

返回没有正文的HTTP 204时遇到问题

如果我回来:

return new HttpResult() {
    StatusCode = HttpStatusCode.NoContent 
};

第一次完美运行,但重复调用将导致Fiddler抛出一个错误,说明最后的响应没有正确形成。我相信这是因为内容类型没有明确地设置为application/json,并且响应带有空字符串或单个空格字符。

由于某种原因在ContentType = "json"对象上设置HttpResult会返回HTTP 405响应。 (这是一种好奇心 - 不是我主要的关注点)

如果我返回void,那么响应是HTTP 200,我目前正在使用它,但我想我可以提供首选的204响应。

感谢您的时间。

2 个答案:

答案 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;
}

我喜欢这种方法而不是全局响应过滤器,因为这允许我在同一个地方拥有与此请求相关的所有逻辑,而不必记住我拥有的响应过滤器。