Asp.net mvc 4 ASP.NET Web API和空响应的状态代码

Asp.net mvc 4 ASP.NET Web API和空响应的状态代码,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,如果服务层未找到请求的资源,则向Web API控制器返回null;将HttpStatusCode.NotFound响应抛出回客户端的最佳方法是什么,而不必在控制器中硬编码,并通过检查它是否为空?我个人只想根据Oppositional的评论在控制器中进行检查,但您的要求是完全合理的。再次使用每个控制器附加(或全局注册)的操作过滤器,您可以按照以下方式执行操作: 示例模型: public class Foo { public string Bar { get; set; } } 控制器示例

如果服务层未找到请求的资源,则向Web API控制器返回null;将
HttpStatusCode.NotFound
响应抛出回客户端的最佳方法是什么,而不必在控制器中硬编码,并通过检查它是否为空?

我个人只想根据Oppositional的评论在控制器中进行检查,但您的要求是完全合理的。再次使用每个控制器附加(或全局注册)的操作过滤器,您可以按照以下方式执行操作:

示例模型:

public class Foo
{
    public string Bar { get; set; }
}
控制器示例:

public class FoosController : ApiController
{
    [NullObjectActionFilter]
    public Foo Get(string id)
    {
        // - Returns model and 200
        //return new Foo() { Bar = "TEST" };

        // - Returns 404
        //return null;
    }
}
过滤器:

public class NullObjectActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        object outValue = null;
        actionExecutedContext.Response.TryGetContentValue<object>(out outValue);
        if (outValue == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }

        base.OnActionExecuted(actionExecutedContext);

    }
}
公共类NullObjectActionFilter:ActionFilterAttribute
{
公共覆盖无效OnActionExecuted(HttpActionExecuteContext ActionExecuteContext)
{
对象outValue=null;
actionExecutedContext.Response.TryGetContentValue(out outValue);
if(outValue==null)
{
抛出新的HttpResponseException(HttpStatusCode.NotFound);
}
base.OnActionExecuted(actionExecutedContext);
}
}

我同意Mark的观点,即ActionFilter是一种可行的方法——小动作方法是一种好味道

但是,当发生异常时,
HttpActionExecutedContext.Response
可以是
null
;上面显示的NullObjectActionFilter类可以隐藏错误HTTP状态代码。最好检查是否成功退出和HTTP代码是否成功

下面是我使用的一个操作过滤器:

/// <summary>
/// Converts <c>null</c> return values into an HTTP 404 return code.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NullResponseIs404Attribute : ActionFilterAttribute
{

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if ((actionExecutedContext.Response != null) && actionExecutedContext.Response.IsSuccessStatusCode)
        {
            object contentValue = null;
            actionExecutedContext.Response.TryGetContentValue<object>(out contentValue);
            if (contentValue == null)
            {
                actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, "Object not found");
            }
        }
    }

}
//
///将空返回值转换为HTTP 404返回代码。
/// 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
公共密封类NullResponseIs404Attribute:ActionFilterAttribute
{
公共覆盖无效OnActionExecuted(HttpActionExecuteContext ActionExecuteContext)
{
if((actionExecutedContext.Response!=null)&&actionExecutedContext.Response.IsSuccessStatusCode)
{
对象contentValue=null;
actionExecutedContext.Response.TryGetContentValue(OutContentValue);
if(contentValue==null)
{
ActionExecuteContext.Response=ActionExecuteContext.Request.CreateErrorResponse(HttpStatusCode.NotFound,“未找到对象”);
}
}
}
}

您可以在控制器操作方法中返回带有NotFound状态的响应消息;或者,您可以抛出一个异常,并让全局筛选器将异常类型映射到适当的响应。我不知道为什么检查null会是一个问题,控制器操作逻辑必须处理各种条件,并将它们映射到具有适当状态代码的响应。我有一个全局过滤器,如您所说。我不希望在每个控制器操作中都有这些空检查。