2009-07-19 11 views
6

Tôi có 2 trang ASP.IIS không gửi hai câu trả lời cho cùng một khách hàng cùng một lúc (chỉ dành cho ASP)

Tôi yêu cầu trang đầu tiên từ Firefox (mất 30 giây để xử lý trên máy chủ) và trong quá trình thực hiện 30 giây, tôi thực hiện một yêu cầu khác từ Firefox đến trang thứ hai (mất ít hơn 1 giây ở phía máy chủ), nhưng nó đến sau 31 giây. Bởi vì nó chờ đợi các yêu cầu đầu tiên để hoàn thành.

Khi tôi yêu cầu trang đầu tiên từ Firefox và sau đó yêu cầu trang thứ hai từ IE, nó chỉ là ngay lập tức.

Vì vậy, về cơ bản ASP - IIS 6 bằng cách nào đó hạn chế mỗi khách hàng yêu cầu một (yêu cầu xử lý dài) tại một thời điểm. Tôi cần phải giải quyết vấn đề này trong ứng dụng .NET client của tôi.

Điều này được thử nghiệm trong 3 hệ thống khác nhau. Nếu bạn muốn kiểm tra, bạn có thể thử các kịch bản ASP ở cuối.

Hành vi này giống nhau trong quá trình thực thi SQL dài hoặc chỉ trong thời gian hoạt động ASP.

Lưu ý:

  • Nó không phải về HTTP Keep Alive
  • Đó là giới hạn kết nối không khoảng dai dẳng (chúng tôi đã cố gắng để tăng này trong firefox và trong .NET với Net.ServicePointManager.DefaultConnectionLimit)
  • Nó không phải về tác nhân người dùng
  • Điều này không xảy ra trong ASP.NET vì vậy tôi cho rằng đó là điều gì đó với ASP.dll
  • Tôi đang cố gắng ng để giải quyết điều này trên máy khách chứ không phải máy chủ. Tôi không có quyền kiểm soát trực tiếp máy chủ, đó là giải pháp của bên thứ 3.

Có cách nào để giải quyết vấn đề này không?

mẫu ASP Code:

Đầu tiên ASP:

<% 
Set cnn = Server.CreateObject("Adodb.Connection") 
cnn.Open "Provider=sqloledb;Data Source=.;Initial Catalog=master;User Id=sa;Password=;" 
cnn.Execute("WAITFOR DELAY '0:0:30'") 
cnn.Close 
%> 

Second ASP:

<% 
Response.Write "bla bla" 
%> 

Trả lời

8

Điều này là do cách ASP quản lý Phiên. Đối tượng Session là đơn luồng và do đó chỉ có thể được truy cập bởi một chuỗi công nhân tại một thời điểm. Khi một yêu cầu thứ hai đến cho cùng một phiên như đã được xử lý bởi một luồng hiện có mà yêu cầu được xếp hàng đợi bởi ASP cho đến khi đối tượng phiên là avialable.

Điều này xảy ra theo mặc định ngay cả khi bạn không thực sự sử dụng đối tượng phiên trong các trang được đề cập.

Do đó khi bạn thực hiện một yêu cầu từ FF và một từ IE, bạn sẽ có hai phiên khác nhau, do đó cả hai yêu cầu đều có thể tiến hành đồng thời. Bạn có thể có hiệu ứng tương tự bằng cách sử dụng hai phiên bản IE khác nhau.

Nếu bạn biết bạn không bao giờ cần đối tượng phiên, bạn có thể đi vào cấu hình Ứng dụng và tắt nó đi (điều này có nghĩa là không có trang ASP nào chạm vào đối tượng phiên). Trong trường hợp này ASP sẽ cho phép nhiều yêu cầu từ cùng một cá thể trình duyệt được xử lý cùng một lúc (vì nó sẽ không có cách nào để biết các yêu cầu từ cùng một cá thể trình duyệt).

Tuy nhiên, trong hầu hết các trường hợp, mã ASP có một số sử dụng cho đối tượng phiên (ngay cả khi chỉ đánh dấu phiên là đã đăng nhập). Trong trường hợp này, bạn đang mắc kẹt với hành vi này trừ khi bạn tách hai trang ASP được gọi vào các ứng dụng riêng biệt.

+0

Tôi đã bỏ lỡ phiên làm việc như thế nào! Vâng phát hiện, cảm ơn rất nhiều. –

+2

Bạn cũng có thể vô hiệu hóa phiên trên mỗi trang với biến trang này: <% @ EnableSessionState = False%> Thông tin phiên được tạo trên các trang khác vẫn tồn tại chỉ với công cụ ASP bằng cách bỏ qua phần mà nó làm cho trang này khả dụng chỉ có. –

0

Bạn đã cố gắng sử dụng Response.Flush? Điều đó có thể làm cho đầu ra đệm được gửi ngay lập tức.

+0

Nó không hoạt động và tôi cần giải quyết vấn đề này ở chế độ chung chung hơn. Máy khách .NET của tôi nên làm việc với bất kỳ trang ASP nào như thế này. –

0

IIS (hoặc trang web này cụ thể) có được đặt là 1 CPC Kết nối đồng thời?

+0

Không . . . –

+0

Tính năng này có dành riêng cho firefox không? Làm thế nào về 2 yêu cầu đồng thời từ IE? – shahkalpesh

+0

@shahkalpesh, nếu đó là như vậy bằng cách sử dụng một cá thể IE riêng biệt vẫn sẽ gây ra yêu cầu trì hoãn cho đến khi một trong FF hoàn tất. – AnthonyWJones