Trả lại HTML từ ASP.NET Web API


120

Làm cách nào để trả lại HTML từ bộ điều khiển API Web ASP.NET MVC?

Tôi đã thử mã bên dưới nhưng gặp lỗi biên dịch vì Response.Write không được xác định:

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }

4
Tại sao bạn lại sử dụng WebAPI nếu bạn muốn trả về HTML? Ý tôi là đây là những gì ASP.NET MVC và ASP.NET WebForms dành cho.
Stilgar

Cảm ơn bạn, xuất sắc. Tôi đã thay đổi bộ điều khiển thành bộ điều khiển thông thường.
Andrus

18
@Stilgar Một lý do có thể là do anh ta không sử dụng ngăn xếp MVC, không sử dụng bất kỳ công cụ kết xuất nào nhưng vẫn muốn cung cấp mặt tiền máy chủ cho một số Html. Một trường hợp sử dụng có thể là bạn có Web Api cung cấp một số Html với công cụ tạo khuôn mẫu phía máy khách sẽ hiển thị mọi thứ trong giai đoạn sau.
Patrick Desjardins

3
@Stilgar Một trường hợp sử dụng tôi đã gặp được trả lại một trang html để cung cấp thông tin phản hồi cho một xác nhận tạo tài khoản, khi người dùng nhấp vào liên kết mà bạn cung cấp thông qua email
wiwi

Câu trả lời:


257

ASP.NET Core. Phương pháp 1

Nếu Bộ điều khiển của bạn mở rộng ControllerBasehoặc Controllerbạn có thể sử dụng Content(...)phương pháp:

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

ASP.NET Core. Phương pháp 2

Nếu bạn chọn không mở rộng khỏi Controllercác lớp, bạn có thể tạo mới ContentResult:

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

API web ASP.NET MVC kế thừa

Trả lại nội dung chuỗi với loại phương tiện 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
Nó không hỗ trợ trong ASP.NET MVC Lõi HttpResponseMessage
Parshuram Kalvikatte

@Parshuram Tôi vừa kiểm tra báo cáo của bạn. Tôi có thể sử dụng HttpResponseMessage trong ASP.NET Core. Nó nằm trong System.Net.Http.
Andrei

OHK nhờ nhưng bây giờ MediaTypeHeaderValue không hỗ trợ
Parshuram Kalvikatte

3
Khi tôi thực hiện việc này bằng ASP.NET MVC 5, tôi nhận được phản hồi. Tôi không lấy lại bất kỳ nội dung HTML nào. Tất cả tôi nhận được là "StatusCode: 200, ReasonPhrase: 'OK', phiên bản: 1.1, Nội dung: System.Net.Http.StringContent, Headers: {Content-Type: text / html}"
guyfromfargo

@guyfromfargo bạn đã thử [Produces]cách tiếp cận chưa?
Andrei

54

Bắt đầu với AspNetCore 2.0, bạn nên sử dụng ContentResultthay vì Producethuộc tính trong trường hợp này. Xem: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

Điều này không dựa vào tuần tự hóa cũng như thương lượng nội dung.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}

4
Tôi không thể nhận được câu trả lời "sản xuất" hoạt động trên 2.0, tuy nhiên điều này hoạt động tốt.
philw

Nếu bạn muốn hiển thị một html từ tệp, chỉ cần thêm "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko

4
Đúng vậy, nếu bạn đang sử dụng ASP.NET Core 2.0 thì đây là cách tốt nhất!
James Scott

Điều gì sẽ xảy ra nếu tệp HTML nằm trong thư mục cục bộ và nó cũng có liên kết css, js. Làm thế nào để chúng tôi cung cấp tệp sau đó?
Lingam

Đối với Razor Pages, bạn có thể gọi phương thức PageModel Content () thay vì tạo ContentResult trực tiếp. Tôi không chắc liệu điều này có khả dụng cho Bộ điều khiển hay không.
carlin.scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.