帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP编程
remote script文档
作者:佚名 发布时间:2005-04-02 来源:不详
 

文档: 远程执行服务器脚本

复杂的 Web 应用程序既调用客户脚本又调用服务器脚本。客户脚本经常用于对应用程序的用户接口进行编程──例如,为了动态改变 Web 页文本,对用户动作,比如双击作出反应,并执行诸如验证这样的面向客户的任务。客户脚本在浏览器中局部执行,这样就向用户提供了一种生动的、反应迅速的接口。

对比来说,服务器脚本是用来对某个应用程序的末段编程的。这经常引起对某个数据库的存取动作,或者执行中间层业务逻辑。服务器脚本也用于创建较大范围的应用程序:也就是可能通过多种不同类型的浏览器(每个都有不同存取能力)进行存取的应用程序。

但是客户和服务器脚本是互斥的。当某个页首次请求时,服务器可能运行服务器脚本,并将页传递给浏览器,然后浏览器就可以运行客户脚本。不过,如果该页上的服务器脚本有必要再次运行的话,那么必须将该页提交回服务器,服务器可以有效地重新运行该页。对页面上控件状态和脚本中值的维护可能涉及到在浏览器和服务器之间来回传递信息的一个复杂的 scripting 过程。另外,客户和服务器之间的折返过程涉及到显示某个应用程序的重载过程。

一种折衷方案是 remote scripting。Remote scripting 使得用户可以在客户脚本中工作,但要调用某个 ASP 页中的方法(函数或者例程)。实际上,用户可以象调用本地例程那样调用服务器脚本,不过它们仍然运行在服务器上,并具有对服务器能力的所有存取权限。由于用户从不把当前页留作调用服务器脚本之用,因此页的状态仍然保持。

用户可以在下列任务中使用 remote scripting:

当用户继续和某个数据输入表单交互作用时,服务器上的数据检查和数据验证。

更新来自服务器的页面中的信息而无须刷新屏幕。
Remote Scripting 如何工作

Remote scripting 是作为一个函数库来实现的,当用户希望运行某个服务器方法时,用户从客户脚本中调用这些函数。当用户调用某种服务器方法时,请求即被传递到浏览器中异步运行的一个代理过程中(在实现过程中,代理是作为一个 Java applet 来实现的。)该代理过程发送一个请求到包含用户调用方法的 ASP 页的服务器中。

服务器加载 ASP 页,而且该 ASP 页上的一个特殊例程将用户的请求调度到正确函数。如果方法有返回值,那么该值即被发送回代理过程,该过程将之包装为一个对象 ──一个调用对象 ──它包含了返回值以及其他有用信息的属性。

当用户在客户脚本中对服务器方法进行调用时,可以在两种方式中选择其一来完成:

同步 用户脚本调用远程过程,并等待其返回。如果用户在处理之前需要远程过程结果的话,那么就有必要这么做。

异步 用户脚本对某个远程脚本进行调用,然后继续处理。该页保持有效状态,以便于用户处理。如果某个调用要持续较长一段时间,那么就有必要使用异步调用。
Remote Scripting 的部件
为了实现 remote scripting,除了用户自己的客户 (.htm) 文件和服务器 (.asp) 文件外,还需要下面的文件:

Rs.htm 包含了用户在自己的 .htm 文件中初始化 remote scripting、执行远程过程、检查远程调用状态,以及获得方法结果时所要使用的方法。

Rs.asp 包含了用户在 .asp 文件中初始化服务器端的 remote scripting,以及在自己的页中调度到适当函数时所要调用的方法。

Rsproxy.class 包含客户和服务器页之间通信时 applet 的 Java 类文件(对象代码)。
这些文件充当用户可以在自己的文件中使用的文件库。一般说来,用户只需要简单地将相关文件(Rs.htm 或者 Rs.asp)包括进自己的客户或者服务器页中,然后遵照所需调用方法进行处理。有关详细信息,请参阅 在客户页中使得 Remote Scripting 有效 以及 在服务器页中使得 Remote Scripting 有效。

在用户的客户页中,用户引用 Rs.htm,这使得该文件中的方法对于用户服务器脚本来说是有效的。对 Rsproxy applet 的调用就在这些方法中。当用户创建服务器页的时候,用户将服务器端的一个 INCLUDE 语句 ─ 该语句引用 Rs.asp 文件 ─ 包括进去。伴随客户文件中的 Rs.htm,这样做使得所需要的方法在服务器页上成为有效的。

