Async PartialView ทำให้เกิดข้อยกเว้น“ HttpServerUtility.Execute ถูกบล็อก…”


85

ฉันมีมุมมองบางส่วนที่พยายามดึงข้อมูลIEnumerable<Post>จากฐานข้อมูลโดยใช้ async ...

วิธี

public static class PostService
{
    public static int PostsPerPage = 50;

    public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
    {
        return await entityFrameworkDbContext.Posts
            .ToListAsync();
    }
}

PartialView

public async Task<ActionResult> Recent(int page = 0)
{
    return PartialView(await PostService.GetRecentAsync(page));
}

แล้วถ้าลองเรียกดู

@Html.Action("Recent", "Post")

ฉันได้รับข้อยกเว้นดังต่อไปนี้

HttpServerUtility ดำเนินการบล็อกในขณะที่รอให้การดำเนินการแบบอะซิงโครนัสเสร็จสมบูรณ์

คำอธิบาย: มีข้อยกเว้นที่ไม่สามารถจัดการได้เกิดขึ้นระหว่างการดำเนินการตามคำขอของเว็บปัจจุบัน โปรดตรวจสอบการติดตามสแต็กสำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและที่มาที่ไปในโค้ด

รายละเอียดข้อยกเว้น: System.InvalidOperationException: HttpServerUtility.Execute ถูกบล็อกในขณะที่รอให้การดำเนินการแบบอะซิงโครนัสเสร็จสมบูรณ์

เหตุใดฉันจึงได้รับข้อผิดพลาดนี้ มันไม่ควรทำงาน?

คำตอบ:


97

ต้องเรียกใช้การดำเนินการของเด็กพร้อมกัน ปัญหา 601ฉันยังไม่ทราบถึงการอัปเดตล่าสุดของไลบรารี MVC ปัจจุบันที่อนุญาตให้ใช้ฟังก์ชันนี้

ความคิดเห็นเกี่ยวกับฉบับที่ 601 บอกใบ้ถึงฟังก์ชันนี้ที่ถูกเพิ่มใน MVC vNext หรือที่เรียกว่า MVC6. ดูเหมือนว่าการกระทำของเด็กจะถูกแทนที่ด้วยViewComponentซึ่งสามารถเรียกใช้แบบอะซิงโครนัสจากมุมมองด้านล่าง ตัวอย่างเต็มที่นี่และที่นี่

<div>
@await Component.InvokeAsync("YourComponent")
</div>

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ MVC6 โปรดดูที่http://www.asp.net/vnext/overview/aspnet-vnext/overview

หมายเหตุ: คำตอบนี้เป็นเพียงพิธีการดังนั้นจึงสามารถทำเครื่องหมายคำถามเป็นคำตอบได้


ลิงก์ 601 ใช้ไม่ได้อีกต่อไป
Serge

6

วิธีแก้ปัญหาสำหรับปัญหานี้คือการทำให้เมธอดซิงโครไนซ์ตามที่ MVC ต้องการล้าง SynchronizationContext เรียกเมธอด async และรอผลลัพธ์จากนั้นคืนค่าบริบท

ดูคำแนะนำแบบเต็มของฉันที่นี่


3
(โพสต์นี้ดูเหมือนจะไม่ได้ให้คำตอบที่มีคุณภาพสำหรับคำถามโปรดแก้ไขคำตอบของคุณหรือโพสต์เป็นความคิดเห็นสำหรับคำถาม)
sɐunıɔןɐqɐp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.