Zwróć kod HTML z interfejsu API sieci Web ASP.NET

120

Jak zwrócić kod HTML z kontrolera interfejsu API sieci Web ASP.NET MVC?

Wypróbowałem poniższy kod, ale wystąpił błąd kompilacji, ponieważ nie zdefiniowano Response.Write:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }
Andrus
źródło
4
Dlaczego używasz WebAPI, jeśli chcesz zwrócić HTML? Mam na myśli to, do czego służą ASP.NET MVC i ASP.NET WebForms.
Stilgar
Dziękuję, świetnie. Zmieniłem kontroler na zwykły kontroler.
Andrus,
18
@Stilgar Jednym z powodów mogło być to, że nie używa on stosu MVC ani żadnego silnika renderującego, ale nadal chce udostępniać fasadę serwera do jakiegoś HTML. Przykładem użycia może być to, że masz interfejs API sieci Web, który udostępnia kod HTML z silnikiem szablonów po stronie klienta, który renderuje wszystko na późniejszym etapie.
Patrick Desjardins
3
@Stilgar Innym przypadkiem użycia, który napotkałem, jest zwrócenie strony html w celu przekazania opinii na temat potwierdzenia utworzenia konta, gdy użytkownik kliknie link podany przez e
wiwi

Odpowiedzi:

257

ASP.NET Core. Podejście 1

Jeśli twój kontroler się rozszerza ControllerBaselub Controllermożesz użyć Content(...)metody:

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

ASP.NET Core. Podejście 2

Jeśli zdecydujesz się nie wychodzić z Controllerzajęć, możesz utworzyć nowe ContentResult:

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

Starsza wersja interfejsu API sieci Web ASP.NET MVC

Zwróć treść ciągu z typem multimediów 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
źródło
1
Nie obsługuje w ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte
@Parshuram Właśnie sprawdziłem twoje oświadczenie. Mogę używać HttpResponseMessage w ASP.NET Core. Znajduje się pod System.Net.Http.
Andrei
ohk dzięki, ale teraz MediaTypeHeaderValue nie obsługuje
Parshuram Kalvikatte
3
Kiedy robię to za pomocą ASP.NET MVC 5, otrzymuję odpowiedź. Nie odzyskuję żadnej zawartości HTML. Otrzymuję tylko „StatusCode: 200, ReasonPhrase: 'OK', Wersja: 1.1, Treść: System.Net.Http.StringContent, Nagłówki: {Content-Type: text / html}”
guyfromfargo
@guyfromfargo Czy próbowałeś [Produces]podejścia?
Andrei
54

Począwszy od AspNetCore 2,0, w tym przypadku zaleca się użycie ContentResultzamiast Produceatrybutu. Zobacz: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Nie polega to na serializacji ani na negocjowaniu zawartości.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}
KTCO
źródło
4
Nie udało mi się uzyskać odpowiedzi „produkuje”, aby w ogóle działała w wersji 2.0, ale działa to dobrze.
philw
Jeśli chcesz wyświetlić kod HTML z pliku, po prostu dodaj "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko
4
Tak, jeśli używasz ASP.NET Core 2.0, to jest droga!
James Scott
A co, jeśli plik HTML znajduje się w katalogu lokalnym i ma również link css, js. Jak więc obsługujemy plik?
Lingam
W przypadku Razor Pages można wywołać metodę PageModel Content () zamiast bezpośrednio tworzyć ContentResult. Nie jestem pewien, czy jest to również dostępne dla kontrolerów.
carlin.scott