所有文件都必须在服务器上是有效的。用户可以将它们放置到任何合适的地方。不过,对于用户的客户和服务器文件来说,当它们从服务器发出请求时,路径都必须是有效的。缺省的情况是,remote scripting 过程假设这些文件在用户服务器或者工程的虚拟根目录外的一个名为 _ScriptLibrary 的文件夹中是有效的。如果用户不将它们放到那里,那么要特别注意它们的路径,因为在创建客户和服务器页时,用户需要指定之。

Remote Scripting 和安全性
Remote scripting 提供和 Java applet 或 IFrames 同样级别的安全性。为了确保 remote scripting 不违反服务器安全性,用户不能将结构化数据(包括对象)作为参数传递给某个服务器文本来执行。另外,用户进行 remote scripting 调用的服务器必须和用户请求包含该请求的客户页的服务器是同一个。

文档: 使 Remote Scripting 在客户页中有效

在您能使用 remote scripting 来调用服务器脚本之前,必须将 remote scripting 能力添加到用户的客户页中。使用来自于客户脚本的 remote scripting 所需的例程包含在 Rs.htm 文件中。用户必须将该文件包含到自己的客户页中。另外,用户必须调用一个方法来启动 remote scripting applet。

为了使得 remote scripting 有效

创建一个空的 JavaScript 脚本块──它引用 Rs.htm 文件,如下例所示:
<SCRIPT LANGUAGE="JavaScript" src="../_ScriptLibrary/RS.HTM">

要确保所指定 Rs.htm 文件的路径是正确的。该脚本块可以出现在用户客户页的任何地方,但必须在一个这样的块中──它在用户调用某个远程过程之前执行。

创建第二个 JavaScript 脚本块,并在这个块中调用方法 RSEnableRemoteScripting。缺省的情况是,该方法假定 Rsproxy.class applet 在一个叫做 _ScriptLibrary 的文件夹中,而且刚好在用户服务器或者工程的虚拟根目录的下级目录。如果不是这样的话,那么您必须将路径传递到方法调用中的 Rsproxy.class 文件中。
这个包含 RSEnableRemoteScripting 的脚本块必须出现在文档的主体部分,因为它创建包含对 Rsproxy.class 引用的 <APPLET> 标记。必须将之放在包括 Rs.htm 文件的脚本块之后。您也可以将之放到 <BODY> 标记的后面,如下例所示:

<BODY>
<SCRIPT LANGUAGE="JavaScript">
RSEnableRemoteScripting("../_ScriptLibrary")
</script>

<!-- 这里是 .htm 文件的其余部分 -->

注意 RSEnableRemoteScripting 所创建的 <APPLET> 标记并不出现在您的页面中──即使您在自己的浏览器中查看该页的源程序。

带有有效 remote scripting 的梗概客户页是这样的:

<HTML>
<标头>
<标题>Remote Scripting 测试</标题>
</标头>

<主体>
<SCRIPT LANGUAGE="JavaScript" src="../_ScriptLibrary/RS.HTM"></脚本>
<SCRIPT LANGUAGE="JavaScript">
RSEnableRemoteScripting("../_ScriptLibrary")
</脚本>
<H1>Remote Scripting 客户页</H1>
这是 remote scripting 示例客户页中的文本。
</主体>
</HTML>

以此方式设置了客户页之后,用户就可以在服务器页上添加调用远程过程的脚本了。有关如何进行的详细信息,请参阅 同步调用 Remote Scripting 方法以及 异步调用 Remote Scripting 方法。关于如何设置服务器页以便于接收 remote scripting 调用的详细信息,请参阅在服务器页中使得 Remote Scripting 有效。

文档: 使 Remote Scripting 在服务器页中有效

除了对客户页进行配置以便于调用远程脚本外,您还必须对自己的服务器页进行配置,以便于对它们进行接收。其做法包括下面这些步骤:

包含 remote scripting 服务器库,并对其进行初始化。

编写客户页能调用的函数或者例程。

