HTML von der ASP.NET-Web-API zurückgeben

120

Wie kann ich HTML vom ASP.NET MVC Web API-Controller zurückgeben?

Ich habe den folgenden Code ausprobiert, aber einen Kompilierungsfehler erhalten, da Response.Write nicht definiert ist:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }
Andrus
quelle
4
Warum verwenden Sie WebAPI, wenn Sie HTML zurückgeben möchten? Ich meine, dafür sind ASP.NET MVC und ASP.NET WebForms gedacht.
Stilgar
Danke, ausgezeichnet. Ich habe den Controller auf einen normalen Controller umgestellt.
Andrus
18
@Stilgar Ein Grund könnte sein, dass er weder den MVC-Stack noch eine Rendering-Engine verwendet, aber dennoch eine Server-Fassade für einige HTML-Dateien bereitstellen möchte. Ein Anwendungsfall kann sein, dass Sie eine Web-API haben, die HTML mit einer clientseitigen Template-Engine bereitstellt, die alles in einem späteren Stadium rendert.
Patrick Desjardins
3
@Stilgar Ein weiterer Anwendungsfall, auf den ich gestoßen bin, ist die Rückgabe einer HTML-Seite, um Feedback für eine Bestätigung der Kontoerstellung zu geben, wenn der Benutzer auf den Link klickt, den Sie per E-Mail bereitstellen
wiwi

Antworten:

257

ASP.NET Core. Ansatz 1

Wenn Ihr Controller erweitert wird ControllerBaseoder ControllerSie die folgende Content(...)Methode verwenden können:

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

ASP.NET Core. Ansatz 2

Wenn Sie nicht aus ControllerKlassen erweitern möchten, können Sie neue erstellen ContentResult:

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

Legacy-ASP.NET MVC-Web-API

String-Inhalt mit Medientyp zurückgeben 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
quelle
1
Es wird nicht in ASP.NET MVC Core unterstützt. HttpResponseMessage
Parshuram Kalvikatte
@Parshuram Ich habe gerade Ihre Aussage überprüft. Ich kann HttpResponseMessage in ASP.NET Core verwenden. Es befindet sich unter System.Net.Http.
Andrei
ohk danke aber jetzt MediaTypeHeaderValue nicht unterstützt
Parshuram Kalvikatte
3
Wenn ich dies mit ASP.NET MVC 5 mache, erhalte ich die Antwort. Ich bekomme keinen HTML-Inhalt zurück. Alles, was ich erhalte, ist "StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Inhalt: System.Net.Http.StringContent, Header: {Inhaltstyp: text / html}"
guyfromfargo
@guyfromfargo hast du versucht, [Produces]Ansatz?
Andrei
54

Ab AspNetCore 2.0 wird in diesem Fall empfohlen, ContentResultanstelle des ProduceAttributs zu verwenden . Siehe: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Dies hängt weder von der Serialisierung noch von der Aushandlung von Inhalten ab.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}
KTCO
quelle
4
Ich konnte die "Produziert" -Antwort überhaupt nicht für 2.0 verwenden, dies funktioniert jedoch einwandfrei.
Philw
Wenn Sie ein HTML aus einer Datei anzeigen möchten, fügen Sie einfach "var content = System.IO.File.ReadAllText (" index.html ");" hinzu.
Pavel Samoylenko
4
Ja, wenn Sie ASP.NET Core 2.0 verwenden, ist dies der richtige Weg!
James Scott
Was ist, wenn sich die HTML-Datei im lokalen Verzeichnis befindet und auch CSS und JS verknüpft sind? Wie dienen wir dann der Datei?
Lingam
Für Razor Pages können Sie die PageModel Content () -Methode aufrufen, anstatt ContentResult direkt zu erstellen. Ich bin mir nicht sicher, ob dies auch für Controller verfügbar ist.
carlin.scott