天天看點

.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"> //這是用戶端必須的引入

  <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;

  //-->

  </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---

  <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>

   因為Web Service能夠使用HTTP POST方法,那就沒有了2K的限止。因為使用的是XML,支援通過浏覽器通信,是以不需要資料傳送層。當然也可以很容易地通過防火牆。完美的Web 程式就是這樣建立起來的。:)