Devolver HTML de ASP.NET Web API

120

¿Cómo devolver HTML desde el controlador de API web ASP.NET MVC?

Probé el siguiente código pero obtuve un error de compilación ya que Response.Write no está definido:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }
Andrus
fuente
4
¿Por qué utiliza WebAPI si desea devolver HTML? Quiero decir, para esto sirven ASP.NET MVC y ASP.NET WebForms.
Stilgar
Gracias, excelente. Cambié el controlador al controlador regular.
Andrus
18
@Stilgar Una razón podría haber sido que no usa la pila MVC, ni ningún motor de renderizado, pero aun así quiere proporcionar una fachada de servidor a algunos Html. Un caso de uso puede ser que tenga una Web Api que proporcione algo de Html con un motor de plantillas del lado del cliente que renderizará todo en una etapa posterior.
Patrick Desjardins
3
@Stilgar Otro caso de uso que encontré es devolver una página html para proporcionar comentarios para una confirmación de creación de cuenta, cuando el usuario hace clic en el enlace que proporciona por correo electrónico
wiwi

Respuestas:

257

ASP.NET Core. Enfoque 1

Si su controlador se extiende ControllerBaseo Controllerpuede usar el Content(...)método:

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

ASP.NET Core. Enfoque 2

Si elige no extenderse de las Controllerclases, puede crear nuevas ContentResult:

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

API web de ASP.NET MVC heredada

Devuelve el contenido de la cadena con el tipo de medio 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
fuente
1
No es compatible con ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte
@Parshuram Acabo de revisar tu declaración. Puedo usar HttpResponseMessage en ASP.NET Core. Se encuentra en System.Net.Http.
Andrei
ohk gracias pero ahora MediaTypeHeaderValue no es compatible
Parshuram Kalvikatte
3
Cuando hago esto usando ASP.NET MVC 5, obtengo la respuesta. No recupero el contenido HTML. Todo lo que recibo es "StatusCode: 200, ReasonPhrase: 'OK', Versión: 1.1, Contenido: System.Net.Http.StringContent, Encabezados: {Content-Type: text / html}"
guyfromfargo
@guyfromfargo has intentado [Produces]acercarte?
Andrei
54

Comenzando con AspNetCore 2.0, se recomienda usar en ContentResultlugar del Produceatributo en este caso. Ver: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Esto no depende de la serialización ni de la negociación de contenido.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}
KTCO
fuente
4
No pude conseguir que la respuesta "produce" funcione en absoluto en 2.0, sin embargo, esto funciona bien.
philw
Si desea mostrar un html desde un archivo, simplemente agregue "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko
4
Sí, si está utilizando ASP.NET Core 2.0, ¡este es el camino a seguir!
James Scott
¿Qué pasa si el archivo HTML está en el directorio local y también tiene css, js vinculado? Entonces, ¿cómo servimos el archivo?
Lingam
Para Razor Pages, puede llamar al método PageModel Content () en lugar de crear ContentResult directamente. No estoy seguro de si esto también está disponible para controladores.
carlin.scott