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);
    }
 }
Andrus
fonte
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;
}
Andrei
fonte
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>"
    };
}
KTCO
fonte
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