Category Archives: Web - Page 3

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

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

接着上一篇《服务端XMLHTTP(ServerXMLHTTP in ASP)基本应用(上)》继续讲讲ServerXMLHTTP的基本应用。

3. 请求使用HTTP认证的页面

呃,虽然说目前使用HTTP基本认证的已经少之又少,但是,总该知道ServerXMLHTTP有这么一个功能,可以直接实现HTTP基本认证。

在ServerXMLHTTP对象的open中,我们通常用到的只是它的前3个参数,即method、uri、async,但事实上,它还有另外两个可选参数,即用于HTTP基本认证的username及password。

那么,如果某天,我们要使用ServerXMLHTTP访问某个使用HTTP基本认证的网站,并且我们已经有了认证所需要的用户名及密码,那么可以使用以下密码来访问需要认证的内容:

  • <%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
  • <%
  • // code from xujiwei
  • // http://www.xujiwei.cn
  • // 访问www.google.cn并不需要HTTP认证,这里只是作为一个演示
  • var url = ”http://www.google.cn”;
  • var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0″);
  • // 用户名和密码分别为username和password
  • xmlhttp.open(“GET”, url, false, ”username”, ”password”);
  • xmlhttp.send(“”);
  • Response.BinaryWrite(xmlhttp.responseBody);
  • xmlhttp = null;
  • %>

4. 使用responseXML属性

有时候,我们所需要的结果并不是文本的,而是一个XML文档,譬如目前最常用的RSS。这个时候,responseXML属性就是我们的不二选择了。

使用responseXML属性所得到的对象,就是一个DOMDocument对象,这个对象可以使用诸如selectNodes、selectSingleNode这样的方法来操作XML文档对象。

例如,我们可以利用ServerXMLHTTP抓取新浪新闻的RSS并显示出来:

  • <%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
  • <%
  • // code from xujiwei
  • // http://www.xujiwei.cn
  • // 新浪新闻的RSS地址
  • var url = ”http://rss.sina.com.cn/news/marquee/ddt.xml”;
  • var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0″);
  • xmlhttp.open(“GET”, url, false);
  • xmlhttp.send(“”);
  • var xml = xmlhttp.responseXML;
  • Response.Write(“<h1>” + xml.selectSingleNode(“/rss/channel/title”).text + ”</h1>”);
  • var items = xml.selectNodes(“/rss/channel/item”);
  • for(var i = 0; i < items.length; i++) {
  • Response.Write(“<h3>” + items[i].selectSingleNode(“title”).text + ”</h3>”);
  • Response.Write(“<small>” + items[i].selectSingleNode(“pubDate”).text + ”</small>”);
  • Response.Write(“<div>” + items[i].selectSingleNode(“description”).text + ”</div><hr />”);
  • }
  • items = null;
  • xmlhttp = null;
  • %>

这些如果弄明白了,写一个RSS新闻聚合器就不是难事了。当然XMLDOM操作就不在本系列的范围之类了。

5. to be continued

呃,这篇其实有点废话了。隔得有点久,都快忘了该写什么了。

接下来会写写稍微进阶点的操作。

系列目录:

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

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

by xujiwei

http://www.xujiwei.com

服务端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

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

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

近几年很流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 Ajax,服务端 XMLHTTP 就是在服务端使用 XMLHttpRequest 对象了。虽然说,在服务端使用异步请求是比较不方便的,但是做为可以服务端发送 HTTP 请求的组件,学习一下也是没有坏处的。

这里,我讲的是在 ASP 环境中使用服务端 XMLHttpRequest,并以 JScript 做为演示代码的语言,因此,你需要了解 ASP 以及 JScript。

服务端 XMLHTTP,通常会用在获取远程主机的网页或者其他内容,新闻聚合系统一般就是使用服务端 XMLHTTP 对象来获取要聚合的 Feed 的内容,然后使用 XMLDOM 对象来分析 Feed 的内容,取出新闻的标题、作者、内容等信息,再存在数据库中,然后将若干个数据源的新闻一起显示在一起。抓虾就是这样一个新闻聚合器,但是它不是用 ASP 写的就是了 :)

