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.