标签存档: ASP

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

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

这篇开始讲讲ServerXMLHTTP的进阶应用。说是进阶应用,但也就是讲一些在基本应用里没有讲到的属性或者方法之类:)

使用setRequestHeader伪装User-Agent

User-Agent一般是服务端程序用来判断客户端浏览器、操作系统等信息的标志,它的说明可以参考Wiki,譬如在我的电脑 IE7 的UA就是:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ;

SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

可以看到,这个UA提供了不少信息,IE版本、Windows版本、.NET版本都有。再看看 Firefox 的:

Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)

UA的格式不是本文的重点,因此,如果需要了解UA的具体格式,可以去Google上找找,另外,在http://www.user-agents.org/这里可以找到目前大多数浏览器、搜索引擎Spider等的UA。

在我们使用 ServerXMLHTTP 发送请求时,它所用的 User-Agent 是以下内容:

Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)

但是,某些网站会限制这个UA的访问,比如Google,如果我们使用以下代码来请求Google的页面,它使用的是默认UA“Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)”:

<%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = “http://news.google.cn/?output=rss”;
var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0”);
xmlhttp.open(“GET”, url, false);
//xmlhttp.setRequestHeader(“User-Agent”, “Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)”);
xmlhttp.send(“”);
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>

你会发现,我们会收到一个 403 Forbidden 的错误:

为了使得Google的RSS输出程序能把我们的识别成正常的RSS阅读或者一般浏览器,就需要在请求发出前设置 Request Header。要设置 Request Header,只需要简单的在调用 open 方法之后,send 方法之前使用 setRequestHeader 来设置就行了,它的语法是 xmlhttp.setRequestHeader(key, value)。下面我们就让Google的RSS输出程序把我们的请求识别为Firefox的请求:

<%@LANGUAGE=”JScript” CODEPAGE=”65001″%>
<%
// code from xujiwei
// http://www.xujiwei.cn
var url = “http://news.google.cn/?output=rss”;
var xmlhttp = new ActiveXObject(“MSXML2.ServerXMLHTTP.5.0”);
xmlhttp.open(“GET”, url, false);
// 设置 User Agent 为 Firefox 的UA
xmlhttp.setRequestHeader(“User-Agent”, “Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)”);
xmlhttp.send(“”);
Response.BinaryWrite(xmlhttp.responseBody);
xmlhttp = null;
%>

刷新浏览器,显示出了Firefox的RSS预览界面,获取Google资讯RSS成功!

ok,我们能正确得到Google资讯的RSS了,再通过XMLDOM来操作返回的RSS文档,就可以采集Google资讯那海量的新闻了。

to be continued.

系列目录:

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

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

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

by xujiwei

http://www.xujiwei.com/

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

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

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

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

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

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

希望此文对你有所帮助。

by Xu Jiwei

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了 :)

[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

在ASP里面创建GUID

GUID在许多时候做为唯一标识符都很方便,但是在ASP里并没有现成的函数来创建GUID,其实可以使用Scriptlet的类型库来创建一个GUID,代码如下:

JScript

  • function GenerateGuid() {
  • var TypeLib = new ActiveXObject(“Scriptlet.TypeLib”);
  • return (TypeLib.Guid);
  • }

VBScript

  • Function GenerateGuid()
  • Dim TypeLib
  • Set TypeLib = Server.CreateObject(“Scriptlet.TypeLib”)
  • GenerateGuid = TypeLib.Guid
  • End Function

如果要在客户端使用的话,VBScript的代码需要稍做修改,即把:

Set TypeLib = Server.CreateObject(“Scriptlet.TypeLib”)

修改为:

Set TypeLib = CreateObject(“Scriptlet.TypeLib”)

但是在客户端使用ActiveX的时候,IE默认的安全设置会提示是否允许使用ActiveX,所以并不推荐使用。

希望对你有所帮助。

[AJAX] ASP中使用GB2312编码时处理乱码问题

在AJAX开发中,编码问题往往是令开发者比较头痛的,特别是在编码不是UTF-8的情况下。虽然这篇文章是讲的怎么处理乱码问题的,但是我还是推荐在做AJAX开发的时候使用UTF-8编码,这样可以避免很多问题。

AJAX中,XMLHttpRequest发送数据和接收数据的时候往往都是使用UTF-8来处理数据的,也就是说,虽然程序是使用GB2312作为编码的,但是XMLHttpRequest还是以UTF-8来处理,这样就导致乱码问题了。

所以如果要解决乱码问题,可以通过指定文件编码来解决。指定文件编码后,XMLHttpRequest就会使用指定的编码来处理文件,这样,碰到GB2312编码的文件时,XMLHttpRequest还是能以GB2312编码来读取文件,这样就能避免乱码了。

要设置编码方式,可以发送ContentType头来指定。

在ASP里,要设置ContentType,可以用以下语句:

  • Response.ContentType = “text/html; charset=gb2312”

在ContentType里,charset就指定了文件编码。

一般在AJAX客户端需要处理和显示中文数据时候,最好在服务端设置文件编码,即设置ContentType。如果服务端不知道是否会返回中文数据,那么还是设置一下编码的好。

这样处理AJAX中乱码的方法并不局限于ASP,比如在PHP里也可以使用header函数来设置ContentType。其实理论上只要能在服务端设置HTTP请求的header,就能通过这样的方式来解决乱码问题。

就这样。