在 ASP 中,我们可以用以下代码来创建一个 ServerXMLHTTP 对象,而这个对象,就是我们在服务端进行一切操作的基础。

  • // demo code from xujiwei
  • // @website: http://www.xujiwei.cn/
  • var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0″);

首先来了解一下 ServerXMLHTTP 对象有哪些比较有用的方法

1. abort 这个方法用于取消 XMLHTTP 的请求。如果 XMLHTTP 对象以异步方式发送请求,如果到达一定的时间请求仍然没有返回,就可以使用这个方法来取消请求。

2. getAllResponseHeaders 这个方法的返回值是一个字符串,相当于 HTTP 请求的头部去掉了请求方法、URI和协议版本信息。

3. getResponseHeader 这个方法用来获取指定头部信息,比较有用的就是可以用来获取返回数据的 Content-Type、Referer 等。

4. open 使用指定的请求方法、URI和同步方式以及认证信息等初始化一个请求。

5. send 发送 HTTP 请求,等待接收响应数据,注意,如果是以同步方式发送请求,send方法调用后不会立即返回,而是等到请求完成后才会返回,而以异步方法请求时,则会立即返回。另外,send方法带有一个可选参数body,表示要发送的数据,这在使用 POST 方法时比较有用。

6. setTimeout 设置 ServerXMLHTTP 对象的 4 个超时时间,分别是:域名解析、连接服务器、发送数据、接收响应。可以通过设置相应的超时时间来控制 ServerXMLHTTP 对象,以免 ServerXMLHTTP 不能及时返回而造成程序停止响应。

7. setRequestHeader 设置请求的 Header,在客户端 XMLHttpRequest中,通常用来设置请求的数据类型,或者标识请求的方法等等,例如 jquery 会增加头部标识 X-Request-With,表示请求是从 XMLHttpRequest 对象发出,以方便服务端做出相应的动作。

8. waitForResponse 在使用异步方式发送请求时,可以用这个方法来控制请求的进程。在服务端脚本中,不可以像客户端那样直接使用回调函数来控制异步请求,也没有相应的函数来使用程序休眠一定的时间,因此,为了等待请求返回,我们可以使用这个方法来等待一定时间。

另外,还有其他一些方法,如 getOption、setOption、setProxy 等,这些方法用得比较少,因此这里不再介绍,需要了解的朋友可以查阅 MSDN。

接下来,再看看 ServerXMLHTTP 对象的属性

1. onreadystatechange XMLHTTP 对象状态改变时的回调函数,这个属性为异步操作奠定了一个基础,可以让程序在不用查询 XMLHTTP 对象状态的情况获知 XMLHTTP 操作是否已经完成。

2. readyState XMLHTTP 对象状态,有 5 个值,从 0 到 4,分别代表的意思是:

0 - 未初始化,刚使用 new ActiveXObject(“MSXML.ServerXMLHTTP.5.0″) 创建时对象所处的状态

1 - 载入中,这个时候,已经调用了 open 方法,但是还没有使用 send 方法发送数据

2 - 已经载入,已经调用了 send 方法发送数据,但是还没有可用的响应流

3 - 正在交互,正在接收数据,这个时候可以使用 responseBody 和 responseText 属性来获取已经得到的部分数据了

4 - 完成请求,全部数据已经接收完成

通常情况下,我们只需要判断一下状态 4 即可,这个时候数据已经全部载入,使用 responseBody 或 responseText 属性就能获取需要的数据。

3. status HTTP 响应状态码,正常情况应该为 200,如果请求的资源不存在,就会返回 404,还有其他状态码如服务器错误 500 等。

4. statusText HTTP 响应状态文本,用于描述响应状态码所代表的意思,诸如 200 OK 中的 OK,404 Not Found 中的 Not Found

5. responseBody 响应数据的字节数组,这在 VBScript 里是可以直接使用的,但是在 JScript 里就需要转换过了。

6. responseText 以文本方式获取响应数据

7. responseXML 将响应数据作为一个 XMLDOM 对象来返回,这在请求的数据是一个 XML 文档时特别有用

8. responseStream 响应流对象,这个属性不常用

