ส่งคืน HTML จาก ASP.NET Web API


120

วิธีการคืน HTML จาก ASP.NET MVC Web API controller?

ฉันลองใช้โค้ดด้านล่าง แต่ได้รับข้อผิดพลาดในการคอมไพล์เนื่องจากไม่ได้กำหนด Response.Write:

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

4
เหตุใดคุณจึงใช้ WebAPI หากคุณต้องการส่งคืน HTML ฉันหมายถึงนี่คือสิ่งที่ ASP.NET MVC และ ASP.NET WebForms มีไว้สำหรับ
Stilgar

ขอบคุณที่ยอดเยี่ยม ฉันเปลี่ยนคอนโทรลเลอร์เป็นคอนโทรลเลอร์ปกติ
Andrus

18
@Stilgar สาเหตุหนึ่งอาจเป็นเพราะเขาไม่ได้ใช้สแต็ก MVC ไม่ว่าจะเป็นเอ็นจิ้นการเรนเดอร์ใด ๆ แต่ยังคงต้องการสร้างส่วนหน้าเซิร์ฟเวอร์ให้กับ Html บางตัว กรณีการใช้งานอาจเป็นได้ว่าคุณมี Web Api ที่ให้ Html บางตัวพร้อมกับโปรแกรมสร้างเทมเพลตฝั่งไคลเอ็นต์ซึ่งจะแสดงผลทุกอย่างในขั้นตอนต่อไป
Patrick Desjardins

3
@Stilgar กรณีการใช้งานอื่นที่ฉันพบคือการส่งคืนหน้า html เพื่อให้ข้อเสนอแนะสำหรับการยืนยันการสร้างบัญชีเมื่อผู้ใช้คลิกลิงก์ที่คุณให้ทางอีเมล
wiwi

คำตอบ:


257

ASP.NET Core แนวทาง 1

หากคอนโทรลเลอร์ของคุณขยายออกไปControllerBaseหรือControllerคุณสามารถใช้Content(...)วิธีการ:

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

ASP.NET Core แนวทาง 2

หากคุณเลือกที่จะไม่ขยายControllerชั้นเรียนคุณสามารถสร้างใหม่ได้ContentResult:

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

ASP.NET MVC Web API แบบเดิม

ส่งคืนเนื้อหาสตริงด้วยประเภทสื่อ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
ไม่สนับสนุนใน ASP.NET MVC Core HttpResponseMessage
Parshuram Kalvikatte

@Parshuram ฉันเพิ่งตรวจสอบคำสั่งของคุณ ฉันสามารถใช้ HttpResponseMessage ใน ASP.NET Core อยู่ภายใต้ System.Net.Http
Andrei

ขอบคุณมาก แต่ตอนนี้ MediaTypeHeaderValue ไม่สนับสนุน
Parshuram Kalvikatte

3
เมื่อฉันทำสิ่งนี้โดยใช้ ASP.NET MVC 5 ฉันได้รับการตอบสนอง ฉันไม่ได้รับเนื้อหา HTML ใด ๆ กลับคืนมา สิ่งที่ฉันได้รับคือ "StatusCode: 200, ReasonPhrase:" OK ", เวอร์ชัน: 1.1, Content: System.Net.Http.StringContent, Headers: {Content-Type: text / html}"
guyfromfargo

@guyfromfargo คุณลอง[Produces]เข้าหาแล้วหรือยัง?
Andrei

54

เริ่มต้นด้วย AspNetCore 2.0 ขอแนะนำให้ใช้ContentResultแทนProduceแอตทริบิวต์ในกรณีนี้ ดู: https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

สิ่งนี้ไม่ได้ขึ้นอยู่กับการทำให้เป็นอนุกรมหรือการต่อรองเนื้อหา

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

4
ฉันไม่สามารถรับคำตอบ "ผลิต" ในการทำงานได้เลยใน 2.0 แต่ก็ใช้ได้ดี
philw

หากคุณต้องการแสดง html จากไฟล์เพียงเพิ่ม "var content = System.IO.File.ReadAllText (" index.html ");"
Pavel Samoylenko

4
ใช่ถ้าคุณใช้ ASP.NET Core 2.0 นี่คือวิธีที่จะไป!
James Scott

จะเกิดอะไรขึ้นถ้าไฟล์ HTML อยู่ในไดเร็กทอรีโลคัลและมีการเชื่อมโยง css, js ด้วย เราจะให้บริการไฟล์ได้อย่างไร?
Lingam

สำหรับ Razor Pages คุณสามารถเรียกใช้เมธอด PageModel Content () แทนการสร้าง ContentResult โดยตรง ฉันไม่แน่ใจว่าสิ่งนี้มีให้สำหรับคอนโทรลเลอร์ด้วยหรือไม่
carlin.scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.