【问题标题】:Return HTML from ASP.NET Web API ASP.NET Core 2 and get http status 406从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406
【发布时间】:2018-03-29 08:38:21
【问题描述】:

这是Return HTML from ASP.NET Web API的后续报道。

我按照说明操作,但在浏览器中出现错误 406。 我的代码:

    [Produces("text/html")]
    [Route("api/[controller]")]
    public class AboutController : Controller
    {
        [HttpGet]
        public string Get()
        {
            return "<html><body>Welcome</body></html>"; 
        }
...

而且,简单地说:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}

当我删除 Produces 行时,我会在浏览器中看到纯文本 &lt;html&gt;&lt;body&gt;Welcome&lt;/body&gt;&lt;/html&gt;(没有错误)。

我错过了什么?谢谢。

【问题讨论】:

标签: c# asp.net-core


【解决方案1】:

正如KTCO 指出的here

AspNetCore 2.0开始,推荐使用ContentResult 而不是Produce 属性

解决办法是:

[HttpGet]
public ContentResult Get()
{
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int) HttpStatusCode.OK,
        Content = "<html><body>Welcome</body></html>"
    };
}

无需更改AddMvc(当然也没有Produce 属性)。

我希望这对某人有所帮助。

【讨论】:

  • 在 NetCore v3.1 中,您还可以使用 int 常量类 StatusCodes(使用 Microsoft.AspNetCore.Http;),因此,我们可以使用:StatusCode = StatusCodes.Status200OK
  • 顺便说一句,如果你像我一样需要传递额外的编码,你可以在第三次重载中使用BaseController.Content()
【解决方案2】:

您需要在使用Produces 属性时发送的请求中将Content-Type 标头添加到text/html

如果您通过浏览器发送,那么它会很好,因为浏览器默认发送Content-type 标头为text/html

【讨论】:

  • 不确定我理解你的意思:首先浏览器正在发送请求,所以我无法控制它;第二个根据docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting“Web 浏览器倾向于提供包含多种格式的 Accept 标头,包括通配符。默认情况下,当框架检测到请求来自浏览器时,它将忽略 Accept 标头,而是以应用程序配置的格式返回内容(除非另有配置,否则为 JSON)”。
  • 谢谢 - 我看到了你的编辑。然而,这正是我的问题:它应该工作,但它不适合我。为什么 ?我虽然我的问题很清楚,因为我确实指定了浏览器:“......按照说明操作,但我在 browser 中收到错误 406”。
  • 能否通过浏览器的开发者工具验证浏览器发送的请求的content-type是text/html
  • 好主意。我尝试了 4 个浏览器和 Postman,但没有专门检查请求 Content-Type 标头。我会很快回到这里。
  • @FrankMonroe 有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 2015-01-05
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多