by xujiwei

http://www.xujiwei.com

to be continued …

在JScript中使用ADODB.Stream判断文件编码

在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,因此需要通过一个特别的方法来获取文件开关的编码标识。

一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是不行的。

继续寻找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面刚好有我需要的内容。

其实说来也简单,就是把编码换一下,使用437,这个是IBM扩展过的ASCII编码,把ASCII编码的最高位也利用起来,将字符集中的字符从128个扩展到256个,而使用这个字符集读取的字符数据就相当于原始二进制数据了。

解决了障碍后,就要开始识别文件的编码了,通过使用ADODB.Stream对象来读取文件的开始两个字节,然后根据这两个字节就可以判断文件编码是什么了。

UTF-8文件如果带BOM的话,那么头两个字节就是0xEF、0xBB,再例如Unicode文件的开始两个字节是0xFF、0xFE,这些就是判断文件编码的依据。

需要注意的是,在ADODB.Stream读取字符时,并不是一一对应的,也就是说,如果二进制数据是0xEF,读取出来的字符经过charCodeAt之后,并不是0xFE,而是另外的值,这个对应表可以在上面提到的文章里查到。

  • function CheckEncoding(filename) {
  • var stream = new ActiveXObject(“ADODB.Stream”);
  • stream.Mode = 3;
  • stream.Type = 2;
  • stream.Open();
  • stream.Charset = ”437″;
  • stream.LoadFromFile(filename);
  • var bom = escape(stream.ReadText(2));
  • switch(bom) {
  • // 0xEF,0xBB => UTF-8
  • case ”%u2229%u2557″:
  • encoding = ”UTF-8″;
  • break;
  • // 0xFF,0xFE => Unicode
  • case ”%A0%u25A0″:
  • // 0xFE,0xFF => Unicode big endian
  • case ”%u25A0%A0″:
  • encoding = ”Unicode”;
  • break;
  • // 判断不出来就使用GBK,这样可以在大多数情况下正确处理中文
  • default:
  • encoding = ”GBK”;
  • break;
  • }
  • stream.Close();
  • delete stream;
  • stream = null;
  • return encoding;
  • }

这样,在需要的时候,通过调用CheckEncoding函数就可以获取文件的编码了。

希望此文对你有所帮助。

xujiwei

ASP中使用FileSystemObject时提高性能的一个小技巧

在封装自己的FileSystemObject库的时候,测试的时候发现在文件夹或文件很多的时候,效率很低,显示一个文件夹需要2秒甚至更多,这让我很是奇怪,因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性,这应该不会引起性能上的问题,但是事实却说明我的想法过于简单了。

按个测试了一下可能会是哪些属性引起的性能问题,在去掉Type也就是类型属性显示的时候,性能有了很大提高,之后的测试也证明了是Type属性的使用导致了性能问题。

仔细想了一下,Type引起性能低的原因应该是,引用Type属性所得到的是文件的具体类型信息,也就是我们在资源浏览器里看到的那样,比如TXT文件的类型就是显示为“文本文档”,但是这个类型信息却是存储在系统中,通过文件扩展名进行关联的。在FSO中使用Type属性的时候,对于每个File对象,FSO都需要根据扩展名去系统中检索这个扩展名对应的类型名称,这样,就极大的降低了性能。

因此,在使用FileSystemObject时,如果可以不使用File或者Folder对象的Type属性,就尽量不使用。

希望此文对你有所帮助。

by Xu Jiwei

BOM引起的网页布局混乱

页面的上部比正常状态下多出一块空白,而且整个页面的布局完全是混乱的。

一开始以为是服务器上文件版比本地的文件版本旧的原因,比对了一番没找到不同的,然后想到会不会是文件编码的问题。

切换到Zend Studio,找到首页的模板文件,属性里一看,编码UTF-8,对的,但是下面一行字引起了我的注意,“Byte Order Mark is UTF-8 (BOM)”,于是就想是不是这个玩意引起的布局混乱。

打开EditPlus,设置文件保存选项为一直删除BOM,打开首页模板,保存,上传,测试,没有问题!