将自己的函数和例程显露为方法。
缺省的情况是,客户脚本所调用的某个 ASP 页并不显示在浏览器中──而是简单地在服务器上执行并将结果送到客户端。因此,作为规则,您无需在 ASP 页中包括进任何 HTML 文本,而只需脚本。不过,还是有可能在某个 ASP 页上调用包括 HTML 文本的方法并作正常显示的,只要您初始化了 remote scripting 服务器库,并用下面描述的技巧显露页的方法。

包括并初始化 remote scripting 服务器库

创建服务器端引用 Rs.asp 文件的 INCLUDE 语句,如下例所示:
<!--#INCLUDE FILE="../_ScriptLibrary/RS.ASP"-->

确保为 Rs.asp 文件指定正确路径。INCLUDE 语句可以出现在用户文件的任何位置。

将一个调用插入到RSDispatch方法中,当您从客户脚本调用服务器脚本时,可用该方法找到正确过程。该调用可能看起来如下所示:
<% RSDispatch %>

RSDispatch 调用必须是运行在该页上的第一个服务器脚本。按惯例,典型做法是将其放到文件头部。

在合适的初始化动作中,创建用户将从客户脚本中作为方法调用的函数或者例程。您可以用任何脚本语言书写过程。过程可以接受任意数目的参数,但参数只可以为字符串、数字、日期,或者其他简单数据类型──客户不能将结构化数据(例如,对象或者数组)作为参数。

注意 当您将参数从客户脚本传递到服务器脚本时,它们即被转换为字符串。如果用户期望自己的服务器方法中有不同数据类型,可以在方法脚本内部转换之。

在服务器脚本中创建了过程后,您必须将它们作为方法显露出来。为了达到该目的,您可以创建一个 JavaScript 公共描述对象,并列出用户希望显露的方法。

显露方法

创建一个 public_description 对象,该对象为您的方法指定构造函数。下面的示例命名构造函数为 MyServerMethods:
<SCRIPT LANGUAGE="JavaScript">
var public_description = new MyServerMethods();

创建您在 public_description 对象中指定的构造函数。在构造函数内部,指定用户希望显露的方法名,以及它们相应的函数或者例程名。用户所使用的语法取决于用户是在 JavaScript 中还是在 VBScript 中创建自己的方法。可使用下面的语法:
functionconstructor(){
this.methodName = functionName //对于 JavaScript 方法来说
// 对于用 VBScript 书写的方法,使用下面的语法
this.methodName = Function('p1','p2','return functionName(p1,p2)')
}

注意 JavaScript 是大小写敏感的,因此用户必须根据约定正确大写。

其中:

methodName 将被显露的方法名。

functionName 服务器页中实现 methodName 的函数名。

p1, p2 传递给方法的参数列表──如果有参数的话。仅当该方法在 VBScript 中实现时,才能以这种方式显式地声明参数。参数名在构造函数内必须是一致的,但不需要和用户在方法本身中所使用的参数名匹配。用户不需要显式地声明传递给 JavaScript 中所实现方法的参数。
下面的示例显示了一个完整的 ASP 页,该页显露两个方法,square 和 add,这可以从客户脚本中调用。square 方法是在 JavaScript 中实现的,而 add 方法则是在 VBScript 中实现的。

<% RSDispatch %>
<!--#INCLUDE FILE="../_ScriptLibrary/RS.ASP"-->

<SCRIPT RUNAT=SERVER LANGUAGE="JavaScript">
var public_description = new MyServerMethods();
function MyServerMethods()
{
this.square = squareNumber;
this.add = Function( 'n1','n2','return addNumbers(n1,n2)' );
}

function squareNumber(numberToSquare){
return numberToSquare * numberToSquare;
}
</SCRIPT>

<SCRIPT RUNAT=SERVER LANGUAGE="VBScript">
Function addNumbers(num1, num2)
' 数据类型发生转换,因为它们作为字符串进行传递
addNumbers = CInt(num1) + CInt(num2)
End Function
</SCRIPT>

文档: 引用 ASP 页作为对象

为了使得用 remote scripting 调用 ASP 页上的方法更方便一些,您可以在客户脚本中创建一个包含服务器方法页的对象引用。这使得用户可以使用标准 object.method( ) 语法去调用用户已在自己的服务器页上显露的方法。

将某个 ASP 页作为对象加以引用

在客户脚本中,调用 RSGetASPObject 方法,将您希望作为对象加以引用的 URL 和 ASP 页的名字传递给它。RSGetASPObject 方法返回一个对象引用。用下面的语法:
ASPobj = RSGetASPObject(url)

