维护 ASP 应用程序的安全 [2]
脚本本身不能决定事务是成功还是失败。但是,可以编写提交或终止事务时被调用的事件。例如,假设有一个确认银行帐户的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用 OnTransactionCommit和 OnTransactionAbort事件来编写对用户的不同响应。
<%@ TRANSACTION = Required %>
<%
'Buffer output so that different pages can be displayed.
Response.Buffer = True
%>
<HTML>
<BODY>
<H1>Welcome to the online banking service</H1>
<%
Set BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Thank you. Your transaction is being processed.</P>
</BODY>
</HTML>
<%
' Display this page if the transaction succeeds.
Sub OnTransactionCommit()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "Thank you. Your account has been credited."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
end sub
%>
<%
' Display this page if the transaction fails.
Sub OnTransactionAbort()
Response.Clear()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "We are unable to complete your transaction."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
End sub
%>
在 MTS资源管理器中登记一个组件
为了参与一个事务,组件必须在 MTS包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction Server保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad Rotator组件。
注册和配置事务性组件可使用 MTS资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在 MTS包中注册。不要将组件放在 IIS内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个 ASP应用程序使用并以 ASP应用程序进程运行。使用 MTS资源管理器可创建新的包并将包的 Activation属性设置为 Library。
也可以在 Server包中注册事务性组件。Server包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用 Server包。
要使用 MTS资源管理器,必须安装 Microsoft Transaction Server。有关注册组件和选择包类型的详细信息,请参阅创建 MTS包。
对象作用域
一般情况下,不要将从 MTS组件中创建的对象存储在 ASP Application或 Session对象中。 MTS对象在事务完成后消失。因为 Session对象和 Application对象是为在不同 ASP页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。
ASP脚本是已声名的事务的根,即起始点。任何事务性 ASP页所使用的 MTS对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS对象将消失,其中包括存储在 Session或 Application对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。
事务排队
从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。
对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。
Microsoft Message Queue Server使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message Queue Server保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。
有关在 ASP应用程序中使用消息队列的示例,请参阅开发人员范例。要查看这些示例,必须安装 SDK文档。
有关 Microsoft Message Queue Server的详细信息,请参阅 Microsoft Message Queue Server。
模块 1:创建 ASP页
请选择本课的脚本语言
在本模块中,通过创建自己的 ASP页(.asp文件),您将学习一些 ASP的基本知识。在这些课程中用到的示例文件,可以在 localhost Web服务器的 Tutorial目录 (C:\WINNT\Help\iis\htm\tutorial)中找到。请将您创建的文件也保存到 Tutorial目录中。
要点要保存并查看您在本模块中的工作结果,必须在 localhost Web服务器上对 /iishelp/iis/htm/tutorial虚拟目录具有“写 (Write)”和“改编 Web服务器 (Script Web server)”权限,当然必须已经安装了 Active Server Pages。详细信息,请参阅设置 Web服务器权限。
- 暂时没有评论!
