??xml version="1.0" encoding="utf-8" standalone="yes"?>
Persits.Upload.1 (0x800A0001)
You must never use Request.Form in your upload script because
the ENCTYPE="multipart/form-data" attribute of your form makes this
collection unusable. Use Upload.Form instead.
Remeber, however, that the Upload.Form collection is
populated by a call to Upload.Save, therefore you can only use
Upload.Form after a successful call to Upload.Save.
BrowseQIE6QMozilla1.5QNetscape8.0QFriefox1.0QOpera8.51
步骤Q?br />
1、在iis新徏站点3?font color="#000000">Q?/font>www.goalercn.com(?
goalercn.com)Qimg.goalercn.comQblog.goalercn.com
2、在www.goalercn.com下徏立文件testcookies.aspQ代码如下:
<%
Response.Cookies("Type") = "Test Cookies"
Response.Cookies("Type").Expires = date()+30
Response.Cookies("Type").Domain = ".goalercn.com"
Response.Cookies("Type").Secure = False
Response.Write Request.Cookies("Type")
%>
3、在ad.goalercn.com下徏立文件testcookies.aspQ代码如下:
<%Response.Write
Request.Cookies("Type")%>
4、在blog.goalercn.com下徏立文件testcookies.aspQ代码同?br />
5、因为是本机试Q修改hosts文gQ把4个域名都指向?27.0.0.1Q也是d如下内容Q?br />
127.0.0.1 ad.goalercn.com
127.0.0.1 blog.goalercn.com
127.0.0.1 www.goalercn.com
127.0.0.1 goalercn.com
6、关闭所有浏览器Q开ie,打开http://www.goalercn.com/demo/testcookies.aspQ显C出文本?
容:Test Cookies
7、新建窗口,打开http://ad.goalercn.com/temp/testcookies.aspQ显C出文本?
容:Test Cookies
8、新建窗口,打开http://blog.goalercn.com/temp/testcookies.aspQ同hC出如上文本内容
9、换其他4个浏览器Q都成功?br />
注意点:
1、Response.Cookies("Type").Secure = FalseQSecure属性一定要是falseQ或者直接不执行q行Q如?
Secure = TrueQ则ad和blog?U域名是取g了?br />
2、Response.Cookies("Type").Domain = ".goalercn.com"Qdomain的|我设|?
?goalercn.com"Q也是没有前面的点Q在IE下成?br />
其他4个浏览器没测试?br />
3、path我猜是不应该讄的?br />
4、在局域网内其他机器上Q修改host指向到我机器的IPQ取值成功?br />
5、在局域网另外一台机器上架设ad.goalercn.comQ把testcookies.asp文gcopyq去Q同时修改host到当前机器,取?
成功
800A0001 Unspecified error
Problem Description
When uploading files with AspUpload 3.0 (and higher),
the following error may be thrown by the Save method:
Unspecified error
Solution
In most cases it means that your upload script
uses Request.Form or Request.QueryString prior to calling Upload.Save .
As a result, the BinaryRead method of the Request object fails.
单来?是说你使用了这个组?׃要再使用 Request.Form or Request.QueryString 来获取参敎ͼ都要用Upload.Form来获取,不然报错这个错
定长数组的长度是在定义时q定的Q在E序q行q程中是固定不变的。其定义格式为:
Dim
数组?[下界TO]上界)[Ascd名]
其中Q数l的下界和类型是可选的。所谓下界和上界Q就是数l下标的最值和最大倹{缺省下界时QvB?
认的下界?Q但通常Z习惯上是?开始的Q因?我们可以讄让数l的默认下界?Q这需要在每个模块?#8220;(声明)”部分d一行代码:
如果?
义数l时不指定其cdQ默认是变体型的?br />
下面举例说明定长数组的定义:
①Dim a(1 to 3)As Integer
②Dim
b(5 to 9)As String
③Dim c(7)As Integer
④Dim d(6)
其中Q例①定义了一个具有三
个元素的整型数组Q其下标??。例②定义了一个具有五个元素的字符型数l,其下标从5??span style="color: red;">例③~省了下界,它定义了一个具有八个元素的整型数组Q其下标??。例④则~省了下界和cdQ定义的是具有七个元素的变体型数l,其下标从0?。如果在该模块的“(声明)”部分d了Option
base 1Q则例③和例④的下标都是从l开始了?br />
在定义定长数l时Q其上界和下界必L常数或常量表辑ּ?br />
动态数l?br />
?
很多情况下,数组的长度事先是无法预测的,而且有时可能需要在E序?
改变数组的长度以适应新的情况Q因此出C动态数l。动态数l是在定义数l只指定数组名及其类型,{以后知道数l的长度或需要改变数l长度时再用
“ReDim”指定它的长度。现举例如下Q?br />
Dim X AS Integer
Dim a()As String
……
ReDim a(x)
……
X=X+3
ReDim a(x)
其中?#8220;…”代表其它代码。这D代码首先定
义了一个整型变量和—个字符型的动态数l,之后l过一pdq算后变量X得到一个定|再?#8220;ReDim”指定数组的长度,最后根据需要又再一ơ改变了
数组的长度?br />
虽然可以一ơ或多次改变动态数l的长度Q但当重新指定数l长度时Q数l内原有的数据降会被清除。如果既x变数l的长度Q又想保留数
l原有的数据Q则在?#8220;ReDim”旉要加?#8220;Preserve”关键字。例如:ReDim Preserve
a(x)。但要注意,如果~小数组长度Q那么数l中出新的下界C界之间的元素清除,即使用?#8220;Preserve'’关键字,也不会保留这些元素,
如果仍然讉Kq些元素会引v“下标界”的错?
当不需要再使用某个动态数l时Q我们可以?#8220;Erase”删除该数l,以释放该数组占用的内存空_例如QErase a()?br />
三、多l数l及数组元素的引?br />
一个数l可以是一l的Q也可以是多l。当需要表C^面中的一个点坐标Q?
需要用Cl数l?表示I间中的一个点Ӟ需要用Cl数l。多l数l的定义格式为:
Dim数组?[下界TO]上界[QTO
上界[下界 TO] [Q?#8230;])[AScd名]
多维数组的定义格式与—一l数l基本上是一致的Q只是多加几个上界和下界?br />
现在举例
如下Q?br />
Dim a(1 TO 3,1 TO 4) As Integer
Dim b(5, 9) As Siring
Dim
b(4, 3)
q三行语句分别定义了一个两l数l,W一个指定了下界及类?W二个只指定了类?nbsp;
使用默认的下?最后一个下界和cd都没有指定,其类型是变体型的?br />
Ҏl元素的引用Q是数组名加下标的Ş式。例如:
Dim
a(5)as Integer
Dim b(3,4)as Integer
a(1)=3
a(2)=5
a(3)=a(1)+a(2)
b(2,1)=a(2)
msgbox a(3)
msgbox b(2,1Q?br />
在此例中Q先Ҏla的前三个元素赋|再给数组b的一个元素赋|最后显
CZ个数l元素的倹{用数组元素Ӟ其下标不要超Z下界至上界的范围?br />
~写 ASP 面Ӟ开发h员实际上是创Z个格式化的文本流Q通过 ASP 提供?Response 对象写入 Web 客户端。创建此文本的Ҏ有多U,而您选择的方法将?Web 应用E序的性能和可~放性生很大媄响。很多次Q在我帮助客户优化其 Web 应用E序的性能Ӟ发现其中一个比较有效的Ҏ是更?HTML 的创徏方式。本文将介绍几种常用技术,q测试它们对一个简单的 ASP 面的性能所产生的媄响?br />
ASP 设计
许多 ASP 开发h员都遵@良好的Y件工E原则,可能地其代码模块化。这U设计通常使用一些包含文Ӟq些文g中包含对面的特定不q箋部分q行格式化生成的函数。这些函数的字符串输出(通常?HTML 表格代码Q可以通过各种l合创徏一个完整的面。某些开发h员对此方法进行了改进Q将q些 HTML 函数Ud Visual Basic COM lg中,希望充分利用已编译的代码提供的额外性能?br />
管q种设计Ҏ很不错,但创建组成这些不q箋 HTML 代码lg的字W串所使用的方法将?Web 站点的性能和可~放性生很大的影响Q无论实际的操作是在 ASP 包含文g中执行还是在 Visual Basic COM lg中执行?br />
字符串连?/strong>
L以下 WriteHTML 函数的代码片断。名?Data 的参数只是一个字W串数组Q其中包含一些要格式化ؓ表格l构的数据(例如Q从数据库返回的数据Q?br />
Function WriteHTML( Data )
Dim nRep
For nRep = 0 to 99
sHTML = sHTML & vbcrlf _
& "<TR><TD>" & (nRep + 1) & "</TD><TD>" _
& Data( 0, nRep ) & "</TD><TD>" _
& Data( 1, nRep ) & "</TD><TD>" _
& Data( 2, nRep ) & "</TD><TD>" _
& Data( 3, nRep ) & "</TD><TD>" _
& Data( 4, nRep ) & "</TD><TD>" _
& Data( 5, nRep ) & "</TD></TR>"
Next
WriteHTML = sHTML
End Function
q是很多 ASP ?Visual Basic 开发h员创?HTML 代码时常用的Ҏ。sHTML 变量中包含的文本q回到调用代码,然后使用 Response.Write 写入客户端。当Ӟq还可以表示为直接嵌入不包含 WriteHTML 函数的页面的cM代码。此代码的问题是QASP ?Visual Basic 使用的字W串数据cdQBSTR ?Basic 字符Ԍ实际上无法更攚w度。这意味着每当字符串长度更ҎQ内存中字符串的原始表示形式都将遭到破坏Q而且创Z个包含新字符串数据的新的表示形式Q这增加分配内存和解除分配内存的操作。当ӞASP ?Visual Basic 已ؓ您解决了q一问题Q因此实际开销不会立即昄出来。分配内存和解除分配内存要求基本q行时代码解除各个专用锁定,因此需要大量开销。当字符串变得很大ƈ且有大块内存要被快速连l地分配和解除分配时Q此问题变得ؓ明显Q就像在大型字符串连接期间出现的情况一栗尽这一问题对单用户环境的媄响不大,但在服务器环境(例如Q在 Web 服务器上q行?ASP 应用E序Q中Q它导致严重的性能和可~放性问题?br />
下面Q我们回CqC码片D:此代码中要执行多个字符串分配操作?{案?16 个。在q种情况下,“&”q算W的每次应用都将D变量 sHTML 所指的字符串被破坏和重新创建。前面已l提刎ͼ字符串分配的开销很大Qƈ且随着字符串的增大而增加,因此Q我们可以对上述代码q行改进?br />
快捷的解x?/strong>
有两U方法可以缓解字W串q接的媄响,W一U方法是试减小要处理的字符串的大小Q第二种Ҏ是尝试减执行字W串分配操作的数目。请参见下面所C的 WriteHTML 代码的修订版本?br />
Function WriteHTML( Data )
Dim nRep
For nRep = 0 to 99
sHTML = sHTML & ( vbcrlf _
& "<TR><TD>" & (nRep + 1) & "</TD><TD>" _
& Data( 0, nRep ) & "</TD><TD>" _
& Data( 1, nRep ) & "</TD><TD>" _
& Data( 2, nRep ) & "</TD><TD>" _
& Data( 3, nRep ) & "</TD><TD>" _
& Data( 4, nRep ) & "</TD><TD>" _
& Data( 5, nRep ) & "</TD></TR>" )
Next
WriteHTML = sHTML
End Function
乍一看,可能很难发现q段代码与上一个代码示例的差别。其实,此代码只是在 sHTML = sHTML & 后的内容外面加上了括受这实际上是通过更改优先序Q来减小大多数字W串q接操作中处理的字符串大。在最初的代码CZ中,ASP ~译器将查看{号双的表辑ּQƈ从左到右q行计算。结果,每次重复都要q行 16 个连接操作,q些操作针对不断增长?sHTML q行。在新版本中Q我们提C编译器更改操作序。现在,它将按从左到叟뀁从括号内到括号外的序计算表达式。此技术得每ơ重复包?15 个连接操作,q些操作针对的是不会增长的较字W串Q只有一个是针对不断增长的大?sHTML。图 1 昄了这U优化方法与标准q接Ҏ在内存用模式方面的比较?br />
在特定情况下Q用括号可以对性能和可~放性生十分显著的影响Q后文将Ҏq行q一步的说明?br />
StringBuilder
我们已经扑ֈ了解军_W串q接问题的快h法,在多数情况下Q此Ҏ可以辑ֈ性能和投入的最佛_^衡。但是,如果要进一步提高构建大型字W串的性能Q需要采用第二种ҎQ即减少字符串分配操作的数目。ؓ此,需要?StringBuilder。StringBuilder 是一个类Q用于维护可配置的字W串~冲区,理插入到此~冲区的新文本片断,q仅在文本长度超出字W串~冲区长度时对字W串q行重新分配。Microsoft .NET 框架免费提供了这样一个类 (System.Text.StringBuilder)Qƈ在该环境下进行的所有字W串q接操作中用它。在 ASP 和传l的 Visual Basic 环境中,我们无法讉K此类Q因此需要自行创建。下面是使用 Visual Basic 6.0 创徏?StringBuilder cȝ例(为简zv见,省略了错误处理代码)?br />
Option Explicit
' 默认的缓冲区初始大小和增长系?br />
Private Const DEF_INITIALSIZE As Long = 1000
Private Const DEF_GROWTH As Long = 1000
' ~冲区大和增长
Private m_nInitialSize As Long
Private m_nGrowth As Long
' ~冲区和~冲数器
Private m_sText As String
Private m_nSize As Long
Private m_nPos As Long
Private Sub Class_Initialize()
' 讄大小和增长的默认?br />
m_nInitialSize = DEF_INITIALSIZE
m_nGrowth = DEF_GROWTH
' 初始化缓冲区
InitBuffer
End Sub
' 讄初始大小和增长数?br />
Public Sub Init(ByVal InitialSize As Long, ByVal Growth As Long)
If InitialSize > 0 Then m_nInitialSize = InitialSize
If Growth > 0 Then m_nGrowth = Growth
End Sub
' 初始化缓冲区
Private Sub InitBuffer()
m_nSize = -1
m_nPos = 1
End Sub
' 增大~冲?br />
Private Sub Grow(Optional MinimimGrowth As Long)
' 初始化缓冲区Q如有必要)
If m_nSize = -1 Then
m_nSize = m_nInitialSize
m_sText = Space$(m_nInitialSize)
Else
' 只是增长
Dim nGrowth As Long
nGrowth = IIf(m_nGrowth > MinimimGrowth,
m_nGrowth, MinimimGrowth)
m_nSize = m_nSize + nGrowth
m_sText = m_sText & Space$(nGrowth)
End If
End Sub
' 缓冲区大小调整到当前用的大小
Private Sub Shrink()
If m_nSize > m_nPos Then
m_nSize = m_nPos - 1
m_sText = RTrim$(m_sText)
End If
End Sub
' d单个文本字符?br />
Private Sub AppendInternal(ByVal Text As String)
If (m_nPos + Len(Text)) > m_nSize Then Grow Len(Text)
Mid$(m_sText, m_nPos, Len(Text)) = Text
m_nPos = m_nPos + Len(Text)
End Sub
' d一些文本字W串
Public Sub Append(ParamArray Text())
Dim nArg As Long
For nArg = 0 To UBound(Text)
AppendInternal CStr(Text(nArg))
Next nArg
End Sub
' q回当前字符串数据ƈ调整~冲区大?br />
Public Function ToString() As String
If m_nPos > 0 Then
Shrink
ToString = m_sText
Else
ToString = ""
End If
End Function
' 清除~冲区ƈ重新初始?br />
Public Sub Clear()
InitBuffer
End Sub
此类中用的基本原则是,在类U别变?(m_sText) 用作字符串缓冲区Qƈ使用 Space$ 函数以空格字W填充此~冲Z其讄为特定的大小。如果要更多文本与现有文本q接在一P则在查缓冲区的大以存放新文本后,使用 Mid$ 函数在正位|插入文本。ToString 函数返回当前存储在~冲Z的文本,q将~冲区的大小调整够容Ux文本的正长度。?StringBuilder ?ASP 代码如下所C:
Function WriteHTML( Data )
Dim oSB
Dim nRep
Set oSB = Server.CreateObject( "StringBuilderVB.StringBuilder" )
' 用大和增长pL初始化缓冲区
oSB.Init 15000, 7500
For nRep = 0 to 99
oSB.Append "<TR><TD>", (nRep + 1), "</TD><TD>", _
Data( 0, nRep ), "</TD><TD>", _
Data( 1, nRep ), "</TD><TD>", _
Data( 2, nRep ), "</TD><TD>", _
Data( 3, nRep ), "</TD><TD>", _
Data( 4, nRep ), "</TD><TD>", _
Data( 5, nRep ), "</TD></TR>"
Next
WriteHTML = oSB.ToString()
Set oSB = Nothing
End Function
使用 StringBuilder 需要一定的开销Q因为每ơ用此cL都必d建它的实例,q且在创建第一个类实例时必d载包含此cȝ DLL。对 StringBuilder 实例q行额外Ҏ调用时也需要开销。用加括号?#8220;&”ҎӞStringBuilder 如何执行取决于多个因素,包括q接的数目、要构徏的字W串的大以及选择?StringBuilder 字符串缓冲区的初始化参数的性能。请注意Q在多数情况下,缓冲区中所需的空间量估计得略高一些要q远好于让其不断增长?br />
内置Ҏ
ASP 包含一U非常快L创徏 HTML 代码的方法,只需多次调用 Response.Write。Write 函数使用隐式优化的字W串~冲区,此缓冲区能够提供非常优秀的性能Ҏ。修改后?WriteHTML 代码如下所C:
Function WriteHTML( Data )
Dim nRep
For nRep = 0 to 99
Response.Write "<TR><TD>"
Response.Write (nRep + 1)
Response.Write "</TD><TD>"
Response.Write Data( 0, nRep )
Response.Write "</TD><TD>"
Response.Write Data( 1, nRep )
Response.Write "</TD><TD>"
Response.Write Data( 2, nRep )
Response.Write "</TD><TD>"
Response.Write Data( 3, nRep )
Response.Write "</TD><TD>"
Response.Write Data( 4, nRep )
Response.Write "</TD><TD>"
Response.Write Data( 5, nRep )
Response.Write "</TD></TR>"
Next
End Function
虽然q段代码很可能ؓ我们提供最佳的性能和可~放性,但在某种E度上已l破坏了装Q因为现在会函数内部的代码直接写入 Response ,所以调用代码׃一定程度的控制权。另外,Ud此代码(例如Q移?COM lgQ将变得更加困难Q因为此函数?Response 存在依赖关pR?br />
试
上面提到的四U方法分别通过一个简单的 ASP 面Q包含一个由虚拟字符串数l提供数据的单个表格Q进行了试。我们?Application Center Test? (ACT) 从单个客LQWindows? XP ProfessionalQPIII-850MHzQ?12MB RAMQ针?100Mb/sec |络中的单个服务器(Windows 2000 Advanced ServerQ双 PIII-1000MHzQ?56MB RAMQ执行了试。ACT 配置Z?5 个线E,以模?5 个用戯接至|站时的负蝲。每个测试都包括 20 U预热时间和随后?100 U负载时_在负载期间创Z可能多的请求?br />
通过更改主表格@环中的重复次敎ͼ针对不同数目的连接操作重复运行测试,?WriteHTML 函数中的代码片断所C。运行的每个试都用上文提到的四种不同的方法执行?br />
l果
下面的一pd图表昄了各U方法对整个应用E序吞吐量的影响Q以?ASP 面的响应时间。通过q些图表Q我们可以了解应用程序支持的h数目Q以及用L待页面下载至览器所需的时间?br />
?1Q用的q接Ҏ~写的说?br />
在模拟典?ASP 应用E序工作负荷斚wQ此试与实际情늛差甚q,从表 2 中可以明昄刎ͼ即重复 420 ơ,此页面仍不是特别大。现在很多复杂的 ASP 面在这些数字上都是比较高的Q设|有可能出此测试范围的限制?br />
?2Q测试示例的面大小和连接数?br />
从图 2 的图表中可以看到Q正如我们所预期的,多重 Response.Write Ҏ (RESP) 在测试的整个重复试范围中ؓ我们提供了最佳的吞吐量。但令h惊讶的是Q标准字W串q接Ҏ (CAT) 的下降如此巨大,而加括号的方?(PCAT) 在重复执?300 多次时性能依旧要好很多。在大约重复 220 ơ之处,字符串缓存带来的性能提高过?StringBuilder Ҏ (BLDR) 固有的开销Q在q一点以上,在此 ASP 面中?StringBuilder 所需的额外开销是值得的?br />
?3 和图 4 中的图表昄了按“到第一字节的时?#8221;量的响应时_以毫Uؓ单位Q。因为标准字W串q接Ҏ (CAT) 的响应时间增加过快,所以又提供了未包括此方法的图表Q图 4Q,以便分析其他Ҏ之间的差异。有一点值得注意Q多?Response.Write Ҏ (RESP) ?StringBuilder Ҏ (BLDR) 随重复次数的增加呈现一U近似线性的增长Q而标准连接方?(CAT) 和加括号的方?(PCAT) 则在过一定的阈g后开始迅速增加?br />
结
本文着重讲qC如何?ASP 环境中应用不同的字符串构建技术,q些内容同样适用于所有?Visual Basic 代码创徏大型字符串的ҎQ例如手动创?XML 文档。以下原则可以帮助您定哪种Ҏ最适合您的需要?br />
首先试加括L“&”ҎQ尤其是在处理现有代码时。这U方法对代码l构的媄响微乎其微,但您会发现应用程序的性能显著增强,甚至会超出预定目标?br />
在不破坏所需的封装别的情况下?Response.Write。用此ҎQ可以避免不必要的内存内字符串处理,从而提供最佳的性能?br />
使用 StringBuilder 构徏真正大型或连接数目较多的字符丌Ӏ?br />
管您可能未看到本文所C的q种性能增长Q但我已在真实的 ASP Web 应用E序中用了q些技巧,只需要很的额外投入可以在性能和可~放性方面获得很大的提高?/span>
权限被拒l: <filepath>'
其中 <filepath> 是\径以在活动服务器面 (ASP) DLL?/font>
如果您试N命名 DLL ?Windows 资源理器中的,您可能会看到一条错误消息类g以下内容Q?
不能重命?<filename>Q请执行下列操作Q?讉K被拒l?
L保磁盘未满或写保?br />
而且文g当前未在使用中?
其中 <filename> ?DLL 的文件名?/font>
如果试图删除?DLL ?Windows 资源理器中的,您可能会看到一条错误消息类g以下内容Q?
不能删除 <filename>: 讉K被拒l?
L保磁盘未满或写保?br />
而且文g当前未在使用中?
原因
?ASP 实例化自定义 ActiveX DLL 使用 Server.CreateObject("ActiveX.Class")DLL 获取实例化,在本例中?..?ASP 实例化自定义 ActiveX DLL 使用
Server.CreateObject("ActiveX.Class")
DLL 获取实例化,在本例中?PWS ?Web 服务q程中?一旦被实例?DLL PWS 不会释放?DLL?
解决Ҏ
停止q?PWS 启动?SysTray 图标不能释放?ActiveX DLL 是实例化一个活动服务器面 (ASP) 的锁?若要解除锁定 DLL 上的Q?..停止q?PWS 启动?SysTray 图标不能释放?ActiveX DLL 是实例化一个活动服务器面 (ASP) 的锁?nbsp;
若要解除锁定 DLL 上的QPWS 必须手动停止使用命o提示?默认状态下QPws.exe ȝ在文件夹 C:\Windows\System\Inetsrv?若要停止 PWSQ键入以下命令:
windows\system\inetsrv\pws.exe /stop
然后Q您可以重新启动 PWS 手动重新从命令提C符Q启动时通过使用以下命oQ?
windows\system\inetsrv\pws.exe /start
一旦停?PWSQ这释?ActiveX DLL?如有必要Q请重新~译 DLL?一?PWS 的重新启动它再?DLL 旉定它获取 ASP 通过实例化?/font>
另一个解x?br />
在运行行键入: net stop iisadmin/yQ然后按 Enter。这在 DLL 中运行生成时停止所有服务?
生成 DLL 完成后键? net start w3svc 从运行的行。您的服务将再次为最多?
首先,服务器端的组件要有别于客L的组?客户端的lg是通过|络传输,依靠HTML来v作用.而且只能在IE上有?但是服务器端的组件是q行在服务器?它在服务器上执行各种操作.因此,所有的览器都能n?它依靠的是服务器而不是浏览器.
当IIS被请求执行一个ASPE序,它首先会在ASP文g中找到? %>标签之间的代?q且执行?也可以是〈script runat=server>?script>之间的代?.如果q个ASPE序在先前被调用q?那么它就会用内存中的~译q的E序来向用户q回HTML代码,如果没有,那么它就重新~译.q里ASP比CGI多一炚w度优势,因ؓCGI是每一个请求都使用一个线E?q样大大消耗了服务器的资源.
想不想你写的E序自己p在IISq行!?!现在你就行了!使用VB5(当然现在是VB6?,你就能徏立Dynamic Linked Libraries (DLL文g),它能在IIS上直接运?如果有asp文g来请求的?.
pȝ和Y件的要求
你需要一?2位的操作pȝ来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.
我们开始吧
启动你的VB,选择ActiveX图标.q个图标可以在新建工E找?VB会提供一个默认的工程?project1)和类?class1).我们会将q两个名字都Ҏ.在改名之?请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有?从菜单中选择"工程",然后在其中选择"引用",׃出现"引用"H口从中选择Microsoft Active Server Pages Object Library.
l工E和cd?
现在我们来根据自q爱好来ؓproject1和class1来命名吧!l它们命名也是很重要?我们以后会用q个工程名和cd来创个组件的实例!后面详细介绍.
如何改名,我就不想多说?我们的工E名改ؓExmaple,cd为Helloword
怎样使用工程和类
现在我们有了我们自己的工E?Example1)和类?HelloWorld).以后我们׃在ASP代码中用它们的名字来引用这个组?在ASP中我们就q样引用,如下:
Set ObjReference = Server.CreateObject("ProjectName.ClassName")
对于我们工程的引用就?Set ObjReference = Server.CreateObject("Example1.HelloWorld")
现在我们p用ObjReference来调用我们在lg中所创徏的函?子程?下面我们会来写一个SayHello的子E序,我们执行它的代码如下:
?
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
Z在HellowordcM使用ASP的方?你必d此类中写一个OnStartPage子函?如下:
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
End Sub
现在,无论什么时候用戯问一个带有本lg的ASP文g,IIS׃把ScriptingContext传送给我们的对象请我们使用.q个ScriptingContext包括了全部的ASPҎ和属?实现?q得我们有能力讉K所有ASP的对?看下面的代码:
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub
以后我们p用在VB中用MyApplication来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在OnStartPage之前来申明这些变?
Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session
使用ASP的对象我们的变量现在p像标准的ASP对象来用了!比如,我们l常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功?代码如下:
用ASP中实?
?
MyTempVariable = Request.Form("userName")
Response.Write ("you entered "& MyTempVariable & "as your user name")
%>
在VB中实?
MyTempVariable = MyRequest.Form("userName")
MyResponse.Write ("you entered "& MyTempVariable & "as your user name")
通过使用MyResponse来代替Response,我们能够使用所有Response的方?当然,MyResponseq个名字可以随便来取,你甚臛_以就取Response.另一件我们得注意的是,我们得在我们的徏立的cM,写上OnEndPage子函?q个OnStartPage是相反的!OnStartPage是创建对?OnEndPage是消毁对?
Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub
SayHelloҎ我们来徏立一个子函数,用于昄"Holle World".q个SayHelloҎ只是HelloWorldq个cM一个子函数,我们以后会在ASP中用以下的显C个方?
?
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
SayHello的程?很简单的!
Public Sub SayHello()
MyResponse.Write ("Hello World")
End Sub
现在一个小型的lg~写完成,剩下的工作就是编译这个组??工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp?然后q在菜单中选择"make exmaple1.dll",其~译成DLL文g.一个组件就真正完成?
注意,~译了此lg那么你就得先把你的PWSx,然后再编译此lg.否则VB׃告诉你些lg在用中.
在ASP中用我们的自己的组?
当你更正了在~译中的错误,成功地编译了example1q个工程,现在你就得拿Z最喜欢的HTML~辑器来写下下面的语?保存为ASP文g.
〈HTML>〈HEAD>〈TITLE>Example 1?TITLE>?HEAD>
〈BODY>
?
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
?BODY>?HTML>
q行后即可看到结?
Hello World
注册lg
如果你想和你的朋?d分n你的lg,那么你就得在你的pȝ上注册你的组?我们一般用Regsvr32.exe来注册组?注册后你的组件会出现在Win95/Win98的windows/system目录?下面是一个注册的例子:
Regsvr32.exe C:/wwwroot/Example1/Example1.dll
在你的系l中,VB会自动给你注?所以你很少用到Regsvr32.exe
我们q里只是写了一个非常小的组?你们可以写好自己的更大的lg,而且q可以用VB中的很多控g.
让我们用lg来扩展我们的E序的功能吧!也希望多多的看到我们中国人的lg.
二、XMLHTTPҎQ?br />
OpenQ?bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword Q?br />
bstrMethodQ?nbsp; 数据传送方式,即GET或POST?br />
bstrUrlQ?nbsp; 服务|页的URL?br />
varAsyncQ?nbsp;
是否同步执行。缺省ؓTrueQ即同步执行Q但只能在DOM中实施同步执行。用中一般将其置为FalseQ即异步执行?br />
bstrUserQ?nbsp; 用户名,可省略?br />
bstrPasswordQ用户口令,可省略?/p>
SendQ?varBody Q?br /> varBodyQ指令集。可以是XML格式数据Q也可以是字W串Q流Q或者一个无W号整数数组。也可以省略Q让指o通过OpenҎ的URL参数代入?/p>
setRequestHeaderQ?bstrHeader, bstrvalue Q?br />
bstrHeaderQHTTP ?header)
bstrvalueQ?HTTP ?header)的?br />
如果OpenҎ定义为POSTQ可以定义表单方式上传:
xmlhttp.setRequestHeaderQ?"Content-Type",
"application/x-www-form-urlencoded"Q?/p>
三、XMLHTTP属性:
onreadystatechangeQ在同步执行方式下获得返回结果的事g句柄。只能在DOM中调用?br />
responseBodyQ?nbsp; l果q回为无W号整数数组?br />
responseStreamQ?nbsp; l果q回为IStream?br />
responseText Q?nbsp; l果q回为字W串?br />
responseXMLQ?nbsp; l果q回为XML格式数据?br />
具体的用方?br />
创徏XMLHTTP对象的语句如下:
Set objXML = CreateObject("Msxml2.XMLHTTP") ?br />
Set objXML = CreateObject("Microsoft.XMLHTTP")
'Or for version 3.0 of XMLHTTP, use:
'Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")
对象创徏后调用OpenҎ对Request对象q行初始化,语法格式为:
objXML.open http-method,url,async,userID,password
OpenҎ中包含了5个参敎ͼ前三个是必要的,后两个是可选的(在服务器需要进行n份验证时提供)。参数的含义如下所C:
http-methodQHTTP的通信方式Q比如GET或是POST
urlQ接收XML数据的服务器的URL地址。通常在URL中要指明ASP或CGIE序
asyncQ一个布标识,说明h是否为异步的。如果是异步通信方式(true)Q客h׃{待服务器的响应Q如果是同步方式(false)Q客hp{到服务器返回消息后才去执行其他操作
userIDQ用户IDQ用于服务器w䆾验证
passwordQ用户密码,用于服务器n份验?/p>
XMLHTTP对象的SendҎ
用OpenҎ对Request对象q行初始化后Q调用SendҎ发送XML数据Q?/p>
objXML.send()
SendҎ的参数类型是VariantQ可以是字符丌ӀDOM树或L数据?/p>
发送数据的方式分ؓ同步和异步两U。在异步方式下,数据包一旦发送完毕,q束Sendq程Q客h执行其他的操作;而在同步方式下,客户{到服务器返回确认消息后才结束Sendq程?/p>
XMLHTTP对象中的readyState属?/p>
其能够反映出服务器在处理h时的q展状况。客h的程序可以根据这个状态信息设|相应的事g处理Ҏ。属性值及其含义如下表所C:
倹{ 说明
0 Response对象已经创徏Q但XML文档上蝲q程未l束
1 XML文档已经装蝲完毕
2 XML文档已经装蝲完毕Q正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕Q客L可以接受q回消息
客户机处理响应信息,客户机接收到q回消息后,q行单的处理Q基本上完成了C/S之间的一个交互周期?/p>
客户机接收响应是通过XMLHTTP对象的属性实现的Q?/p>
responseTextQ将q回消息作ؓ文本字符Ԍ
responseBodyQ将q回消息作ؓHTML文档内容Q?br />
responseXMLQ将q回消息视ؓXML文档Q在服务器响应消息中含有XML数据时用;
responseStreamQ将q回消息视ؓStream对象
以下是一个简单的例子Q类似新d?/p>
<%
Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")
objXML.open "GET","http://www.alexa.com",false
objXML.send()
response.write(objXML.responseText)
%>
整个步骤很明显:建立、打开、发送和接受?br />
如下面的代码Q?/p>
以下是引用片D: <% If isempty(Session("node")) Then Set Session("node")=New ListNode Set n=Session("node") Response.Write n.Content %> |
If isempty(Session("node")) Then Set Session("node")=New ListNode
Set n=Session("node")
Response.Write n.Content
%>
q是上面的ListNodeq个c,q段代码意图在一个用户会话中只保留一个ListNode的对 象。所以在用户W一ơ访问该|页Ӟ会生成ListNode的一个对象,q保存在Session("node")?后面讉K该网|Q因? Session("node")不ؓIZQ所以不会生成一个新的对象,而是?Session("node")中取Z存的对象?/p>
理论上应该也会输?00Q但是问题来了,ASP一直会报错Q?/p>
Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'n.Content'
用n.Type也会出错。同L代码译成PHPQ运行却是可以通过的。ؓ什?
个h分析下来Q认为Session可以保存对象是没错,只是VBScript中类型{换的机制? 弱,而且没有昑ּ的强制类型{换供用户使用Q无法将 Session("node")正确转换为ListNodecd。因为是自定义的c,我们只能在每个页面中都出现类的定义语句,q样在ASP看来Q每ơ读 取这个页面时QListNodec都是一个新c,所以就不认得Session中的q个cȝ对象了?/p>
l论Q?/strong>量不要惛_用Session或Application来存储ASP中自定义cȝ对象。如?
实需要,可以考虑用COM来编写类Q然后在VBScript中用QSet Session("obj") =
Server.CreateObject("YourApp.YourClass")来创Z个对象,然后卛_实现上面预想的功能了?/p>