Tôi có một hành động MVC chạy dài (4-10 giây) chạy báo cáo từ cuộc gọi AJAX. Trong khi nó chạy người dùng có thể thay đổi các tham số và chạy một cái gì đó khác, vì vậy tôi hủy bỏ yêu cầu AJAX trước khi thực hiện một số khác.Làm thế nào để bạn hủy bỏ một phía máy khách hành động MVC dài chạy MVAX (trong javascript)?
Vì vậy, ví dụ (ví dụ trong jQuery nhưng vấn đề xảy ra bất kể):
// If we have an active request and it's not complete
if(dataRequest && dataRequest.readyState != 'complete')
{
dataRequest.abort();
}
dataRequest = $.ajax(...);
Khách hàng bên này dường như làm việc tốt, nhưng yêu cầu hủy vẫn chạy trên máy chủ. Ví dụ: nếu báo cáo mất 10 giây và tôi hủy một báo cáo và bắt đầu một báo cáo khác thì yêu cầu thứ hai mất 20 giây.
Tôi nghĩ rằng đây là do sự session level locking:
[Nếu] hai yêu cầu đồng thời được thực hiện đối với cùng một phiên (bằng cách sử dụng cùng giá trị SessionID), yêu cầu đầu tiên được truy cập độc quyền để sự thông tin phiên. Yêu cầu thứ hai chỉ thực hiện sau khi yêu cầu đầu tiên kết thúc.
Vì vậy, yêu cầu thứ hai không thể truy cập phiên cho đến khi phiên đầu tiên kết thúc. Việc sử dụng các hành động MVC không đồng bộ dường như không thực hiện được điều này vì hành động vẫn cần để có thể thay đổi phiên.
Có thể dừng một hành động và bắt đầu một hành động tiếp theo mà không sử dụng AsyncController
hoặc [SessionState(SessionStateBehavior.ReadOnly)]
?
Nếu không được yêu cầu cả hai?
Hãy cẩn thận dựa vào 'IsClientConnected' vì nó có thể là một vấn đề hiệu suất nghiêm trọng để kiểm tra nó, xem http://stackoverflow.com/questions/9094735/when-is-response-isclientconnected-slow – Keith
Hi Keith! Tôi có một vấn đề tương tự nhưng không thể giải quyết ngay cả với câu trả lời của bạn, (http://stackoverflow.com/questions/29235850/how-to-abort-long-running-ajax-request-in-net-mvc-4) Có cách nào giúp tôi không? Hoặc bạn có thể đăng một mã mẫu của bạn để kích hoạt 'this.Response.IsClientConnected' –