在ASP中Application对象一般被用作高速缓存,保存一些频繁用到的数据。Application直接将数据保存到内存并一直留存,因此也可以作为不同页面的共享变量。Application对象可以保存普通的数据类型如数字型和字符串型,还可以保存数组和一些对象。
好像偶说太多废话了……还是直接开始正题吧 = =
这里说的XMHTTP对象是指 MSXML2.XMLHTTP 等一般用来获取远程网页的对象,类似的还有 MSXML2.ServerXMLHTTP,Microsoft.XMLHTTP 等。对于一些普通的对象来说,是可以直接保存到Applicaion里面的,但是这些XMLHTTP对象却不能直接保存进Application里面。当试图将一个XMLHTTP对象保存进Applicaion的话,IIS会报错:不能将具有单元模型特点的对象添加到应用程序的固有对象中。
很遗憾,看来我们就不能将一个XMLHTTP直接保存到Application里面了
那这篇文存在的意义是什么?
……
当然是有别的办法来把XMLHTTP保存到Application里面的啦
我们注意到,直接把数组保存到Application里面是完全没有问题的,而同时,数据的数据类型也可以对象。这样子的话,如果我们先把一个XMLHTTP对象放到一个数组里面,然后再把这个数组保存到Application里面,是不是可以呢?
实践证明,这是可以的。
'首先定义一个数组
Dim XMLHTTP(0
'将XMLHTTP对象放到数组里面
Set XMLHTTP(0) = Server.CreateObject("MSXML2.ServerXMLHTTP")
'将数组保存到Application里面
Applicatino("xml") = XMLHTTP
%>
好了,这样就把一个XMLHTTP对象保存到Application里面了
把XMLHTTP保存到Application里面以后,他就会永久驻留于内存,这也就是说,我们甚至可以使用异步方式发送一个请求,然后在另一个页面获取结果。如果仅仅是用一个变量保存XMLHTTP对象的话,是不能实现异步请求并获取数据的(除非页面XMLHTTP发出请求之后还继续运行足够长的时间)。下面就来异步发送一个请求,并在下次访问这个页面的时候输出请求得到的数据:
'如果还没有发送请求就发送请求
If Application("xml")(0).readyState = 0 Then
Application("xml")(0).open "GET", "http://www.gsea.com.cn", True
Application("xml")(0).send
End If
'如果已经收到结果就显示
If Application("xml")(0).readyState = 4 Then
Response.Write Application("xml")(0).ResponseText
End If
%>
这样在XMLHTTP将请求发送以后,即使在页面执行完毕之前还没有得到返回的数据,XMLHTTP也随着Application存在与内存中,等待着接收返回的数据。我们再次调用这个页面的时候,如果数据已经获取完毕了,就可以输出返回的数据。
不过需要注意的是,由于这种将XMLHTTP保存到Application的做法是不允许的(从直接保存XMLHTTP到Application时的得到的错误信息可以看出这是不允许的),所以这种形式的XMLHTTP对象并不稳定。我在测试的时候,遇到过以下错误:应用程序调用一个已为另一线程整理的接口
这个错误是在调用open方法时发生的,此后不管对这个XMLHTTP做什么操作,不是没反应就是报错,必须重新创建一个新的XMLHTTP对象才行。
这个错误,我在动网中调试的时候,我把open方法放在savepost.asp中,在保存发帖数据的时候调用,才调用了1两次,就发生上面那个错误了。而我自己写了个简单的程序的时候,不管怎样调用这个XMLHTTP的什么方法,都很难出现这个错误。我想这可能是因为在动网中使用的时候,是在动网的Dvbbs类里面使用的,而这个Dvbbs类几乎是每执行一个页面就创建删除一次,可能就是因为这种频繁的操作才导致了XMLHTTP容易发生那个诡异的错误。
—————————以下纯属异想天开,欢迎闲得没事做的人去实验,成功的话告诉我哦
XMLHTTP还有一个属性——onreadystatechange——在ReadyState改变的时候触发指定的操作,一般在这个操作就是调用一个函数,函数中判读readyState的值,如果是4——数据接收完毕——就对数据进行处理。
我就想,能不能把一个类也保存到Application中,然后设置onreadystatechange,这样是不是能实现只需要访问一次ASP页面,就可以以异步方式处理XMLHTTP发送请求以后的所有事情呢?
比如说,定义一个类,里面有一个函数,这个函数的作用是读取XMLHTTP获得的数据,将其保存(写入文件或数据库),紧接着,再让XMLHTTP发送一个新的请求……
如果这个方法可行的话……接下去我不敢想象会发生什么事情了……
真的,如果你闲得没事做的话就去试一试吧 = =,反正偶现在光是想就已经被自己的想法吓到了
F-22's Trace
greensea 的个人主页
sky-city
极夜奁
小樱之町
不错的主意~~~