2010-03-01 32 views
1

執行此代碼後,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導致無休止的運行時間。
任何想法爲什麼?

回答

0

你是否在同一臺服務器上調用腳本?如果是這樣,您將遇到會話被鎖定的問題。當頁面擁有Session時,它會鎖定該用戶的Session對象,直到它完成(或超時)。當您在同一臺服務器上調用第二個頁面時,它會在等待Session鎖定釋放時掛起(這不會發生,因爲調用頁面具有該鎖定)。最終頁面超時。

可以通過關閉任一頁面的會話來修復。

+0

爲了ASP與當前會話中的ASP會話cookie將需要在請求中刻意重複,但不會出現在這裏發生的XMLHTTP請求關聯。 – AnthonyWJones 2010-03-01 22:43:11

4

提示#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

+1

+1應該使用ServerXMLHTTP,不確定FreeThreadedDOMDocument,爲什麼不簡單地使用DOMDocument? BTW transformNodeToObject到Response現在在MXSML SP10中被破壞了。 – AnthonyWJones 2010-03-01 22:53:07

+0

@Anthony:感謝您關於MSXML SP10的提示。你能指定「破」嗎? DOMDocument也可以,但是在Web服務器上,這些東西有時最終會被緩存在Application對象中,此時我會使用FreeThreadedDOMDocument。所以,馬上使用它不會有什麼壞處。 – Tomalak 2010-03-02 00:57:01

+1

從SP10開始,TransformToObject調用IStream接口的'Commit'方法,而之前沒有。不幸的是,當調用該方法時,「IStream」的ASP Response對象實現會引發「未實現」異常。 – AnthonyWJones 2010-03-02 07:45:20