gpt4 book ai didi

c# - ASP.NET Core 中的 Ok(null) 与 NoContent() 哪个更有效?

转载 作者:行者123 更新时间:2023-12-04 01:35:03 28 4
gpt4 key购买 nike

两者最终都会产生一个空的 204 状态响应,但哪个更快?

显然,如果你遵循 DRY 指南,写起来会更干净

return Ok(something);

而不是
if (something == null)
{
return NoContent()
}
else
{
return Ok(something);
}

查源后, NoContent()转换为调用 StatusCode(204) , 至于 Ok(null)我没有深入了解他们究竟在哪里检查(如果他们这样做的话)是否为空值,如果它为空,则决定返回一个 StatusCode 204(或以其他方式处理它)。

我个人认为 NoContent()将产生更快的性能,即使我们将要讨论的差异只有几分之一秒。

最佳答案

当您调用 return NoContent() 时,它​​会返回 StatusCodeResult NoContentResult

当要执行 StatusCodeResult 时,它​​所做的只是 setting the status code on the response :

public override void ExecuteResult(ActionContext context)
{
// snip boilerplate code

context.HttpContext.Response.StatusCode = StatusCode;
}

现在,当您调用 return Ok(something) 时,实际返回的是 OkObjectResult(something) 。顾名思义, OkObjectResult 就是 ObjectResult

并且有很多很多方法可以将对象结果写入输出,这就是 MVC 的内部机制发挥作用的地方。

当要执行响应时,如果是 ObjectResult ,则为 the registered IActionResultExecutor<ObjectResult> is resolved and ExecuteAsync() is called

使用默认 MVC 注册时,这是 ObjectResultExecutor 。它的 ExecuteAsync() 将其格式化程序选择(即,用于将提供的 ObjectResult 实际写入线路的已注册格式化程序)卸载到恰当命名的 OutputFormatterSelector ,并将其注入(inject)其构造函数中。

当然,默认情况下,这是 DefaultOutputFormatterSelector 。现在这个类 pulls its output formatters 来自 MvcOptions.OutputFormatters ,它在 default configuration 中包含:
  • HttpNoContentOutputFormatter
  • StringOutputFormatter
  • StreamOutputFormatter
  • SystemTextJsonOutputFormatter

  • 以该顺序。现在对于实际的选择(忽略内容协商代码,因为这里没有内容),选择器遍历注册的格式化程序并选择第一个 returns true for CanWriteResult() 。如果 HttpNoContentOutputFormatter 设置为 TreatNullValueAsNoContent (默认情况下),并且要返回的 Objectnull ,那么它确实会返回。

    然后运行更多代码,最后在该格式化程序 doing this 上调用 WriteAsync() :
    public Task WriteAsync(OutputFormatterWriteContext context)
    {
    var response = context.HttpContext.Response;
    response.ContentLength = 0;

    if (response.StatusCode == StatusCodes.Status200OK)
    {
    response.StatusCode = StatusCodes.Status204NoContent;
    }

    return Task.CompletedTask;
    }

    所以,是的,更多的代码运行。但是,这是否真的很明显,应该由你来衡量。

    现在,您是否真的希望 Ok(null) 返回 204 而不是 200 是 up for debate ;您可以在启动时使用以下代码选择退出:
    services.AddMvc(options => 
    {
    var noContentFormatter = options.OutputFormatters.OfType<HttpNoContentOutputFormatter>().FirstOrDefault();
    if (noContentFormatter != null)
    {
    noContentFormatter.TreatNullValueAsNoContent = false;
    }
    });

    关于c# - ASP.NET Core 中的 Ok(null) 与 NoContent() 哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59861379/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com