14

我正在使用 Asp.Net Web Api 的发布版本创建一个 API。如果没有找到结果,我正在尝试传回正确的响应代码 (404)。

First Get Version(抛出多个枚举错误):

public IEnumerable<MyObjectType> Get(int id, string format)
{
    var db = new DbEntities();

    var result = db.pr_ApiSelectMyObjectType(store, id, format).AsEnumerable();
    if (result.Any())
    {
        return result;
    }
    var response = new HttpResponseMessage(HttpStatusCode.NotFound) 
        { Content = new StringContent("Unable to find any results") };
    throw new HttpResponseException(response);
}

第二个获取版本(结果永远不会为空,所以它总是返回 200):

public IEnumerable<MyObject> Get(int id, string format)
{
    var db = new DbEntities();

    var result = db.pr_ApiSelectMyObjectType(store, id, format);
    if (result == null)
    {
        var response = new HttpResponseMessage(HttpStatusCode.NoContent) 
            { Content = new StringContent("Unable to find any results") };
        throw new HttpResponseException(response);
    }
    return result.AsEnumerable();
}

如果没有找到结果,我如何传回 404?我知道我可以使用一个列表,但我有一个自定义 csv 媒体类型格式化程序,它只适用于 IEnumerable 类型,所以我更愿意坚持使用它。

4

3 回答 3

30

null更好的方法是在动作过滤器级别捕获,定义一个具有全局范围的动作过滤器,并从中抛出异常 404:

public class NullFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        var response = actionExecutedContext.Response;

        object responseValue;
        bool hasContent = response.TryGetContentValue(out responseValue);

        if (!hasContent)
            throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

通过这种方式,您不需要Any在您的操作中使用,代码会更简单:

public IEnumerable<MyObjectType> Get(int id, string format)
{
    using (db = new DbEntities())
    {
       return db.pr_ApiSelectMyObjectType(store, id, format)
                .AsEnumerable();
    }
}
于 2012-10-02T17:42:46.360 回答
5

将结果转换为列表可能是最简单的,显然可以多次枚举:

var result = db.pr_ApiSelectMyObjectType(store, id, format).ToList();
if (!result.Any())
{
    ...
}

当然,这意味着实现整个查询......但大概你最终会在某个时候这样做。

于 2012-10-02T16:55:25.700 回答
0

在你的情况下,而不是返回:

return result.AsEnumerable();

你可以返回空值:

return null;

从调用函数中,您可以检查返回的结果,例如:

var myObject = Get(id, format);
if (myObject == null)
    return NotFound(myObject);
else
    return Ok(myObject);

这样,如果 Get 函数找不到记录,您将得到 404 not found。

于 2019-08-02T01:54:59.687 回答