9

Windows 2008 と SQL Server 2008 を備えた新しい専用サーバーに移動したばかりですServer.CreateObject("MSXML2.ServerXMLHTTP")

以前の 2003 サーバーではこれは正しく機能していましたが、新しい 2008 サーバーでは操作がタイムアウトするだけです。

コードは次のとおりです。

strURL = "http://www.storeboard.com/profile/profile_view.asp?MemberID=" & MemberID & "&sid=" & cSession.SessionID
Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oXMLHttp.open "GET", strURL, false
oXMLHttp.send()
IF oXMLHttp.status = 200 THEN 
  strOut = oXMLHttp.responseText
ELSE
  strOut  = "Could not get XML data."
END IF
Set oXMLHttp = nothing

コードは非常に単純ですが、次のエラーが発生します。

msxml3.dll error '80072ee2'

The operation timed out

/handle404.asp, line 291 

行 291 は、oXMLHttp.Send() 行を参照しています。

使用できる代替コードはありますか? 他のサーバー上のファイルにアクセスするサーバー上の他の場所でスクリプトを使用し、それらは正しく機能しますが、サーバー上のファイルへのアクセスは機能しません。

ブラウザで URL をそのまま維持できる別の方法はありますか? その人はブラウザーに URL を書き込むことができます: http://www.example.com/helloファイルは存在しませんが、404 ハンドラーがあり、ブラウザーの URL を変更せずにユーザーを正しいパスに誘導します。これは不可欠です。私たちのSEO評価のために。

4

3 に答える 3

12

Microsoft は、 INFO: Do Not Send ServerXMLHTTP or WinHTTP Requests to the Same Serverという KB 記事を公開しました。

ServerXMLHTTP または WinHTTP コンポーネントが同じサーバー上の別の ASP に要求を送信する必要がある場合、ターゲット ASP は別の仮想ディレクトリに配置し、高度に分離して実行するように設定する必要があります。ServerXMLHTTP または WinHTTP を使用して、同じ仮想ディレクトリにある ASP に要求を送信することは避けてください。

...

ASP ページの実行に使用できるワーカー スレッドの数は限られています (Inetinfo.exe または Dllhost.exe プロセス内)。すべての ASP ワーカー スレッドが HTTP 要求を、要求の送信元サーバー上の同じ Inetinfo.exe または Dllhost.exe プロセスに送り返すと、Inetinfo.exe または Dllhost.exe プロセスがデッドロックするか、応答を停止 (ハング) する可能性があります。着信要求を処理するためのワーカー スレッドのプールが使い果たされるためです。これは仕様によるものです。

代替手段に関する限り、それは、応答を受け取った後に応答をどうするかによって異なります。スクリプトの全体的な目的が要求を profile_view.asp に転送することである場合は、代わりに使用できる可能性がありますServer.Transfer

于 2011-11-22T03:45:22.623 に答える
4

これと同じ問題がありました。私の場合、作成しようとしていた Web 要求は、内部サイトの URL (同じアプリ プール内) でした。サーバー側のデバッグが有効に設定されていると、asp アプリ プールは単一のワーカー スレッドに制限されているようです。この機能を無効にすることで、リクエストを処理できるようになりました。

于 2012-05-16T10:28:01.227 に答える
3

msxml3.dll はかなり古いです。大まかなアイデアを提供するために、Internet Explorer 6 とともに配布されました。

誰かに新しいバージョンをサーバーにインストールしてもらうことはできますか?

http://support.microsoft.com/kb/269238は、サーバーの責任者に送信するバージョンのリストを提供します。

問題が本当にタイムアウトになっている場合は、ASP バッファリングをオフにすることを検討してください。(これは、サーバー オブジェクトが応答を受信し始めた場合、タイムアウト前に待機するという推測にのみ基づいています。

または、クライアント側で値を処理してみてください。以下は、これを行うコードからの関数です....

function getDets(RateID) {
    var xmlHttp;
    try {
        xmlHttp=new XMLHttpRequest();    // Firefox, Opera 8.0+, Safari
    }
    catch (e) {
        try {
        // Internet Explorer
        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState==4) {
        var str;
        var newStr;
        str=xmlHttp.responseText
        newStr=str.split("|");
        window.document.all.OR2.style.display="block";
        window.document.all.OR3.style.display="block";    
        window.document.OvertimeRates.Description.value=newStr[0];
        window.document.OvertimeRates.Factor.value=newStr[1];
        }
    }
    if (RateID==0) {
        window.document.OvertimeRates.Description.value="";
        window.document.OvertimeRates.Factor.value="";
    }
    else {
        xmlHttp.open("GET","GetOvertimeRate.asp?RateID="+RateID,true);
        xmlHttp.send(null);
    }
}

幸運を!

于 2011-07-21T22:10:43.320 に答える