其中:

ASPobj 该对象是用 RSGetASPObject 方法创建的。用户可以在以后对 ASPName.asp 中指定页的引用中使用该对象。

url 您希望调用其方法的服务器页的 URL。
例如,假设用户在服务器上有个叫 RSMath.asp 的页。那么用户可以用一条语句创建一个引用它的对象,例如用下面的 JavaScript 来创建这条语句:

rsMath = RSGetASPObject("../myPages/RSMath.asp")

或者用下面的 VBScript 来创建:

set rsMath = RSGetASPObject("../myPages/RSMath.asp")

如果该页包含一个叫 Add 的方法,那么您可以调用使用了诸如下面的 JavaScript 语法的方法,:

co = rsMath.Add(number1, number2)

或者用下面的 VBScript 语法:

set co = rsMath.Add(number1, number2)

关于如何调用 remote scripting 方法的详细信息,请参阅同步调用 Remote Scripting 方法以及异步调用 Remote Scripting 方法。

文档: 调用 Remote Scripting 方法同步

在对某个客户页和某个服务器页上的 remote scripting 进行配置后,您就可以从自己的客户脚本调用该服务器页的方法了。缺省的情况是,当用户调用某个服务器方法时,它被同步执行──您的客户脚本直到服务器方法执行完毕并返回结果后才能停止运行。一般说来,当您在自己的客户脚本中需要服务器方法结果时,则需同步调用服务器方法。

注意 您也可以异步调用服务器方法。有关详细信息,请参阅异步调用 Remote Scripting 方法。

当您调用某个服务器方法时,该方法并不返回单个值。而是创建一个 call object ,它是一个包含了被调用过程的返回和状态信息的对象。最常用的属性是调用对象的 return_value 属性,它包含了远程过程计算或者检查出来的单个值。其他调用对象属性使得用户可以得到更多关于远程过程调用的状态信息。

如果您已经创建了对某个服务器页的对象引用,那么可以用标准 object.method 语法来调用方法。有关创建对象引用的详细信息,请参阅作为对象引用 ASP 页。另外,您也可以在没有任何对象引用时调用 remote scripting 方法。这样做比起使用 object.method 语法来要略微冗余些,但不需要用户首先创建对象引用。

同步调用服务器方法

如果用户创建了对服务器页的对象引用,那么对于使用 JavaScript 的调用,可用第一个语法示例,而对于使用 VBScript 的调用,可用第二种语法示例:
JavaScript:
callObject = ASPObject.methodName(p1, p2[,...])

VBScript:
set callObject = ASPObject.methodName(p1, p2[,...])

- 或者 -

如果用户没有创建对象引用,调用 RSExecute 函数。对于使用 JavaScript 的调用,使用第一个语法示例,而对于使用 VBScript 的调用,使用第二种语法示例:
JavaScript:
callobject = RSExecute(url, methodName, p1, p2[,...])

VBScript:
set callobject = RSExecute(url, methodName, p1, p2[,...])

其中:

callObject 在 remote scripting 调用完成后,将被实例化的调用对象名。您无需在调用 remote script 之前创建该对象;远程脚本调用为您创建之。

ASPObject 您在早期使用 RSGetASPObject 方法可选择地创建的对象引用。有关详细信息,请参阅作为对象引用 ASP 页。

url 包含您想要执行的远程脚本的 ASP 页的 URL。必须已将服务器页配置为使得服务器页中的 Remote Scripting 有效中所描述的那样。服务器页必须在用户从中请求当前客户页的服务器上。

methodName 您想要执行的服务器页上的方法名。

p1, p2, ... methodName中的方法所需要的任何参数。 参数是通过值来传递的。用户可以传递简单的数据类型,比如数值或者文本值,但不能传递结构化数据,比如数组或者对象。
注意 当把参数从客户传递给服务器时,它们被转换为字符串。要确保您的服务器方法在使用参数时,将之转换为合适的数据类型。有关详细问题,请参阅使得服务器页中的 Remote Scripting 有效。

例如,下面按钮 btnAdd 的客户脚本 onclick 处理程序调用服务器方法 add 来累加两个数值。调用 remote scripting 方法会创建一个名为 co 的调用对象。remote scripting 调用的结果从调用对象的 return_value 属性中提取出来,并作为名为 txt3 的文本框值显示出来。

