Async PartialView gây ra ngoại lệ “HttpServerUtility.Execute bị chặn…”


85

Tôi có một phần xem cố gắng truy xuất IEnumerable<Post>từ cơ sở dữ liệu bằng cách sử dụng không đồng bộ ...

phương pháp

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

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

Tầm nhìn hạn chế

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

Và sau đó nếu tôi cố gắng gọi nó

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

Tôi nhận được ngoại lệ sau

HttpServerUtility.Execute bị chặn trong khi chờ hoạt động không đồng bộ hoàn tất.

Mô tả: Một ngoại lệ chưa được xử lý đã xảy ra trong quá trình thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và nguồn gốc của lỗi trong mã.

Chi tiết ngoại lệ: System.InvalidOperationException: HttpServerUtility.Execute bị chặn trong khi đợi hoạt động không đồng bộ hoàn tất.

Tại sao tôi gặp lỗi này? Nó không nên hoạt động?

Câu trả lời:


97

Các hành động con phải được gọi đồng bộ. Vấn đề 601 Tôi cũng không biết về bất kỳ bản cập nhật nào gần đây đối với các thư viện MVC hiện tại cho phép chức năng này.

Nhận xét về Vấn đề 601, gợi ý về chức năng này đang được thêm vào MVC vNext, hay còn gọi là. MVC6. Các hành động con trông sẽ được thay thế bằng các hành động ViewComponentnày có thể được gọi không đồng bộ từ chế độ xem như bên dưới. Ví dụ đầy đủ ở đâyở đây

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

Để biết thêm về MVC6, hãy xem tại http://www.asp.net/vnext/overview/aspnet-vnext/overview

Lưu ý: Câu trả lời này chỉ là hình thức, vì vậy câu hỏi có thể được đánh dấu là đã trả lời


liên kết 601 không còn hợp lệ nữa
Serge

6

Giải pháp cho vấn đề này là làm cho phương thức đồng bộ theo yêu cầu của MVC, xóa SynchronizationContext, gọi phương thức không đồng bộ và chờ kết quả, sau đó khôi phục ngữ cảnh.

xem aswer đầy đủ của tôi ở đây


3
(Bài đăng này dường như không cung cấp câu trả lời chất lượng cho câu hỏi. Vui lòng chỉnh sửa câu trả lời của bạn hoặc chỉ đăng nó dưới dạng nhận xét cho câu hỏi).
sɐunıɔ ןɐ qɐp
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.