2011-09-21 33 views
7

Tôi có một dự án ASP.NET MVC chạy trên máy phát triển của tôi với cửa sổ 7 cuối cùng và iis 7.5.IIS trì hoãn rất nhiều giữa mỗi phản hồi với các yêu cầu không đồng bộ

tôi làm như sau:

var requests = ["http://myserver.com/news/details/113834", 
"http://myserver.com/tag/details?ids=113834&entityType=23", 
"http://myserver.com/publish/details?ids=113834&entityType=23", 
"http://myserver.com/generalproperty/details?ids=113834&entityType=23", 
"http://myserver.com/category/details?ids=113834&entityType=23"]; 

var f = new Date().getTime(); 
$.each(requests, function(k,v) { 
    $.ajax({ 
    url :v, 
    async : true, 
    type :'get', 
    success : function(data) { 
     console.log(new Date().getTime() -f); 
    }}); 
}) 

Sau đó, tôi nhận được kết quả như sau (khoảng) 12, 521,1025,1550, 2067 async result http://martinhansen.no/hostedimages/async.PNG

Nếu tôi chuyển async false tôi nhận được: 14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG

Dường như một nơi nào đó các yêu cầu đang được xếp hàng đợi và sau một thời gian nó chỉ đáp ứng mỗi 500 giây. Tôi đã thực hiện các bộ điều khiển trả về văn bản trống thay vì cuộc gọi cơ sở dữ liệu, do đó không phải cơ sở dữ liệu.

Có giới hạn nào đối với IIS 7.5 đối với cửa sổ 7 không? Tôi có thể thay đổi cài đặt nào? Tôi nghi ngờ một yêu cầu đồng thời tối đa cho mỗi người dùng hoặc một cái gì đó tương tự. Và sau đó nó "trừng phạt" bạn bằng cách trả lời mỗi 500 ms chỉ. Vì vậy, mọi người không sử dụng nó như một máy chủ thực tế.

Có khả năng? Và có cách nào để tránh nó không?

Trả lời

8

Không liên quan gì đến IIS hoặc IIS trên windows 7, tôi cũng đã thử trên máy chủ thử nghiệm và kết quả tương tự.

Đó là vì những hạn chế áp đặt bởi sessionState, hãy xem phần "Các yêu cầu đồng thời và Session State" ở phía dưới đây: http://msdn.microsoft.com/en-us/library/ms178581.aspx

Tuy nhiên, 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 một giá trị SessionID), yêu cầu đầu tiên được truy cập độc quyền vào 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.

Nhưng tôi vẫn không hiểu tại sao nó không kích hoạt yêu cầu tiếp theo ngay sau khi yêu cầu đầu tiên dường như đã hoàn tất. Nó có vẻ rất giả 500 ms chậm trễ.

Tôi đã trả lời câu hỏi này How to set the ASP.NET SessionState read-write LOCK time-out? nói về thời gian khóa cho trạng thái phiên.

System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

Đó là con số kỳ diệu mà tôi đã tìm kiếm mã của tôi và interwebs cho .. 500! Tôi biết nó phải ở đâu đó.

Dù sao, để sửa lỗi này, tôi đã thêm thuộc tính sessionState để điều khiển của tôi với các tùy chọn read-only

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class BaseController : Controller{} 

Đọc thêm về nó:

http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx

http://weblogs.asp.net/imranbaloch/archive/2010/07/10/concurrent-requests-in-asp-net-mvc.aspx

Tôi vẫn nghĩ rằng có điều gì đó không ổn, tại sao không yêu cầu trước đó nói với hệ thống rằng nó không còn ne eds một khóa trên sessionstate để yêu cầu tiếp theo có thể hoàn thành?

0

Bạn đang gửi bao nhiêu yêu cầu cùng một lúc? IIS trên các hệ điều hành máy khách là limited to 10 simultaneous connections. Trên giới hạn đó, nó ném kết nối vào trong một hàng đợi và xử lý nó khi một khe mở ra.

Điều này đã xảy ra trong một thời gian dài trong nỗ lực của MS để đảm bảo rằng các hệ điều hành máy khách không được sử dụng để phân phối doanh số của nền tảng hệ điều hành máy chủ của họ.

Các vấn đề liên quan