网络编程
位置:首页>> 网络编程>> JavaScript>> 服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(上)(2)

服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(上)(2)

作者:xujiwei 来源:HotHeart's BLOG 发布时间:2008-11-11 12:49:00 

标签:XMLHTTP,Url,responseText,setTimeouts,超时,服务器

2. 设置超时

在使用ServerXMLHTTP发送同步请求时,整个ASP程序的执行是被阻塞了的,也就意味着在开始发送请求到请求完成响应这段时间里,我们是做不了任何事情的。那么这里就有几个问题,如果所请求的域名解析很慢怎么办?如果程序运行的服务器与请求的服务器之间的网络环境比较差导致连接很慢怎么办?如果要发送的数据量很大但是带宽不够怎么办?同样如果响应的数据量很大但是带宽不够怎么办?

服务器所在环境及网络条件我们是无法改善的,因为,面对这些问题,我们只能采取回避的策略,即如果碰到这些问题,我们就直接丢掉这个请求。这时,ServerXMLHTTP的超时机制就有很大的用处了。

在前一篇中,我介绍了ServerXMLHTTP的常用方法,其中有一个setTimeouts方法,就是用来设置ServerXMLHTTP对象的四个超时时间,分别是:域名解析超时时间(resolveTimeout)、连接超时时间(connectTimeout)、数据发送超时时间(sendTimeout)、数据接收超时时间(receiveTimeout)。这四个超时时间所代表的意义可以从它们的字面来理解,它们分别对应了这一节开头所提出一的四个问题。

在不使用setTimeouts方法进行设置的情况下,域名解析超时时间(resolveTimeout)是无限的,即不会在域名解析时产生超时,连接超时时间(connectTimeout)的默认值为60秒,数据发送超时时间(sendTimeout)的默认值为30秒,数据接收超时时间(receiveTimeout)的默认值也是30秒。

通常情况下,我们不需要默认值中所指定的那么长的超时时间,因为碰到了最坏的情况下,在一个页面显示时,访客将要面对2分钟左右的无响应时间,这时访客往往认为这个页面是无效的并且会离开这个页面。

所以我们要做的就是给ServerXMLHTTP设置一个较短的超时时间,一般情况下,域名解析和连接远程服务器都可以在2秒内完成,发送数据时间视数据量而定,如果只是使用GET请求,这个数据量是很小的,也可以在2秒内完成,而响应,则可以稍微长一点,定在10秒左右,超过10秒时可以认为远程服务器没有响应。

需要注意的是,setTimeouts方法所使用的参数单位是以毫秒为单位的,也就是说,如果要指定2秒的超时时间,所用的参数为2000。另外,setTimeouts的参数顺序也是固定的,按顺序为:域名解析超时时间(resolveTimeout)、连接超时时间(connectTimeout)、数据发送超时时间(sendTimeout)、数据接收超时时间(receiveTimeout)。

那么,可以使用下面的代码来完成超时设置:

程序代码:

<%@LANGUAGE="JScript" CODEPAGE="65001"%> 
<% 
// code from xujiwei 
// http://www.xujiwei.cn 
var url = "http://www.google.com"; 
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0"); 
// 设置超时时间,注意参数顺序 
xmlhttp.setTimeouts(2000, 2000, 2000, 10000); 
xmlhttp.open("GET", url, false); 
xmlhttp.send(""); 
Response.BinaryWrite(xmlhttp.responseBody); 
xmlhttp = null; 
%>

如果在某个阶段超时了,程序会抛出异常,在JScript里可以使用try...catch来捕获,并根据ServerXMLHTTP对象的readyState属性来获知是在哪个阶段产生了超时异常。注意,同步请求时,超时异常会发生在调用send方法所在的行,例如上例中的xmlhttp.send("")。

程序代码:


<%@LANGUAGE="JScript" CODEPAGE="65001"%> 
<% 
// code from xujiwei 
// http://www.xujiwei.cn 
var url = "http://www.youtube.com/"; 
var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.5.0"); 
// 设置超时时间,注意参数顺序 
xmlhttp.setTimeouts(2000, 2000, 2000, 10000); 
xmlhttp.open("GET", url, false); 
try { 
    xmlhttp.send(""); 

catch(e) { 
    Response.Write("发生异常:" + e.message + "<br/>"); 
    // 判断是否为超时错误 
    if(e.number == -2147012894) { 
        var step = ""; 
        // 判断超时错误发生所在的阶段 
        switch(xmlhttp.readyState) { 
            case 1: 
                step = "解析域名或连接远程服务器" 
                break; 
            case 2: 
                step = "发送请求"; 
                break; 
            case 3: 
                step = "接收数据"; 
                break; 
            default: 
                step = "未知阶段"; 
        } 
        Response.Write("在 " + step + " 时发生超时错误"); 
    } 
    Response.End(); 

Response.BinaryWrite(xmlhttp.responseBody); 
xmlhttp = null; 
%>

3. to be continued

这篇有点长了,拆到下篇再继续写。

系列目录:

1. 服务器XMLHTTP(Server XMLHTTP in ASP)基础

2. 服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(上)

3. 服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(下)

4.服务端XMLHTTP(ServerXMLHTTP in ASP)进阶应用-User Agent伪装

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com