服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(上)(2)
作者:xujiwei 来源:HotHeart's BLOG 发布时间:2008-11-11 12:49:00
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)基本应用(上)


猜你喜欢
- 需求:对方提供处理文件的接口,本地将待处理文件压缩后,通过http post multipart方式上传,等待处理完成后从相应连接下载结果代
- Silverlight也算一个比较开放的技术。Button控件其实也是一些标准的Grid、Canvas、Rectangle、TextBloc
- 本文实例讲述了JS实现求5的阶乘运算操作。分享给大家供大家参考,具体如下:方案一:利用while循环function factorial(n
- Python 列表(list):1.序列介绍: 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引
- 设置MySQL数据同步(单向&双向)由于公司的业务需求,需要网通和电信的数据同步,就做了个MySQL的双向同步,记下过程,以后用得到
- 本文实例讲述了python实现的简单抽奖系统。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env python#codin
- 如下所示:# coding=gbkfrom PIL import Imageimport numpy as np# import scipy
- 本文介绍了python的构建工具setup.py,分享个大家,具体如下:一、构建工具setup.py的应用场景在安装python的相关模块和
- 前言在《设计模式》一书中工厂模式提到了:工厂方法模式(Factory Method)抽象工厂模式 (Abstract Factory)但是在
- 抢票是并发执行多个进程可以访问同一个文件多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务db.tx
- 安装pip(3) install pyecharts此文版本为v1.6此文版本为v1.6此文版本为v1.6效果图使用Pycharts绘制一个
- 安装lxml首先需要pip install lxml安装lxml库。如果你在ubuntu上遇到了以下错误:#include "li
- MySQL UNION 操作符本教程为大家介绍 MySQL UNION 操作符的语法和实例。描述MySQL UNION 操作符用于连接两个以
- 使用pytorch的dataloader报错:RuntimeError: stack expects each tensor to be e
- 1.聚合运算(1)使用内置的聚合运算函数进行计算1>内置的聚合运算函数sum(),mean(),max(),min(),size(),
- 本文实例讲述了python简单实现旋转图片的方法。分享给大家供大家参考。具体实现方法如下:# rotate an image counter
- PHP children() 函数实例查找 note 节点的子节点:<?php $note=<<<XML<no
- 应该只是一个简单的层的定位及鼠标事件吧<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.
- 返回首页的链接地址,有三种方法:1、一般方法是,直接写对应的域名地址,<a href="http://www.zfnn.co
- 实现代码# -*- coding: cp936 -*-import re s1 = 'adkkdk's2 = 'ab