2010-06-16 24 views
6

Tôi muốn tắt bộ nhớ cache được sử dụng khi cuộc gọi URL đến máy chủ được tạo từ VBScript đang chạy trong một ứng dụng trên máy Windows. Tôi sử dụng chức năng/phương pháp/đối tượng nào để thực hiện việc này?VBScript: Vô hiệu hóa bộ nhớ đệm của phản hồi từ máy chủ đến yêu cầu HTTP GET URL

Khi cuộc gọi được thực hiện lần đầu tiên, máy chủ Apache dựa trên Linux của tôi trả về phản hồi từ tập lệnh CGI Perl đang chạy. Tuy nhiên, các lần chạy tiếp theo của tập lệnh dường như đang sử dụng cùng một phản hồi như lần đầu tiên, vì vậy dữ liệu đang được lưu trữ ở đâu đó. Nhật ký máy chủ của tôi xác nhận rằng máy chủ không được gọi trong những lần tiếp theo đó, chỉ trong lần đầu tiên.

Đây là những gì tôi đang làm. Tôi đang sử dụng đoạn mã sau từ bên trong một ứng dụng thương mại (không muốn đề cập đến ứng dụng này, có lẽ không liên quan đến vấn đề của tôi):


With CreateObject("MSXML2.XMLHTTP") 
    .open "GET", "http://myserver/cgi-bin/nsr/nsr.cgi?aparam=1", False 
    .send 
    nsrresponse =.responseText 
End With 

Có một hàm/phương pháp trên đối tượng trên để tắt bộ nhớ đệm , hoặc tôi nên gọi một phương pháp/chức năng để tắt bộ nhớ đệm trên một đối tượng phản ứng trước khi thực hiện URL?

Tôi đã xem giải pháp sau đây: http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx - không đủ hữu ích. Và ở đây: http://www.w3.org/TR/XMLHttpRequest/ - rất không thân thiện và khó đọc.

Tôi cũng đang cố gắng để buộc không sử dụng bộ nhớ cache sử dụng cài đặt tiêu đề http và tiêu đề tài liệu html dữ liệu meta:

Snippet của server-side Perl script CGI mà trả về phản ứng lại cho khách hàng gọi điện thoại, hết hạn về để 0.


    print $httpGetCGIRequest->header(
     -type => 'text/html', 
     -expires => '+0s', 
     ); 

thiết lập tiêu đề http để đáp ứng được gửi lại cho khách hàng:


<html><head><meta http-equiv="CACHE-CONTROL" content="NO-CACHE"></head> 
<body> 
response message generated from server 
</body> 
</html> 

Phần header http trên và tài liệu đầu html thiết lập h không làm việc, do đó câu hỏi của tôi.

Trả lời

5

Tôi không nghĩ rằng đối tượng XMLHTTP chính nó thậm chí còn thực hiện bộ nhớ đệm.

Bạn gửi yêu cầu mới ngay khi bạn gọi .send() trên đó. Toàn bộ điểm đệm là tránh gửi các yêu cầu, nhưng điều đó không xảy ra ở đây (theo như mẫu mã của bạn đi).

Nhưng nếu đối tượng được sử dụng trong trình duyệt sắp xếp, thì trình duyệt có thể triển khai bộ nhớ đệm. Trong trường hợp này, cách tiếp cận chung là bao gồm bộ đệm ẩn trong câu lệnh: thông số URL ngẫu nhiên mà bạn thay đổi mỗi khi bạn thực hiện yêu cầu mới (như thêm thời gian hiện tại vào URL).

Hoặc, bạn có thể làm cho máy chủ của mình gửi tiêu đề HTTP Cache-Control: no-cache, no-store và xem điều đó có hữu ích hay không.

<meta http-equiv="CACHE-CONTROL" content="NO-CACHE> có lẽ là vô ích và bạn có thể thả hoàn toàn.

+0

Cảm ơn bạn rất nhiều vì đã dành thời gian cho Tomalak. Tôi thấy rằng đối tượng WinHttpRequest.5.1 COM không cache. Tôi sẽ phải làm thử nghiệm rộng hơn để có được sự tự tin, tuy nhiên. 1 cho các URL khác nhau-mỗi-thời gian tip - đó là một chắc chắn là một mẹo để xem xét - Tôi có thể sử dụng đó cũng như WinHttpRequest.5.1 và mở rộng máy chủ của chúng tôi để đối phó với tham số URL thêm. Tôi có thể sẽ bao gồm trường thời gian yêu cầu có độ chính xác cao, ví dụ: millisecs có lẽ. Đó chắc chắn là giá trị xem xét như là một phần của giải pháp. – therobyouknow

+0

bây giờ là câu trả lời được chấp nhận làm gợi ý url ngẫu nhiên của bạn truy cập nguyên nhân tuyến đường - lưu vào bộ nhớ cache và ngắt đoạn mã này để mã đó buộc phải liên hệ với máy chủ mỗi lần. – therobyouknow

+1

Để tạo số ID phiên duy nhất, tôi đang sử dụng hàm Date và Timer được xây dựng trong VB, một số ngẫu nhiên, cùng với tên máy tính/tên máy chủ của PC nơi tập lệnh Date cung cấp ngày, Timer cho thời gian trôi qua mili giây. Cùng với số ngẫu nhiên và id máy, điều này sẽ làm cho lệnh gọi HTTP GET URL là duy nhất. Cơ hội của 2 cuộc gọi URL giống hệt nhau là bằng không. – therobyouknow

4

Bạn có thể sử dụng WinHTTP, tính năng này không cache các phản hồi HTTP. Bạn vẫn nên thêm chỉ thị kiểm soát bộ nhớ cache (Cache-control: no-cache) bằng cách sử dụng phương thức SetRequestHeader, bởi vì nó chỉ thị các proxy trung gian và máy chủ không trả về một phản hồi được lưu trước đó.

+0

Vì vậy, đối tượng XMLHTTP * có * yêu cầu bộ nhớ cache? – Tomalak

+1

Trên thực tế, không có, không hỗ trợ điểm gốc của bạn. – Garett

+0

+1 và trả lời. Tôi đã tra cứu WinHttp và sử dụng WinHttp.WinHttpRequest.5.1. sau một ít nghiên cứu thêm. Đề xuất của bạn đã cung cấp hạt giống cho điều này, tín dụng cho bạn. Điều này là thành công trong đó bộ nhớ đệm không xảy ra. Những gì tôi cần làm bây giờ là mở rộng thử nghiệm của tôi (ví dụ: trên các máy khác nhau/cấu hình) của kịch bản này để tăng sự tự tin. Có lý do nào tại sao cấu hình bộ nhớ đệm mặc định của đối tượng này sẽ khác nhau giữa các máy không? – therobyouknow

3

Nếu bạn có quyền kiểm soát ứng dụng được nhắm mục tiêu theo Yêu cầu XMLHTTP (điều này đúng trong trường hợp của bạn), bạn có thể cho phép ứng dụng gửi tiêu đề không có bộ nhớ cache trong Phản hồi. Điều này giải quyết được vấn đề trong trường hợp của tôi.

Response.AppendHeader("pragma", "no-cache"); 
Response.AppendHeader("Cache-Control", "no-cache, no-store"); 

Thay thế, bạn cũng có thể thêm chuỗi truy vấn chứa số ngẫu nhiên vào mỗi url được yêu cầu.

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