从ASP.NET Web API返回HTML


120

如何从ASP.NET MVC Web API控制器返回HTML?

我尝试了以下代码,但由于未定义Response.Write,因此出现了编译错误:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }

4
如果要返回HTML,为什么要使用WebAPI?我的意思是这就是ASP.NET MVC和ASP.NET WebForms的目的。
Stilgar 2014年

谢谢,太好了。我将控制器更改为常规控制器。
Andrus 2014年

18
@Stilgar一个原因可能是他不使用MVC堆栈,既不使用任何渲染引擎,但仍想为某些HTML提供服务器外观。一个用例可以是您拥有一个Web Api,该Web Api通过客户端模板引擎为一些HTML提供了功能,该引擎将在以后的阶段中呈现所有内容。
Patrick Desjardins 2015年

3
@Stilgar我遇到的另一个用例是,当用户单击您通过电子邮件提供的链接时,返回一个html页面以提供对帐户创建确认的反馈
wiwi

Answers:


257

ASP.NET核心。方法1

如果您的Controller扩展了,ControllerBase或者Controller您可以使用Content(...)方法:

[HttpGet]
public ContentResult Index() 
{
    return base.Content("<div>Hello</div>", "text/html");
}

ASP.NET核心。方法2

如果选择不从Controller类扩展,则可以创建new ContentResult

[HttpGet]
public ContentResult Index() 
{
    return new ContentResult 
    {
        ContentType = "text/html",
        Content = "<div>Hello World</div>"
    };
}

旧版ASP.NET MVC Web API

返回具有媒体类型的字符串内容text/html

public HttpResponseMessage Get()
{
    var response = new HttpResponseMessage();
    response.Content = new StringContent("<div>Hello World</div>");
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
    return response;
}

1
它不支持ASP.NET MVC核心HttpResponseMessage
Parshuram Kalvikatte

@Parshuram我刚刚检查了您的声明。我可以在ASP.NET Core中使用HttpResponseMessage。它位于System.Net.Http下。
Andrei

谢谢,但是现在MediaTypeHeaderValue不支持
Parshuram Kalvikatte

3
当我使用ASP.NET MVC 5执行此操作时,得到响应。我没有得到任何HTML内容。我收到的只是“ StatusCode:200,ReasonPhrase:'OK',版本:1.1,内容:System.Net.Http.StringContent,标头:{Content-Type:text / html}”
guyfromfargo

@guyfromfargo您尝试过[Produces]方法吗?
安德烈(Andrei)

54

从AspNetCore 2.0开始,在这种情况下,建议使用ContentResult代替Produce属性。参见:https : //github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

这不依赖于序列化也不依赖于内容协商。

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

4
我完全无法在2.0上获得“产生”的答案,但是这很好用。
phil17年

如果要显示文件中的html,只需添加“ var content = System.IO.File.ReadAllText(“ index.html”);“
帕维尔·萨莫里连科

4
是的,如果您使用的是ASP.NET Core 2.0,这就是方法!
詹姆斯·斯科特

如果HTML文件位于本地目录中并且还具有css,js链接,该怎么办。那我们如何服务文件呢?
Lingam

对于Razor Pages,您可以调用PageModel Content()方法,而不是直接创建ContentResult。我不确定这是否也适用于Controllers。
carlin.scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.