如何在 ASP.NET Core 控制器中返回自定义 HTTP 响应?

Posted

技术标签:

【中文标题】如何在 ASP.NET Core 控制器中返回自定义 HTTP 响应?【英文标题】:How do I return a custom HTTP response in an ASP.NET Core Controller? 【发布时间】:2021-02-10 08:06:18 【问题描述】:

在 ASP.NET 核心 MVC 中,如何返回自定义 HTTP 响应以及自定义 HTTP 代码?我希望能够自己构建响应,最好从控制器返回。

  public IActionResult Index()
    
          // set custom HTTP response and return
    

....有人获取索引,我应该能够手动发送类似下面的响应,我可以控制响应的各个方面。我什至可以简单地返回我自己构建的字符串。

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

如何在 ASP.NET Core MVC 中执行此操作?

【问题讨论】:

您使用的是什么版本的 ASP.NET Core?您是来自ControllerBase 还是Controller 您不能在响应中手动设置 all 标头,例如Content-LengthConnection: closed,顺便说一句。并且主机网络服务器通常会添加自己的Server: 标头(除非您专门配置外部网络服务器或反向代理服务器,否则您无法控制它)。此外,使用像 ASP.NET Core 这样的框架的全部意义在于避免弄乱 HTTP 的低级细节。 这能回答你的问题吗? Best practice to return errors in ASP.NET Web API 这是***.com/questions/37690114/…的副本 @Mick 不是,这个问题只是询问如何返回状态码。我一直在寻找一种手动构建自己的响应并将其发送给客户的方法。 【参考方案1】:

我意识到我有点眼熟,答案比我最初预期的要简单得多。

        public void Index()
    
        Response.StatusCode = 200;
        Response.StartAsync();

        return;
    

这允许人们自己简单地将数据添加到响应中并将它们发送到客户端。我正在使用 ASP.NET Core 3.1 MVC。

【讨论】:

"ASP.NET Core MVC" 在 ASP.NET Core 3 中并不存在。无论如何,如果您使用这种方法,那么您可能应该从 ControllerBase 派生而不是 Controller .【参考方案2】:

改编来自here的答案...

public IActionResult Index()

    return StatusCode((int)HttpStatusCode.MovedPermanently);

另一个示例,如果您想在响应正文中传回 400 状态代码和验证错误...

public IActionResult Index()

    var validationErrors = _repository.Validate()
    return StatusCode((int)HttpStatusCode.BadRequest, validationErrors);

【讨论】:

以上是关于如何在 ASP.NET Core 控制器中返回自定义 HTTP 响应?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net Core 3.1-如何从控制器返回到 Razor 页面?

ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

ASP.NET Core使用功能开关控制路由访问(续)

如何使用 ASP.NET Core 从查询字符串中读取值?

如何将 ASP.NET Core 5 Web API 控制器操作的失败模型验证结果包装到另一个类中并将响应返回为 OK

ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题