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

本文关键字:返回 HTTP 响应 DELETE 成功 ServiceStack | 更新日期: 2023-09-27 18:17:40

我使用ServiceStack返回没有正文的HTTP 204时遇到问题

如果返回:

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

第一次它工作得很好,但是重复调用会导致Fiddler抛出一个错误,指出最后一个响应没有正确形成。我认为这是因为内容类型没有显式设置为application/json,并且响应返回一个空字符串或单个空格字符。

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

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

感谢您的宝贵时间。

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

我通常是这样做的

public void Delete(FooRequest request) {
    // Perform deletion
    base.Response.StatusCode = (int)HttpStatusCode.NoContent;
}

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

如果没有响应,我使用一个简单的响应过滤器来设置响应上的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将防止这个错误。