.NET 世界中的远程脚本

以前在开发ASP程序时,根据客户的要求,不能使用刷新页面要对数据进行更新。就使用当时比较新的方法(Microsoft Remote Scripting)。还记得那个 Rs.asp文件吗?呵呵,我们来回顾一下老的调用方法:
  有三个文件:
   Rs.asp :在服务器端进行引用,来完成服务器端的初始化工作
   Rs.Htm :其实它是一个JavaScript 脚本文件,使用完成请求分析数据
   Rsproxy.class :是一个Java 小程序,就是通过它来完成客户端与服务端的通信
  -------- 服务端文件 Server.asp----
  <%@ LANGUAGE=VBSCRIPT %>
  <!--#include file="_ScriptLibrary/rs.asp"--> //必须要包含这个文件
  <% RSDispatch %> //对 Remote Scripting 进行初始化,必须第一个调用
  <SCRIPT Language=JavaScript RUNAT=SERVER>
  function Description(){
   this.myFunction = myFunction; //暴露myFunction函数
  }
  public_description = new Description();
  function myFunction(strInput, numLength) //在这里实现这个myFunction 函数
  {
   var objConn = Server.CreateObject("ADODB.Connection");
   objConn.Open("dsn=pubs;uid=sa;pwd=;Network=DBMSSOCN");
   var objRS = Server.CreateObject("ADODB.Recordset");
   objRS.MaxRecords = numLength;
   objRS.Open("SELECT au_lname, au_fname FROM Authors Where (au_lname + ', ' + au_fname) >= '" + strInput + "' ORDER BY au_lname,au_fname", objConn, 0, 3);
   var tmpMsg = new String;
   tmpMsg.value = "";
   while (!objRS.EOF){
   tmpMsg.value = tmpMsg.value + objRS("au_lname") + ", " + objRS("au_fname") + ":";
   objRS.MoveNext();
   }
   objConn.Close();
   return tmpMsg.value;
  }
  </SCRIPT>
  --------------客户端 RSClient.HTM ------
  <HTML>
  <HEAD>
  <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
  <TITLE>Servin' It Up with Remote Scripting</TITLE>
  <BODY onload="refresh_list()"> //当页面载入时调用函数 refresh_list()
  <SCRIPT Language="JavaScript" src="_ScriptLibrary/rs.htm"> //这是客户端必须的引入
  </SCRIPT>
  <H2>Address Book Sample</H2>
  <FORM id=form1 name=form1>
  <INPUT type="text" size="50" id=Myname name=MyName onkeyup=refresh_list()><br>
  <SELECT id=NameList name=NameList size=10>
  - One Moment Please -----</SELECT>
  </FORM>
  <SCRIPT LANGUAGE=javascript>
  <!--
  RSEnableRemoteScripting(); //初始化客户端脚本,建立连接对象
  function refresh_list(){
   var serverURL = "server.asp"; //服务器端文件
   var DisplayLength = 10
   document.form1.NameList.length = 0
   document.form1.NameList.length = DisplayLength
   var inValue = document.form1.MyName.value;
   var myVar = RSExecute(serverURL, "myFunction", inValue, DisplayLength);//进行远程调用
   var myArray = myVar.return_value.split(":"); //返回值只能是String类型
   for (i = 0; i < 10; i++){ //下面对得到的数据进行分析
   var myOpt = new Option
   myOpt.value = myArray[i];
   myOpt.text = myArray[i];
   if (i < myArray.length){
   document.form1.NameList.options[i] = myOpt;
   }
   }
   document.form1.NameList.options[0].selected = true;
  }
  //-->
  </SCRIPT>
  </BODY>
  </HTML>
  
  
  
   这就是完整的RemoteScripting 的调用过程,不过有两个非常不好的地方那就是。RS使用的是 HTTP Get方法来进行数据传送。这样有了一个2K的数据限止。也就是说你的参数总的长度不能超过2K。还有一个不好是客户端必须有JVM运行机。在Windows XP 中系统已经不是默认安装了,所以会出现无法运行的问题。
   而下用使用Web Service 就已经很好地解决了这些方面的问题。
  
  在Web Service只用到了一个Web Service 服务和一个 webservice.htc 文件
  先我们创建一个 Web Service ,利用VS.net 很容易就能完成。
  -----------Web 服务 WebServiceTest.asmx------
  using System;
  using System.Web.Services;
  public class Service1 : System.Web.Services.WebService
  {
   [WebMethod]
   public string HelloWorld()
   {
   return "Hello World";
   }
  }
  -----------客户端文件 Client.html---
  <HTML>
  <Body>
  <div id="displayHello"></div>
  <div id=service style="BEHAVIOR: url(webservice.htc)"></div> //这是引入JavaScript库
  <script language="JavaScript">
   service.useService("WebServiceTest.asmx?WSDL","svrHelloWorld"); //创建svrHelloWorld属性
   //在 WebServiceTest Web 服务上调用 HelloWorld 方法
   var iCallID = service.svrHelloWorld.callService(showHelloWorld,"HelloWorld");
   function showHelloWorld(result){
   //显示Hello World
   displayHello.innerHTML = result.value;
   }
  </script>
  </Body>
  </HTML>
  
   因为Web Service能够使用HTTP POST方法,那就没有了2K的限止。因为使用的是XML,支持通过浏览器通信,所以不需要数据传送层。当然也可以很容易地通过防火墙。完美的Web 程序就是这样建立起来的。:)
上一篇:RT-Thread下的串口驱动程序分析【转载】


下一篇:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]