<SCRIPT LANGUAGE="JavaScript" for="btnAdd" event="onclick">
rsMath = RSGetASPObject("../myPages/RSMath.asp")
number1 = txt1.value;
number2 = txt2.value;
co = rsMath.Add(number1,number2);
txt3.value = "The sum is " + co.return_value;
</SCRIPT>

在无对象引用情况下所产生的同样调用(用 RSExecute )可能如下所示:

<SCRIPT LANGUAGE="JavaScript" for="btnAdd" event="onclick">
number1 = txt1.value;
number2 = txt2.value;
co = RSExecute("RSmath.asp","add",number1,number2);
txt3.value = "The sum is " + co.return_value;
</SCRIPT>

有关在产生 remote scripting 调用时,如何检查错误的详细信息,请参阅检查错误。

文档: 调用 Remote Scripting 方法异步

Remote scripting 向您提供了异步调用服务器方法的选择 ──当执行服务器方法时,用户的客户脚本继续运行。异步调用 remote scripting 方法使得您可以避免应用程序用户接口速度的减慢,因为您可以在执行服务器脚本的同时继续工作。

注意 如果您的应用程序需要,那么也可以同步调用服务器方法。有关详细信息,请参阅同步调用 Remote Scripting 方法。

异步调用某个 remote script 类似于同步调用。不过,当产生调用时,您要指定多至三个附加参数:

当服务器方法完成处理时,在用户的客户脚本中有一个被调用的 JavaScript callback function 。例如,如果用户的 remote scripting 方法执行一次数据库检查,那么回调函数可能得到远程调用返回的检查值,并在页面上的某个控件中显示之。

一个可选的 JavaScript 错误回调函数──如果异步调用时遇到错误将调用之。

一个可选的上下文参数。这是用户传递给方法并在以后传回用户的数据。它典型地用于帮助您决定在自己的回调函数中正调用什么方法,例如,如果您正在将所有远程脚本调用回传给某个回调函数。
类似于同步调用,异步调用将创建一个调用对象,该对象支持包含被调用过程的返回值和状态信息的属性。例如,某个 remote scripting 方法的返回值可在调用对象的 return_value 属性中获得。在异步调用时,调用对象 status 属性向用户提供关于调用状态的信息。

当您产生异步调用时,调用对象作为一个参数传递到回调函数中。这样您就可以在调用脚本中对其进行测试(例如,决定呼叫的状态),或者在回调函数中测试(例如,获得方法的返回值)。

如果您已经创建了对某个服务器页的对象引用,那么您就可以用标准的 object.method 语法来调用方法。有关创建对象引用的详细信息,请参阅作为对象引用 ASP 页。

如何异步调用服务器方法

如果用户已经创建了对服务器页的对象引用,那么可以用下面的语法。由于您必须传递回调函数的函数指针,因此对于异步方法调用来说,您必须用 JavaScript。
callObject = ASPObject. methodName(p1, p2[,...],
callbackFunction, errorCallbackFunction, context)

- 或者 -

如果您尚未创建对象引用,那么可以调用 RSExecute 函数,所用语法如下:
callobject = RSExecute(url, methodName, p1, p2[,...],
callbackFunction, errorCallbackFunction, context)

其中:

ASPObject 您先前用 RSGetASPObject 方法创建的对象引用。有关详细信息,请参阅作为对象引用 ASP 页。

callObject 在完成 remote scripting 调用时将被实例化的调用对象名。您无需创建在调用 remote script 之前创建该对象;RSExecute 方法为您创建该对象。

url 包含您想要执行的远程脚本的 ASP 页的 URL。服务器页必须已被配置为使得服务器页中的 Remote Scripting 有效中所描述的那样。服务器页必须在用户从中请求当前客户页的服务器上。

methodName 您想要执行的服务器页上的方法名。

p1, p2, ... methodName 中方法所需要的任何参数。参数是通过值进行传递的。您可以传递简单的数据类型,比如数值或者文本值,但不能传递数组或者对象。
注意 当把参数从客户传递给服务器时,它们被转换为字符串。要确保在使用这些参数值时,您的服务器方法将它们转换为合适的数据类型。有关详细信息,请参阅使得服务器页中的 Remote Scripting 有效。

