我们刚搬到了一台拥有Windows 2008和SQL Server 2008的新专用服务器。我正在尝试使用Server.CreateObject("MSXML2.ServerXMLHTTP")
访问同一服务器上的ASP页面。
在我们之前的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评级至关重要。< / p>
答案 0 :(得分:12)
Microsoft发布了一篇名为INFO: Do Not Send ServerXMLHTTP or WinHTTP Requests to the Same Server
的知识库文章如果ServerXMLHTTP或WinHTTP组件必须发送请求 在同一台服务器上的另一个ASP,目标ASP必须位于一个 不同的虚拟目录并设置为在高隔离度下运行。避免 使用ServerXMLHTTP或WinHTTP向ASP发送请求 位于同一个虚拟目录中。
...
有限数量的工作线程(在Inetinfo.exe或Dllhost.exe中 process)可用于执行ASP页面。如果所有的ASP工作者 线程将HTTP请求发送回相同的Inetinfo.exe或 发送请求的服务器上的Dllhost.exe进程, Inetinfo.exe或Dllhost.exe进程可能会死锁或停止 响应(挂起),因为工作线程池要处理 传入的请求将用尽。这是设计的。
就替代方案而言,它取决于您在收到回复后对回复做了什么。如果脚本的整个目的是将请求转发到profile_view.asp,您可以改为使用Server.Transfer
。
答案 1 :(得分:3)
msxml3.dll很老了。它随Internet Explorer 6一起发布,给你一个粗略的想法。
您可以让某人在服务器上安装更高版本吗?
http://support.microsoft.com/kb/269238为您提供了一个发送给负责服务器的版本的版本列表。
如果问题真的发生了一段时间,你可以考虑切换ASP缓冲。 (这个基于soley的猜测是,如果服务器对象开始收到响应,它将在超时前面停止。
或者你可以尝试在客户端处理这个值,下面是我编写的一些代码中的函数,这样做....
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);
}
}
祝你好运!
答案 2 :(得分:3)
我有同样的问题。在我的情况下,我试图制作的网页请求是一个内部网站网址(在同一个应用程序池中)。将服务器端调试设置为启用后,asp应用程序池似乎仅限于一个工作线程。通过禁用此功能,可以处理该请求。