1

大家,早安,

我正在开发一个需要升级和重构的遗留 ASP Classic 应用程序。需要做出的最大改进之一是通过缓存数据库中的结果来加速应用程序。通过将它们缓存到 .dat 文件,我已经能够成功地做到这一点。这个应用程序遵循一个特定的路径,所以我在完成后一直在删除未使用的缓存文件。但是,在应用程序 (PV.asp) 的最终 .asp 页面上,文件在不应该被删除的时候被删除了。

我的意图是这样

 <input type="button" value="Done"  style="width: 56px; height: 40px" onclick="finish()"    />

^ 这是“完成”按钮的代码,它调用了 finish() 函数。如下:

    function finish() {
        var size = "<%response.write(size) %>";
        if (size == "0") {
        var done = confirm("All Items mod, would you like to save?");
        if (done == true)
        {
            if (window.XMLHttpRequest)
            {
                xmlhttp = new XMLHttpRequest();
            }
            else
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            var concode = "<%=Replace(concode, "\", "\\" )%>";
            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                    {
                        document.getElementById('concode').value = concode;
                        document.forms["confirm"].submit();
                    }
            }
            <%if NOT rsTrxTy.EOF then
            if rsTrxTy.fields("TYPE").value = "TO" then%>
            ~Stuff happens here~
            <%end if 

            if rsTrxTy.fields("TYPE").value = "TI" then%>
            ~Stuff happens here~
            <%end if
            end if

            if NOT rsOrdrs.EOF then%>
             ~Stuff happens here~
            <%end if %>
            <%
            dim fso
            Set fso = Server.CreateObject("Scripting.FileSystemObject")
            fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat"
            fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat"
            fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat"
            fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat"  %>
        }
    }
    else {
            alert("All items have not been mod.");
        }
    }

当用户单击“完成”按钮时,对项目所做的更改将提交到数据库。我的意图是在执行此操作时,将删除缓存的文件。 但是,即使用户没有单击“完成”按钮,DeleteFile 命令也会运行。它在页面完成加载后运行。这会导致问题,因为页面将尝试从加载 PV.asp 时删除的缓存文件加载。 由于此应用程序几乎可以在不关闭窗口的情况下持续使用,因此会话 ID 将保持不变,这样就不会删除缓存的文件(因为当应用程序重新启动时,它将尝试加载已经存在的文件)缓存)。

我的问题是,为什么文件应该包含在仅在用户单击完成时才执行的 javascript 函数中时被删除?我在 ASP/Javascript 方面没有经验,因为这个项目是强加给我的,所以如果这是一个简单的问题,我很抱歉,但老实说我很难过。

注意—— 迁移到 ASP.Net 是不可能的。请不要建议这个。

4

1 回答 1

5

这不是 ASP 的工作方式。ASP 代码段(之间的内容<% ... %>)仅在页面首次加载时计算一次。

例如,如果您这样做:

<script type="text/javascript">
function finish() {
<%              
dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")                  
fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat"               
fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat"              
fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat"              
fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat"  
%>
}
</script>

页面加载fso.DeleteFile时调用函数调用,而不是在触发 JavaScript 函数时调用。

为什么?当服务器收到对 ASP 页面的请求时……它首先通过并处理<% %>与真实 HTML 之间的所有动态代码段,然后返回给用户一个他们可以加载的页面。注意:浏览器不知道如何处理<% %>标签!服务器是唯一可以做到这一点的人。

这有意义吗?

您有几个选项可以执行您实际尝试在此处执行的操作,但我会向新的 ASP 页面执行 Ajax 请求,它所做的只是调用您需要的 fso.DeleteFile 命令。

这是一个例子: http: //www.degraeve.com/reference/simple-ajax-example.php

其他选项是使用 get/post 到同一页面,并带有将触发 DeleteFile 的参数。你必须重新设计一点才能使用它。我推荐ajax解决方案。

于 2012-09-24T15:33:20.433 回答