Kembalikan HTML dari ASP.NET Web API

120

Bagaimana cara mengembalikan HTML dari pengontrol API Web ASP.NET MVC?

Saya mencoba kode di bawah ini tetapi mendapat kesalahan kompilasi karena Response.Write tidak ditentukan:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }
Andrus
sumber
4
Mengapa Anda menggunakan WebAPI jika Anda ingin mengembalikan HTML? Maksud saya ini adalah untuk ASP.NET MVC dan ASP.NET WebForms.
Stilgar
Terima kasih, luar biasa. Saya mengubah pengontrol ke pengontrol biasa.
Andrus
18
@Stilgar Salah satu alasannya mungkin karena dia tidak menggunakan tumpukan MVC, tidak juga mesin render, tetapi masih ingin menyediakan fasad server ke beberapa Html. Contoh kasusnya adalah Anda memiliki Api Web yang memberikan beberapa Html dengan mesin template sisi klien yang akan merender semuanya di tahap selanjutnya.
Patrick Desjardins
3
@Stilgar Kasus penggunaan lain yang saya temui adalah mengembalikan halaman html untuk memberikan umpan balik untuk konfirmasi pembuatan akun, ketika pengguna mengklik link yang Anda berikan melalui email
wiwi

Jawaban:

257

ASP.NET Core. Pendekatan 1

Jika Pengontrol Anda meluas ControllerBaseatau ControllerAnda dapat menggunakan Content(...)metode:

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

ASP.NET Core. Pendekatan 2

Jika Anda memilih untuk tidak memperluas dari Controllerkelas, Anda dapat membuat baru ContentResult:

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

API Web ASP.NET MVC lama

Kembalikan konten string dengan tipe media 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
sumber
1
Ini tidak mendukung ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte
@Parshuram Saya baru saja memeriksa pernyataan Anda. Saya dapat menggunakan HttpResponseMessage di ASP.NET Core. Itu terletak di bawah System.Net.Http.
Andrei
ohk terima kasih tapi sekarang MediaTypeHeaderValue tidak mendukung
Parshuram Kalvikatte
3
Ketika saya melakukan ini menggunakan ASP.NET MVC 5 saya mendapatkan respons. Saya tidak mendapatkan kembali konten HTML apa pun. Yang saya terima hanyalah "StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StringContent, Headers: {Content-Type: text / html}"
guyfromfargo
@ Guyfromfargo sudahkah Anda mencoba [Produces]pendekatan?
Andrei
54

Dimulai dengan AspNetCore 2.0, dalam kasus ini disarankan untuk menggunakan ContentResultsebagai ganti Produceatribut. Lihat: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Ini tidak bergantung pada serialisasi atau pada negosiasi konten.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}
KTCO
sumber
4
Saya tidak bisa mendapatkan jawaban "menghasilkan" untuk bekerja sama sekali di 2.0, namun ini berfungsi dengan baik.
philw
Jika Anda ingin menampilkan html dari file, cukup tambahkan "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko
4
Yup, jika Anda menggunakan ASP.NET Core 2.0 ini adalah cara yang tepat!
James Scott
Bagaimana jika file HTML ada di direktori lokal dan juga memiliki css, js linked. Bagaimana kita melayani file itu?
Lingam
Untuk Razor Pages, Anda bisa memanggil metode PageModel Content () alih-alih membuat ContentResult secara langsung. Saya tidak yakin apakah ini tersedia untuk Pengontrol juga.
carlin.scott