有时可行的脚本的无限运行时

时间:2010-03-01 09:58:55

标签: xml iis xslt asp-classic xmlhttprequest

执行此代码后,asp脚本工作正常。

<!-- #include file="Connection.asp" -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
function Page()
{   
    var db = new DBConnection;
    this.DAL = db.retriveDAL("Content");

    var url = new String(Request.ServerVariables("QUERY_STRING")), site = new String(Request.ServerVariables("QUERY_STRING"));
    site = url.slice(4, url.indexOf(":80", 0)) + "/";
    url = url.slice(url.indexOf("80", 0) + 2, url.length).split("/");

    var pageName = url[1], pageID = url[2];

    var xmlhttp = Server.CreateObject("Microsoft.XMLHTTP");

    xmlhttp.open("POST", site+"library/Datastore.asp?page="+pageName + (pageID ? "id=" + pageID : ""), false);
    xmlhttp.send();

    var xml = Server.CreateObject("Microsoft.XMLDOM");
    xml.async = false;

    xml.loadXML(xmlhttp.responseText);

    var xsl = Server.CreateObject("Microsoft.XMLDOM");
    xsl.async = false;
    xsl.load(Server.MapPath("templates/" + pageName + ".xsl"));

    Response.Write(xml.transformNode(xsl));
}
%>

有人知道为什么吗? 它现在没有理由工作。 它还会禁用网站上的任何asp脚本。

编辑: 我只是禁用了xmlhttp并重新创建了网站,asp工作得很好 编辑2:
我刚刚发现Server.Transfer导致无休止的运行时间 知道为什么吗?

2 个答案:

答案 0 :(得分:4)

提示#1:

建立正确的网址。你用

site
 + "library/Datastore.asp?page="
 + pageName
 + (pageID ? "id=" + pageID : "")

但是正确的是

site
  + "library/Datastore.asp?page="
  + Server.URLEncode(pageName) 
  + (pageID ? "&id=" + Server.URLEncode(pageID) : "")
//-------------^  !!

提示#2:

而不是

Response.Write(xml.transformNode(xsl));

使用

xml.transformNodeToObject(xsl, Response);

这样您就不会遇到任何输出编码问题。

提示#3:(来自评论:结果证明是错误的。)

Request.ServerVariables("QUERY_STRING")

已经 一个字符串。无需将其包装在new String()中。显然,来自Request.ServerVariables的字符串不是JS字符串,因此在这里构建本机String对象非常必要。

提示#4:

要在HTTP服务器上使用(本质上是多线程的),您应该使用Msxml2.ServerXMLHTTP而不是Microsoft.XMLHTTP而不是Microsoft.XMLDOM您应该使用{ {1}}。

答案 1 :(得分:0)

您是否在同一台服务器上调用脚本?如果是这样,您将遇到Session被锁定的问题。当页面具有Session时,它会锁定该用户的Session对象,直到它完成(或超时)。当您在同一服务器上调用第二个页面时,它会在等待释放会话锁定时挂起(这不会像调用页面那样发生)。你最终将页面超时了。

可以通过关闭任一页面的会话来修复。