2009-09-15 22 views
5

Tôi có một vài truy vấn cho một trang web mất nhiều thời gian để chạy do mô hình dữ liệu và lượng dữ liệu được lưu trữ trong các bảng. Cho đến nay tôi đã chạy chúng theo cách thủ công đối với cơ sở dữ liệu để tránh bất kỳ vấn đề thời gian chờ vv .. tuy nhiên chủ sở hữu trang web đã yêu cầu cho chúng được làm sẵn có trên trang web để anh ta có thể nhận được kết quả truy vấn.Cách tốt nhất để chạy truy vấn DB dài trong ASP cổ điển?

Tôi đã nghĩ đến việc này thông qua dịch vụ web .NET và có trang ASP cổ điển gọi điều này không đồng bộ. Trang web sẽ chỉ bắt đầu quá trình và trước khi chuyển hướng người dùng đến màn hình khác. Sau đó, dịch vụ web sẽ chạy truy vấn và gửi cho người dùng kết quả bằng CSV.

Tuy nhiên, dường như tôi không thể làm việc này. Các dịch vụ chạy ok nếu tôi gọi nó thông qua màn hình trong IE nhưng gọi nó thông qua một cuộc gọi Ajax trong ASP có vẻ là một vấn đề - không có lỗi được tạo ra nhưng không phải là tập tin CSV tạo ra.

Tôi đã đính kèm mã ASP cổ điển bên dưới. Dịch vụ chỉ có một phương thức với tham số của email tên là chuỗi kiểu. Bất cứ ai có thể nhìn thấy bất cứ điều gì sai trái với nó? Ngoài ra, đây là cách tốt nhất để làm điều này hoặc tôi nên nghĩ đến cách tiếp cận khác?

Cảm ơn trước,

Phil

<% 
message = "http://wwww.example.com/service/query.asmx/GetResults?email=test" 
set req = server.createobject("MSXML2.XMLHTTP") 
With req 
    .open "GET", message, False 
    .setRequestHeader "Content-Type", "text/xml" 
    .send 
End With 

works = req.responseText 
response.redirect "http://www.bbc.co.uk" 

%> 

Trả lời

3

Ý tưởng về không đồng bộ yêu cầu công việc và sắp xếp giao sau của nó có vẻ rất hợp lý với tôi. Tôi không nói ASP đủ tốt để biết những gì wring với nỗ lực của bạn, nhưng đó thực sự là một cuộc gọi asnch bạn có? Liệu dịch vụ seb cũng bị hết thời gian chờ kết nối HTTP?

Cách tiếp cận của tôi là yêu cầu Ajax đặt yêu cầu trên hàng đợi và trả lại, không cần chuyển hướng, bạn vẫn ở trên trang nơi người dùng yêu cầu, tập lệnh java của bạn có thể thừa nhận rằng các yêu cầu đã được gửi. Alterntively, truyền thống của bạn "gửi một trang, stash các yêu cầu, hiển thị một trang khác" thẩm định có thể làm việc, nhưng stashing là chỉ để đưa yêu cầu trên một hàng đợi.

Lợi thế của phương pháp xếp hàng là bằng cách kiểm soát số lượng daemon, chúng tôi có thể kiểm soát song song trong việc phục vụ các yêu cầu - tránh quá tải DB. Ngoài ra, các hàng đợi có thể tồn tại và cho phép gửi phản hồi nhàn nhã.

Tôi giả định rằng hàng đợi MS sau đó cho phép bạn có một trình xử lý yêu cầu tái xử lý và phân phối câu trả lời. Email rõ ràng hoạt động, nhưng tấn công tôi như một chút không thân thiện. Với các giao diện kiểu Ajax, nó sẽ khá dễ dàng để thăm dò ý kiến ​​vô hình đối với trạng thái yêu cầu và có được kết quả khi chúng sẵn sàng, hoặc thậm chí sử dụng tính năng gửi đẩy kiểu Comet của các phản hồi.

1

Vấn đề ở đây, như djna lưu ý, là bạn không gọi hàm gọi lại. Do khía cạnh không đồng bộ của Ajax, bạn đã thiết lập một chức năng gọi lại sẽ được thực hiện khi cuộc gọi Ajax kết thúc.

câu chuyện dài ngắn:
Gọi webservice từ một hàm javascript, tốt nhất là sử dụng JQuery để tránh trình duyệt không tương thích chéo

Code:

<div id="results">Processing query. Please wait</div> 

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("#results").load("http://wwww.mywebsite.com/service/query.asmx/GetResults?email=test&Rnd=" + Math.random().toString()); 
}); 
</script> 
Các vấn đề liên quan