Renvoyer du HTML à partir de l'API Web ASP.NET


120

Comment retourner du HTML à partir du contrôleur API Web ASP.NET MVC?

J'ai essayé le code ci-dessous mais j'ai eu une erreur de compilation car Response.Write n'est pas défini:

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

4
Pourquoi utilisez-vous WebAPI si vous souhaitez renvoyer du HTML? Je veux dire que c'est à cela que servent ASP.NET MVC et ASP.NET WebForms.
Stilgar

Merci, excellent. J'ai changé de contrôleur en contrôleur régulier.
Andrus

18
@Stilgar Une des raisons aurait pu être qu'il n'utilise pas la pile MVC, ni aucun moteur de rendu, mais qu'il souhaite tout de même fournir une façade serveur à certains Html. Un cas d'utilisation peut être que vous avez une API Web qui donne du HTML avec un moteur de création de modèles côté client qui rendra tout dans une étape ultérieure.
Patrick Desjardins

3
@Stilgar Un autre cas d'utilisation que j'ai rencontré est le retour d'une page html pour fournir des commentaires pour une confirmation de création de compte, lorsque l'utilisateur clique sur le lien que vous fournissez par e
wiwi

Réponses:


257

ASP.NET Core. Approche 1

Si votre contrôleur s'étend ControllerBaseou Controllervous pouvez utiliser la Content(...)méthode:

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

ASP.NET Core. Approche 2

Si vous choisissez de ne pas étendre les Controllerclasses, vous pouvez créer de nouvelles ContentResult:

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

API Web MVC ASP.NET héritée

Renvoyer le contenu de la chaîne avec le type 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
Il ne prend pas en charge dans ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte

@Parshuram Je viens de vérifier votre déclaration. Je peux utiliser HttpResponseMessage dans ASP.NET Core. Il se trouve sous System.Net.Http.
Andrei

ohk merci mais maintenant MediaTypeHeaderValue ne supporte pas
Parshuram Kalvikatte

3
Lorsque je fais cela en utilisant ASP.NET MVC 5, j'obtiens la réponse. Je ne récupère aucun contenu HTML. Tout ce que je reçois est "StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StringContent, Headers: {Content-Type: text / html}"
guyfromfargo

@guyfromfargo avez-vous essayé l' [Produces]approche?
Andrei

54

À partir d'AspNetCore 2.0, il est recommandé d'utiliser à la ContentResultplace de l' Produceattribut dans ce cas. Voir: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Cela ne repose pas sur la sérialisation ni sur la négociation de contenu.

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

4
Je n'ai pas pu obtenir la réponse «produit» pour fonctionner du tout sur 2.0, mais cela fonctionne très bien.
philw

Si vous souhaitez afficher un code HTML à partir d'un fichier, ajoutez simplement "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko

4
Oui, si vous utilisez ASP.NET Core 2.0, c'est la voie à suivre!
James Scott

Que faire si le fichier HTML est dans le répertoire local et qu'il a également un lien css, js. Comment servir le dossier alors?
Lingam

Pour Razor Pages, vous pouvez appeler la méthode PageModel Content () au lieu de créer directement ContentResult. Je ne sais pas si cela est également disponible pour les contrôleurs.
carlin.scott le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.