从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406

Posted

技术标签:

【中文标题】从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406【英文标题】:Return HTML from ASP.NET Web API ASP.NET Core 2 and get http status 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;(没有错误)。

我错过了什么?谢谢。

【问题讨论】:

详细了解为什么您会在此处收到 406 响应:github.com/aspnet/AspNetCore/issues/4846 【参考方案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 有帮助吗?

以上是关于从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406

如何从 ASP.net 5 web api 返回文件

从 asp.net web api 发布操作重定向

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

ASP.NET (OWIN) Identity:如何从 Web API 控制器获取 UserID?