从 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
行时,我会在浏览器中看到纯文本 <html><body>Welcome</body></html>
(没有错误)。
我错过了什么?谢谢。
【问题讨论】:
详细了解为什么您会在此处收到 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