Бесконечная среда выполнения для скрипта, который иногда работает - PullRequest
1 голос
/ 01 марта 2010

После того, как я выполню этот код, сценарии 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 на сайте.

EDIT: Я просто отключил xmlhttp и заново создал сайты, и asp работает отлично.
РЕДАКТИРОВАТЬ 2:
Я только что обнаружил, что Server.Transfer вызывает бесконечное время выполнения.
Есть идеи почему?

Ответы [ 2 ]

4 голосов
/ 01 марта 2010

Совет № 1:

Создайте правильный URL. Вы используете

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 вы должны использовать MSXML2.FreeThreadedDOMDocument.

0 голосов
/ 01 марта 2010

Вы вызываете скрипт с того же сервера? Если это так, у вас будут проблемы с блокировкой сессии. Когда страница имеет сеанс, она блокирует объект сеанса для этого пользователя до тех пор, пока он не завершит работу (или не истечет время ожидания). Когда вы вызываете вторую страницу на том же сервере, она зависает, ожидая снятия блокировки сеанса (что не может произойти, поскольку она есть на вызывающей странице). У вас заканчивается время ожидания страницы.

Может быть исправлено отключением сеанса для любой из страниц.

...