ASP.Net WebApi控制器应该返回204而不是空值[HttpResponseMessage]。

5

当所选资源未找到时,我希望我的控制器返回一个204(无内容)的HttpResponseMessage。

通常我会这样编写代码:

public Contracts.IRoom Get(HttpRequestMessage request, int id)
        {
            return _RoomRepo.GetAllRooms().Where(r => r.Id == id).FirstOrDefault();            
        }

但是这样会得到一个响应代码200(已确认)和数据null

为了达到我想要的效果,我需要编写以下代码:

public HttpResponseMessage Get(HttpRequestMessage request, int id)
{
    var room = _RoomRepo.GetAllRooms().Where(r => r.Id == id).FirstOrDefault();
    if (room != null)
        return request.CreateResponse(System.Net.HttpStatusCode.OK, room);
    else
        return request.CreateResponse(System.Net.HttpStatusCode.NoContent, room);
}

有没有更简单的方法实现这个功能呢?看起来asp.net团队可能已经在MVC 6中解决了这个问题,正如在ASP.Net文档中所述。


1
通常在找不到所选资源时会返回404 Not Found状态码;如果您PUT或DELETE资源并且没有返回任何数据,通常会使用204 No Content。如果您的API是供内部使用的,则您的方法可能是可以接受的,但如果您的API被他人使用,则应该采用更符合惯用法的用法,或者确保您的文档非常清楚地说明它正在返回非标准结果代码。 - David Keaveny
1个回答

2
Web API引擎本身不会创建所有类型的响应。在您的情况下,它不知道“null”的含义,即使您有多个与数据库交互的语句,其中一些返回null,其他返回一些数据。因此,在这种情况下,API无法检测到“NoContent”。
实际上,您需要自己为使用您的api的用户创建可理解的响应类型。
您正在尽最大努力,因为这正是控制器类的确切角色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接