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

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

在上一篇《服务器XMLHTTP(Server XMLHTTP in ASP)基础》中我介绍了一下ServerXMLHTTP对象的一些基本属性和方法,接下来我讲讲ServerXMLHTTP的基本应用。

在ServerXMLHTTP中,异步请求不再是主要用途,往往是同步的请求用得更多,因为在服务端编程中,程序的执行是需要迅速结束并返回结果的,不像在桌面程序中,有一个消息循环。这样就导致了在服务端编程中,同步编程用得更多。当然,这并不是说异步请求没有用处,在一定的情况下,异步请求会有很大的作用。

1. 简单的使用ServerXMLHTTP请求并显示指定Url

首先来看一下很简单的例子,使用ServerXMLHTTP请求Google的首页并显示出来:

  • <%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
  • <%
  • // code from xujiwei
  • // http://www.xujiwei.cn
  • var url = “http://www.google.cn”;
  • var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0”);
  • xmlhttp.open(“GET”, url, false);
  • xmlhttp.send(“”);
  • Response.BinaryWrite(xmlhttp.responseBody);
  • xmlhttp = null;
  • %>

在浏览器查看这个页面,你就可以看到Google的首页了:

图片附件

但是,我们可以看到,这里的Logo图片是没有显示的,因为这个logo在网页源代码里是以相对路径的方式来指定的:

<img src=/intl/zh-CN/images/logo_cn.gif width=286 height=110 border=0 alt=”Google” title=”Google”>

但是,我们的测试服务器里并没有这个图片文件,因此浏览器就会显示此图片的替代文字“Google”。

这里我使用了xmlhttp的responseBody属性,这是因为,在不知道所请求的网页是使用什么编码的情况下,可以让浏览器来处理这个问题,而不用在服务器处理编码。如果要在服务器处理编码,你必需知道你所请求的URL所返回的内容是使用什么编码的,并且正确的将返回内容进行转码以使得客户端浏览器能正常的显示。

例如,我们请求Baidu的首页,就会因为编码问题而导致页面完全错乱:

图片附件

所以,使用responseText或者responseBody,完全取决于我们的需要,并不是一成不变的,或者,在某些时候,我们要使用的并不是这两个中的一个,而是responseXML:)

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)基础

by xujiwei

http://www.xujiwei.com

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>