2009-10-02 19 views
7

Dưới đây là ý chính:Làm cách nào để kích hoạt cuộc gọi không đồng bộ trong asp cổ điển và bỏ qua phản hồi?

Tôi có một cuộc gọi mà tôi muốn thực hiện trong asp và tôi không quan tâm đến phản hồi. Tôi chỉ muốn kích hoạt cuộc gọi và tôi không muốn trang chờ phản hồi. Theo tài liệu, nó sẽ giống như thế này:

dim xmlhttp : set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP") 
xmlhttp.Open "POST", url, true '' setting the 'asynchronous' option to 'true' 
xmlhttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8" 
xmlhttp.setRequestHeader "Content-Length", Len(XMLData) 
xmlhttp.send XMLData 

này hoạt động peachy khi gọi đồng bộ, nhưng khi tôi lật tùy chọn ansynchronous đến, hỏa hoạn không có gì 'true'. Những gì tôi có thể thu thập từ internet là người sử dụng làm điều gì đó như sau:

While xmlhttp.readyState <> 4 
    xmlhttp.waitForResponse 1000 
Wend 

Tôi điên ở chỗ này không thực sự có vẻ như một cuộc gọi Asynchrous nữa tuy nhiên nếu bạn đang chờ đợi một phản ứng?

đặt dòng xmlhttp.waitForResponse 1 ngay sau khi gửi sẽ khiến yêu cầu kích hoạt, nhưng một lần nữa, tôi không muốn đợi một giây.

Mọi suy nghĩ?

Trả lời

7

Vấn đề chính ở đây là nếu bạn không chờ đợi và kịch bản của bạn kết thúc thành phần ServerXMLHTTP phá hủy chính nó và trong quá trình hủy bỏ yêu cầu chưa xử lý. Không có cách nào để bạn có thể đảm bảo nơi yêu cầu đã đến lúc đó.

Ví dụ: nếu máy chủ của bạn không có vòng để phát hành tới máy chủ đích, nó sẽ thấy rằng máy chủ không còn cần thiết và không bận tâm nữa.

Ngay cả khi kết nối đã được thực hiện với máy chủ đích, yêu cầu có thể chưa được cung cấp cho người xử lý. Thông thường một máy chủ web sẽ kiểm tra xem máy khách đó vẫn được kết nối trước khi cam kết tài nguyên để thực hiện một yêu cầu. Nếu nó thấy kết nối của bạn đã bị ngắt, nó sẽ không làm phiền hoàn thành yêu cầu.

Nói cách khác không có cách đáng tin cậy để thực hiện thao tác này không đồng bộ trong ASP cổ điển, nó không được thiết kế để xử lý loại điều đó. Điều tốt nhất bạn có thể nhận được là làm những thứ khác trong khi kịch bản của bạn được với cái gì khác (nếu bạn đã có bất cứ điều gì khác để được nhận về với), tuy nhiên, tôi thậm chí sẽ không khuyên rằng kể từ khi không đồng bộ WinHTTP bên trong ASP là flaky.

3

Chúng tôi sử dụng async XMLRequest để ghi lỗi vào Fogbugz trong các trang ASP của chúng tôi. Vì chỉ có một báo cáo lỗi của chúng tôi, chúng tôi không muốn người dùng của chúng tôi treo xung quanh chờ mã của chúng tôi kết thúc nên chúng tôi làm việc đó không đồng bộ. Điều này có thể được cho bất cứ điều gì từ một tập tin cấu hình bị mất, DB timeout, thiếu tra cứu trong một tập tin cấu hình một nơi nào đó, vv Không phải luôn luôn nhiệm vụ công cụ crytical nhưng tốt để biết về. Trong những trường hợp đó, async hoạt động một điều trị và nếu không thì nó không phải là kết thúc của thế giới đối với chúng tôi, nhưng chúng tôi không có bất kỳ vấn đề gì với nó. Chúng tôi đã sử dụng kịch bản này mà chúng tôi tạo ra và được đăng trong một câu hỏi khác:

System.Net.HttpWebRequest in classic asp?

Giống như Anthony nói mặc dù nó không phải là 100% guanenteed để có được thông qua. Như một sửa chữa có thể bạn có thể sert Response.Buffer = true, hiển thị tất cả đầu ra của bạn cho người dùng, gọi Response.Flush và sau đó thực hiện cuộc gọi waitForResponse. Người dùng sẽ thấy toàn bộ trang và có thể tương tác với trang đó mà không cần giữ gìn và nó cho phép cuộc gọi không đồng bộ của bạn thêm một chút thời gian để hoàn thành.

12

Hôm nay tôi gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách sử dụng đối tượng "Microsoft.XMLHTTP".

dim xmlhttp 
set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP") 
xmlhttp.Open "POST", url, true 
xmlhttp.Send "" 

Và bây giờ yêu cầu được gửi không đồng bộ và URL mục tiêu đã được truy cập. Hy vọng điều đó sẽ hữu ích.

+0

tuyệt vời - cảm ơn! – EdenMachine

+0

Bạn vừa cứu tôi khỏi cái chết bằng cách đập đầu vào bàn phím. Điều này có vẻ là một thay thế trực tiếp (không cần tái cấu trúc?) Cho "MSXML2.ServerXMLHTTP" - nhưng tôi sẽ chạy các hồi quy chỉ để đảm bảo. – jerhewet

2

Một tùy chọn khác nếu bạn vẫn muốn sử dụng đối tượng ServerXMLHTTP (và không phải thành phần phía máy khách được đề cập ở trên bởi Anton xem Câu hỏi thường gặp # 4 tại http://support.microsoft.com/kb/290761) là tạo một lớp VBScript. Khởi tạo lớp. Đặt thuộc tính của lớp cho đối tượng HTTP. Sau đó, gọi một phương thức để kích hoạt yêu cầu.

Đừng bao giờ hủy bỏ phiên bản lớp - nó sẽ tự động bị hủy khi trang ASP kết thúc. Có phương thức hủy lớp miễn phí đối tượng HTTP - điều đó sẽ cho nó đủ thời gian để kích hoạt yêu cầu trước khi nó bị phá hủy.

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