【问题标题】:ASP.NET Web API and Status Code For Null Response空响应的 ASP.NET Web API 和状态代码
【发布时间】:2016-11-16 12:32:41
【问题描述】:

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

【问题讨论】:

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

标签: asp.net-mvc-4 asp.net-web-api


【解决方案1】:

就我个人而言,我会根据反对派的评论对控制器进行检查,但您的要求是完全合理的。再次使用每个控制器附加(或全局注册)的操作过滤器,您可以按照以下方式做一些事情:

示例模型:

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);

    }
}

【讨论】:

    【解决方案2】:

    我同意 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");
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多