sadier

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
.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 程序就是这样建立起来的。:)
posted on 2004-07-28 21:06  毛小华  阅读(630)  评论(0编辑  收藏  举报