callbackFunction 您的客户脚本中 JavaScript 函数的函数指针,当完成对 remote scripting 方法的调用时将调用该函数。由于用户正在传递的是一个指针,因此不要在引号中包括其名字。在 RSExecute 调用中包括回调函数名意味着您想要异步执行 remote scripting 方法。

errorCallbackFunction 用户的客户脚本中某个可选 JavaScript 函数的函数指针,如果 remote scripting 方法遇到一个错误,将调用该函数。由于您所传递的是一个指针,因此不要在引号中包括其名。关于 remote scripting 中错误的详细信息,请参阅检查错误。

context 您传递给 remote scripting 方法并回传给您的一个可选值。您可以在自己的回调函数中用自己觉得有用的任意方式使用该值。
例如,下面按钮 btnSquare 的客户脚本 onclick 处理程序调用服务器方法 square 来对文本框 txt1 中的指定数值进行平方运算。当执行了该方法后,它调用函数 showResults 。操作符名(“求平方”)在上下文参数中进行传递。

<SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick">
rsMath = RSGetASPObject("../myPages/RSMath.asp")
number1 = txt1.value;
context = "squaring";
co = rsmath.square(number1,showResults,context);
</SCRIPT>

使用 RSExecute 而不用对象引用的同样示例如下所示:

<SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick">
number1 = txt1.value;
context = "squaring";
co = RSExecute("RSmath.asp","square",number1,showResults,context);
</SCRIPT>

函数 showResults 是先前示例的回调函数,可能如下所示:

<SCRIPT LANGUAGE="JavaScript">
function showResults(co){
typeOp = co.context;
rValue = co.return_value;
txt2.value = "Result of " + typeOp + " operation = " + rValue;
}
<SCRIPT>

在这种情况下,showResults 函数可被用作一般意义上的回调函数,以显示任何运算值。该函数指明用户可能如何使用调用对象的 context 属性(当调用 remote scripting 函数时对之进行初始化),以便于决定如何调用回调函数。

测试异步调用
用户可以对某个远程调用的状态进行测试,以便于搞清调用是否成功。如果用户已经进行了异步调用,那么用户可以测试是否已完成调用。

如何测试某个远程调用的状态

在调用脚本中,获得调用对象的 status 属性值,它可以包含下列值中的任一个:
值 描述
-1 失败
0 完成
1 挂起(仅在异步调用过程中有效)。

下面的示例显示了同步调用某个叫做 square 的 remote scripting 方法,然后在页面上的某个文本框中显示调用状态的客户脚本。

<SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick">
number1 = txt1.value;
context = "squaring";
co = RSExecute("RSmath.asp","square",number1);
if (co.status == -1)
{txt2.value = "Call failed";}
else
{txt2.value = "Call succeeded, return value = " + co.return_value;} }
</SCRIPT>

关于错误的详细信息,请参阅检查错误。

控制异步调用
进行异步调用时,可用两种方式来控制它:

等待调用完成。这将挂起客户脚本处理,直到完成 remote scripting 调用,有效地将异步调用转换为同步调用。如果您在自己的客户脚本中到了异步调用提供所需信息的阶段,那么就可这样做。为了等待,可以调用调用对象的等待方法。

取消调用,若要这样做,可以调用调用对象的取消方法。

文档: 检查错误
当您在服务器脚本中用 remote scripting 调用方法时,可能会遇到多种错误,包括语法错误和运行时间错误,以及调用 remote scripting 方法时的错误。remote scripting 调用机制向您提供了获知调用过程中所出现错误信息的途径。

错误处理程序根据您是进行同步或者异步调用稍微有些不一样。如果您在进行同步调用时导致错误,那么 remote scripting 机制将在浏览器中显示一条错误消息。错误文字来自于调用对象的 message 属性。有关详细信息,请参阅如下的“Remote Scripting 调用故障诊断”。

不过,如果您产生导致一个错误的异步调用,那么您可以通过指定一个错误回调函数捕获该错误,该回调函数的调用在很大程度上和普通回调函数有相似之处。

捕获异步调用中产生的错误

您可以指定自己异步 remote scripting 调用中的错误回调函数名。由于您必须传递该回调函数的函数指针,因此对于异步方法调用来说,您必须使用 JavaScript。如果您已经创建了对服务器页的对象引用,那么可以用第一个语法示例。否则可以用第二个语法示例。
callObject = ASPObject.methodName(p1, p2[,...],
callbackFunction, errorCallbackFunction, context)

