Retornar HTML da API Web ASP.NET


120

Como retornar HTML do controlador ASP.NET MVC Web API?

Tentei o código abaixo, mas obtive um erro de compilação, pois Response.Write não está definido:

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

4
Por que você está usando WebAPI se deseja retornar HTML? Quero dizer, é para isso que servem os ASP.NET MVC e ASP.NET WebForms.
Stilgar

Obrigado, excelente. Mudei controlador para controlador normal.
Andrus

18
@Stilgar Uma razão pode ter sido que ele não usa a pilha MVC, nem qualquer mecanismo de renderização, mas ainda deseja fornecer uma fachada de servidor para algum Html. Um caso de uso pode ser que você tenha uma API da Web que fornece algum Html com um mecanismo de modelagem do lado do cliente que renderizará tudo em um estágio posterior.
Patrick Desjardins

3
@Stilgar Outro caso de uso que encontrei é o retorno de uma página html para fornecer feedback para uma confirmação de criação de conta, quando o usuário clica no link que você forneceu por e
wiwi

Respostas:


257

ASP.NET Core. Abordagem 1

Se o seu controlador estende ControllerBaseou Controllervocê pode usar o Content(...)método:

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

ASP.NET Core. Abordagem 2

Se você optar por não estender as Controlleraulas, pode criar novos ContentResult:

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

API da Web ASP.NET MVC herdada

Retorne o conteúdo da string com o tipo de mídia 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
Não é compatível com ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte

@Parshuram Acabei de verificar sua declaração. Posso usar HttpResponseMessage no ASP.NET Core. Ele está localizado em System.Net.Http.
Andrei

ohk obrigado, mas agora MediaTypeHeaderValue não é compatível
Parshuram Kalvikatte

3
Quando faço isso usando a ASP.NET MVC 5, recebo a resposta. Não recebo nenhum conteúdo HTML de volta. Tudo o que recebo é "StatusCode: 200, ReasonPhrase: 'OK', Versão: 1.1, Conteúdo: System.Net.Http.StringContent, Cabeçalhos: {Content-Type: text / html}"
guyfromfargo

@guyfromfargo você já tentou [Produces]abordagem?
Andrei

54

A partir do AspNetCore 2.0, é recomendado usar ao ContentResultinvés do Produceatributo neste caso. Veja: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Isso não depende de serialização nem de negociação de conteúdo.

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

4
Não consegui fazer com que a resposta "produz" funcionasse no 2.0; no entanto, funciona bem.
philw 01 de

Se você quiser mostrar um html do arquivo, basta adicionar "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko

4
Sim, se você estiver usando o ASP.NET Core 2.0, este é o caminho a seguir!
James Scott

E se o arquivo HTML estiver no diretório local e também tiver css, js vinculado. Então, como servimos o arquivo?
Lingam

Para Razor Pages, você pode chamar o método PageModel Content () em vez de criar ContentResult diretamente. Não tenho certeza se isso está disponível para controladores também.
carlin.scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.