看来果然是BOM的问题了,接下来的事就比较机械了,在模板文件里看哪些是带了BOM的,直接到EditPlus里走一遭就行了。

解决了这个问题才想起来,有些模板为了转换成UTF-8编码的,就用记事本打开文件,然后另存为UTF-8编码了,但是记事本是会给UTF-8编码的文件加上BOM的,因此就引起了首页布局的混乱。

嗯,问题解决,就这样。

ASP 中实现 MVC 架构

这些天在看《Ruby for Rails》,对RoR起了点兴趣,在想着能不能在ASP里也整个MVC出来,恰好前天在经典看到了一篇帖子《分享一个好东东,动态Include文件 (Dynamic File Includes)》,虽然之前也在BlueIdea看到过动态include,但是那个函数不是很完善,所以也就没怎么注意。

但是这个动态include比较符合需要,常规应用都能应付,刚好看了RoR有点想法,于是就有了ASP MVC的尝试,写了一点简单的东西,为了共享,就放到Google Code上去了~

主页地址:http://code.google.com/p/asp-mvc/

要check out源代码的话,可以使用这个地址:http://asp-mvc.googlecode.com/svn/trunk/

具体怎么使用SVN就请大家自行google了 :)

JavaScript 中为 Date 类实现 DateAdd 方法

JavaScript 中的并没有提供像 VBScript 里的 DateAdd 方法用于日期的操作,像加一年,减一个月什么的,这在服务端经常用到,比如设置 Cookie 的到期时间为现在时间的后一年,那么就需要使用这个方法了。

虽然 JavaScript 中没有 DateAdd 方法,但是 Date 类却有设置年月日时分秒的方法,比如 setFullYear、setMonth 之类的,而且,这些个方法的参数是可以为负的,在设置之后, Date 类会自行进行调整,每个月是30天还是31天,年份是不是闰年都不用我们来管了,只管设置值就是。

有了这个特性之后,我们就可以很方便的来为 Date 类添加 add 方法了。之所以不添加一个 DateAdd 方法而是给 Date 类添加一个 add 方法是因为我觉得那样更加方便,当然你也可以将 Date 类的 add 方法转换成为一个全局函数 DateAdd。

为了对每一个 Date 类的实例都有效,这里用到了 prototype 对象。

在 VBScript 里的 DateAdd 方法是用一个字符串来控制所加的量是年还是月还是其他的,所以在这里我也模仿 VBScript 里的 DateAdd 方法,使用一个字符串来控制所加量对应的部分,比如 y 代表年,m 代表月。

最后得到的代码如下:

  • Date.prototype.add = function(part, value) {
  • value *= 1;
  • if(isNaN(value)) {
  • value = 0;
  • }
  • switch(part) {
  • case ”y”:
  • this.setUTCFullYear(this.getUTCFullYear() + value);
  • break;
  • case ”m”:
  • this.setUTCMonth(this.getUTCMonth() + value);
  • break;
  • case ”d”:
  • this.setUTCDate(this.getUTCDate() + value);
  • break;
  • case ”h”:
  • this.setUTCHours(this.getUTCHours() + value);
  • break;
  • case ”n”:
  • this.setUTCMinutes(this.getUTCMinutes() + value);
  • break;
  • case ”s”:
  • this.setUTCSeconds(this.getUTCSeconds() + value);
  • break;
  • default:
  • }
  • }

代码里的 getUTCFullYear 等等也可以换成通常用的 getFullYear,因为是相对调整,所以用哪一个是没有区别的。

希望此文对你有所帮助。

xujiwei

[ASP] 解决 JScript 中使用日期类型数据时出现类型错误的问题

在服务端JScript中,有些时候需要使用日期类型的数据,比如说设置一个cookie的到期时间,更新数据库中的日期字段等。但是按照平常的方法来用js里的date类型数据时,运行时就会发生错误。

例如以下代码:

  • <%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
  • <script language=”JScript” runat=”server”>
  • Response.Cookies(“xujiwei”)(“name”) = ”xujiwei”;
  • Response.Cookies(“xujiwei”)(“gender”) = ”male”;
  • var expiredDate = new Date(2008, 11, 31);
  • Response.Cookies(“xujiwei”).Expires = expiredDate;
  • </script>

