Restituisce HTML dall'API Web ASP.NET


120

Come restituire HTML dal controller API Web ASP.NET MVC?

Ho provato il codice seguente ma ho ricevuto un errore di compilazione poiché Response.Write non è definito:

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

4
Perché stai usando WebAPI se vuoi restituire HTML? Voglio dire, questo è ciò a cui servono ASP.NET MVC e ASP.NET WebForms.
Stilgar

Grazie, eccellente. Ho cambiato controller in controller normale.
Andrus

18
@Stilgar Una ragione potrebbe essere stata che non usa lo stack MVC, né alcun motore di rendering, ma vuole comunque fornire una facciata server ad alcuni Html. Un caso d'uso può essere quello di avere un'API Web che fornisce un po 'di Html con un motore di modelli lato client che renderà tutto in una fase successiva.
Patrick Desjardins

3
@Stilgar Un altro caso d'uso che ho riscontrato è la restituzione di una pagina html per fornire feedback per la conferma della creazione di un account, quando l'utente fa clic sul collegamento fornito tramite e
Wiwi

Risposte:


257

ASP.NET Core. Approccio 1

Se il controller si estende ControllerBaseo Controllerè possibile utilizzare il Content(...)metodo:

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

ASP.NET Core. Approccio 2

Se scegli di non estendere dalle Controllerclassi, puoi creare nuovi ContentResult:

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

API Web ASP.NET MVC legacy

Restituisce contenuto stringa con tipo di supporto 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
Non è supportato in ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte

@Parshuram ho appena controllato la tua dichiarazione. Posso usare HttpResponseMessage in ASP.NET Core. Si trova in System.Net.Http.
Andrei

ohk grazie ma ora MediaTypeHeaderValue non supporta
Parshuram Kalvikatte

3
Quando lo faccio usando ASP.NET MVC 5 ottengo la risposta. Non ricevo indietro nessuno dei contenuti HTML. Tutto quello che ricevo è "StatusCode: 200, ReasonPhrase: 'OK', Versione: 1.1, Content: System.Net.Http.StringContent, Headers: {Content-Type: text / html}"
guyfromfargo

@ guyfromfargo hai provato l' [Produces]approccio?
Andrei

54

A partire da AspNetCore 2.0, in questo caso si consiglia di utilizzare al ContentResultposto Producedell'attributo. Vedi: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Questo non si basa sulla serializzazione né sulla negoziazione del contenuto.

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

4
Non sono riuscito a far funzionare la risposta "produce" su 2.0, tuttavia funziona bene.
philw

Se vuoi mostrare un html da file, aggiungi semplicemente "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko

4
Sì, se stai usando ASP.NET Core 2.0 questa è la strada da percorrere!
James Scott

E se il file HTML si trova nella directory locale e ha anche css, js collegato. Come serviamo il file allora?
Lingam

Per Razor Pages, puoi chiamare il metodo PageModel Content () invece di creare direttamente ContentResult. Non sono sicuro che sia disponibile anche per i controller.
carlin.scott
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.