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