callobject = RSExecute(url, methodName, p1, p2[,...],
callbackFunction, errorCallbackFunction, context)

有关产生对服务器方法异步调用的详细信息,请参阅异步调用 Remote Scripting 方法。

不管您进行同步还是异步调用,都可以得到关于错误条件的信息,方法是测试调用对象的属性。如果用户指定了错误回调函数,那么调用对象就被作为参数传递,就象普通回调函数参数传递一样。特别是下面的属性提供了错误信息:

status 如果远程调用失败则包含 -1。

data 包含服务器返回的 XML 格式的粗信息。这是调试的最好信息源,因为它包含了错误消息的完整文本以及服务器生成的其他消息。

message 包含 remote scripting 代理过程生成的错误消息信息(如果有的话)。message 中的错误消息不必要和 data 属性中的一样。例如,如果 ASP 页包含一条语法错误,那么关于该错误的详细消息将出现在 data 属性中,但消息属性将只包含这样一条消息──它指示用户不能调用 ASP 页上的方法。
下面的脚本示例了客户脚本中的一个错误回调函数。第一个脚本产生一个 remote scripting 调用,并指明错误回调函数。第二个脚本是错误回调函数本身。错误回调函数并不显式地对调用对象 status 属性值进行测试,因为该函数仅在调用失败时才被调用。

<SCRIPT LANGUAGE="JavaScript" for="btnSquare" event="onclick">
rsMath = RSGetASPObject("rsadd.asp");
number1 = txt1.value;
context = "squaring";
co = rsMath.square(number1,showResults,showErrors,context);

function showErrors(co){
// 转储粗数据
msg = "The raw data returned by the remote method call is "
msg = msg + co.data
alert(msg);
// 显示友好信息
msg = "The following error occurred during the "
msg = msg + co.context
msg = msg + " remote scripting call:n"
msg = msg + co.message
alert(msg);
}
</SCRIPT>

Remote Scripting 调用故障诊断
找到某个 remote scripting 调用中的确切错误源并不总是一件容易的事情,因为 remote scripting 不仅涉及到客户而且涉及到服务器上的多个文件。不过,某些类型的错误属于一般性错误,而且容易发现。另外,用户可以用 remote scripting 机制的错误捕获程序获得调用过程中所出现错误的详细信息。

在某些情况下,用户不能用 remote scripting 进行任何处理,因为尚未对之进行正确的初始化。下表列出了典型的初始化错误及其可能的出错缘由。

症状 可能错因
Remote scripting 不起作用;客户页源仅包含 <APPLET> 标记。 RSEnableRemoteScripting
调用不在文档主体内。请参阅使得客户页内的 Remote Scripting 有效。
Remote scripting 不起作用;所有调用失败。 ASP 页未被调用。使用 http:// 协议(而不是 file://)。
客户端错误消息,比如当试图调用 remote scripting 方法时,出现“未定义 'MSRS' ”消息。 试图进行远程调用之前,未能成功调用 RSEnableRemoteScripting 方法。
客户端错误消息“对象不支持该属性或者方法,”特别显示出和 .HTM 文件不匹配的行号。 找不到代理对象 (Rsproxy.class),或者 RSEnableRemoteScripting 方法中传递的是无效 URL。
客户端错误消息“创建文件的 ASP 对象失败”。 RSGetASPObject 调用中传递的是无效 URL。请参阅作为对象引用 ASP 页。

如果错误位于包含远程调用方法的 ASP 页中,或者如果错误出现在对某个远程方法的调用过程中,那么用户可以在某个错误回调函数中捕获该错误,而且用户可以从调用对象的 data 和 message 属性中获得关于错误的信息。

下表列出了用户可以用错误回调函数捕获的典型问题以及 message 和 data 属性中的值。在多数情况下,message 属性返回一般性信息,而 data 属性则包含关于错误的详细信息。

注意 数据属性包含一定数目的 XML 标记以及和调用有关的其他信息。下表列出了出现在属性值中的一个字符串。

