【问题标题】:Why returning null does nothing in web api project?为什么在 web api 项目中返回 null 什么都不做?
【发布时间】:2021-07-26 07:02:30
【问题描述】:

我是 asp.net core 3 的新手,如果我的问题听起来太简单,对不起,下面是我的控制器类:

[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase {
   List<string> _fruit = new List<string> { "Pear", "Lemon", "Peach" };
  
   [HttpGet("fruit")]
   public IEnumerable<string> MethodXXX() {
      return _fruit;   
   }
   ...
}

所以当我路由到my/fruit 时,我会得到一个字符串列表。

但如果我将 MethodXXX 更改为:

[HttpGet("fruit")]
public IEnumerable<string> MethodXXX() {
   return null;
}

然后浏览器总是回退到之前的url,比如我一开始是my/other,然后我把url改成my/fruit,可以看到浏览器发送了一个新的请求,url也变了到my/fruit 一小段时间,然后又回到my/other

这种行为是为了什么?我很确定我读过一本说你可以从动作方法返回 null 的书?

【问题讨论】:

  • 可能是缓存问题。清除缓存并重试
  • 请在 Chrome 的“网络”选项卡中分享请求和响应详细信息以获取请求。
  • 另外,返回null非常奇怪一个可枚举的。如“几乎肯定是错误的”。 Enumerable.Empty 更有可能是您应该做的事情。

标签: c# asp.net-core .net-core


【解决方案1】:

这是 .Net Core 3 中新引入的一种行为,如果 Action 方法返回 null,它只会发送一个 204 响应,表示 No Content。如果您希望从操作方法返回 null,您可以通过在 Startup.cs 文件中使用以下代码块来覆盖此行为,该代码块删除相应的输出格式化程序,您将从 API 响应中返回 null。

services.AddControllers(options =>
        {
            options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
        });

【讨论】:

  • 感谢您的回答。那么为什么浏览器会回退到之前的 url?为什么不停留在当前 url,即 204 响应的接收者?
  • 答案就在这里:developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 如果你打开它,第一行会指出“HTTP 204 No Content 成功状态响应码表明请求已成功,但客户端不需要离开其当前页面。”这就是它不导航到另一条路线的原因。由于它不导航,因此它看起来像回退到与以前相同的 URL,但它没有明确发送另一个回退请求,而只是保持在与以前相同的页面上。
  • 嗨,你能看看这个问题吗stackoverflow.com/questions/68688785/…
【解决方案2】:

你变化最大

[HttpGet]
[ActionName("fruit")]
public IEnumerable<string> MethodXXX() {
return null;
}

【讨论】:

  • 欢迎来到 StackOverflow。请提供一些您认为您提出的解决方案可能对 OP 有帮助的理由。
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多