在浏览器中打开之后,就会出现以下错误:

Microsoft JScript 运行时错误 错误 ’800a000d’ 类型不匹配 /temp/test.asp,行 6

这就意味着,我们按照类似在VBScript里的使用日期类型数据的方法在JScript不再行得通,但是我们总是需要在服务端中使用日期类型数据的,如果操作数据库是采用参数化Command的方式的话,那么需要使用日期类型数据的地方会更多,总不能因为不能使用常规方法来添加一个日期参数而把它放在SQL语句里吧。

幸好,JScript的设计者们考虑到了这一点。JScript在服务端使用时,往往是做为ASP的另一种脚本语言,而JScript则是微软在JavaScript上发展而来的微软自己的东西,考虑到这一点也是应该的。

在JScript中,解决这一问题的关键就是,Date类型的对象提供了一个函数getVarDate,它在JScript语言参考的说明如下:

当与 COM 对象、ActiveX® 对象或其他以 VT_DATE 格式接受和返回日期值的对象(例如 Visual Basic 和 VBScript)进行交互时,使用 getVarDate 方法。实际格式取决于地区设置,不随 JScript 变化。

好了,到现在问题的解决方法也已经浮出水面,就是使用getVarDate()函数将Date类型对象转换成可以与ASP中内置对象Response等可以交互的日期类型对象,那么将一开始的代码修改如下:

  • <%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
  • <script language=”JScript” runat=”server”>
  • Response.Cookies(“xujiwei”)(“name”) = ”xujiwei”;
  • Response.Cookies(“xujiwei”)(“gender”) = ”male”;
  • var expiredDate = new Date(2008, 11, 31);
  • Response.Cookies(“xujiwei”).Expires = expiredDate.getVarDate();
  • </script>

再在浏览器打开这个测试页面的时候,就不再会有错误信息出现,说明客户端的Cookies成功写入并设置了到期时间为2008年12月31日。

希望此文对你有所帮助。

xujiwei

解决 ADODB.Stream 0x800A0C93 错误

ADODB.Stream在ASP编程中往往用于无组件上传,并且可以指定文件编码,可以应对各种不同的需要。但是在使用ADODB.Stream过程中,往往会发生这样那样的错误,昨天就碰到了一个0x800A0C93错误,在网上找了半天也没找到解决方法,找到的都是些什么权限的问题,但是在我使用的时候,权限配置并没有问题,因此只好自己琢磨了。

如果要再现这个错误,可以使用以下代码:

  • <script language=”jscript” runat=”server”>
  • var obj = Server.CreateObject(“ADODB.Stream”);
  • obj.Mode =1;
  • obj.Type = 2;
  • obj.Open();
  • obj.LoadFromFile(Server.MapPath(“test.asp”));
  • Response.Write(obj.Read());
  • obj.Close();
  • </script>

因为在使用ADODB.Stream时,我是想用它来读取文件,所以使用了Mode 1 - Read,然后使用LoadFromFile方法载入文件,但就是这里,出现问题了,运行到LoadFromFile的时候,出现错误,提示“应用程序请求的操作不允许出现在该上下文中 ”,弄了半天也没解决。

去网上找,解决方法大都一样,权限设置不对什么的,解决不了我的问题,只好继续自己琢磨。

又折腾了一会之后,想到,会不会是Mode的问题,因为之前这段代码是用得好好的,但是在放到我写的一个类的Read方法中之后,就把Mode改成1 - Read了,又想到,LoadFromFile方法应该是把所指定的文件内容写入到了ADODB.Stream对象的缓冲区当中,所以需要写权限,当下测试:

  • <script language=”jscript” runat=”server”>
  • var obj = Server.CreateObject(“ADODB.Stream”);
  • obj.Mode = 3;
  • obj.Type = 2;
  • obj.Open();
  • obj.LoadFromFile(Server.MapPath(“test.asp”));
  • Response.Write(obj.Read());
  • obj.Close();
  • </script>

将Mode改成3 - ReadWrite之后,问题解决。

希望本文对你有所帮助。

xujiwei

.