问题 消息值 数据值
RSExecute 方法中 ASP 页的无效 URL。请参阅同步调用 Remote Scripting 方法和异步调用 Remote Scripting 方法 不同的,包括用户试图调用的页名。 (null)
ASP 文件到 Rs.asp 的路径错误。请参阅使得服务器页中的 Remote Scripting 有效。 “调用的页不支持 remote scripting。” “未找到包括文件。”
ASP 文件中的语法或者运行时间错误。 “调用的页不支持 remote scripting。” 和错误有关的细节,包括行号。
试图调用不存在的方法。 “不是公用函数。” “不是公用函数。”
ASP 构造函数引用了未出现在 ASP 文件中的函数。请参阅使得服务器页中的 Remote Scripting 有效 “调用的页不支持 remote scripting。” “functionName未定义。”

文档: 调用对象属性和方法

当您调用一个服务器方法时,该方法不返回单个值。而是创建一个调用对象,该对象包含被调用过程的返回值和状态信息。下表列出了调用对象的属性。

属性 描述
id

调用的唯一标识号,它是首次调用时产生的。
return_value

方法的返回值──如果有的话。
data

产生 remote scripting 调用时,服务器返回的粗数据,是以 XML 标记封装的。有关详细信息,请参阅检查错误。
status

指示方法调用当前状态的值。可能值包括:
-1 失败
0 完成
1 挂起

有关详细信息,请参阅异步调用 Remote Scripting 方法。

message

和调用有关的文本信息。如果调用成功,那么 message 包含值“完成”。如果失败,那么 message 可能包含服务器返回的错误文本或者一条标准错误消息。有关详细信息,请参阅检查错误。

callback

调用中指定的可选回调函数文本。
error_callback

调用中指定的可选错误回调函数文本。
context

随调用传递的上下文值。有关详细信息,请参阅异步调用 Remote Scripting 方法。

下表列出了您能为调用对象调用的方法。

方法 描述
wait 停止当前正执行的客户脚本,直到指定调用对象的一个异步 remote scripting 调用完成。
cancel 停止某个正异步执行的 remote scripting 调用。

关于调用对象的详细信息,请参阅同步调用 Remote Scripting 方法和异步调用 Remote Scripting 方法。

文档: 等待方法

终止当前正执行的客户脚本,直到指定调用对象的异步 remote scripting 调用完成。

语法

co.wait()

参数

co
执行 remote scripting 调用而生成的调用对象。

说明

调用该方法将把一个异步 remote scripting 调用转换为同步调用。如果 remote scripting 调用已完成,那么该方法将立即返回。如果您在客户脚本中遇到这种情况──需要来自 remote scripting 调用的结果,那么这种调用是有用的。

示例

下面的脚本异步调用 EmpLists 页上的方法 GetNames。当发出调用后,它显示一条消息,然后等待结果。

<SCRIPT LANGUAGE="JavaScript" FOR="btnReport" EVENT="onclick">
empLookup = RSGetASPObject("../mypages/EmpLists.asp");
co = empLookup.GetNames(showResults);
txt1.value = "Getting employee names ..."
co.wait() // suspends client processing
</SCRIPT>

文档: 取消方法

停止某个正异步执行的 remote scripting 调用。

语法

co.cancel()

参数

co
执行某个 remote scripting 调用而生成的调用对象。
说明

您可以在异步调用 remote scripting 过程中调用该方法──如果您决定不再需要异步调用结果的话。如果某个用户动作──比如单击按钮或者请求漫游到另一页──指示 remote scripting 调用已经无效的话,那么这种调用是有用的。

您不能取消同步 remote scripting 调用。

示例

<SCRIPT LANGUAGE="JavaScript" FOR="btnReport" EVENT="onclick">
empLookup = RSGetASPObject("../mypages/EmpLists.asp");
coEmpList = empLookup.GetNames(showResults);
txt1.value = "Getting employee names, press Cancel to stop."
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript" FOR="btnCancel" EVENT="onclick">
coEmpList.cancel()
</SCRIPT>

 
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Counters 组件参考(四) - Remove  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)
 ·remote script文档(转载自微软)(  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·在ASP中使用数据库
·使用ASP脚本技术
·通过启动脚本来感受ASP的力量
·学习使用ASP对象和组件
·解析asp的脚本语言
·初看ASP-针对初学者
·ASP开发10条经验总结
·ASP之对象总结
·ASP与数据库应用(给初学者)
·关于学习ASP和编程的28个观点
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统