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);
    }
 }

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;
}

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>"
    };
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.