Ajax的远程调用

最近的开发的一个项目中,应用了微软的Ajax技术,早期版本叫做ATLAS,1.0发布后正式更名为 ASP.NET AJAX。
在应用了一段时间后,有时间仔细研究一下他的工作原理,以便于更好的理解,更好的应用与开发。但是这个东西是不公开source code的,只能通过体会调用方式,观察拦截到的网络数据交换的内容,来理解他的工作原理。
Ajax的全称是:Asynchronous JavaScript & XML。
JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。ASP.NET AJAX的远程数据交换就是采用的JSON,而不是认为中的XML。JSON不多说了,参考。
个人认为,AJAX开发包最核心的功能应该是简便的远程调用,其他的都是锦上添花的东西。当我在了解JSON的时候,看到了Jayrock, 。Joyrock是一个LGPL的开源的软件,实现了JSON和JSON-RPC,支持微软ASP.NET框架。当我大体读了一下他的Source Code,理解了他的实现原理,觉得和微软的ASP.NET AJAX有很多相同的地方,由于ASP.NET AJAX没有Source Code,不敢妄言他们实现的方法是有多少是一致的。

看看服务器端的写法:
<%@ WebHandler %>

namespace JayrockWeb
{
    using System;
    using System.Web;
    using Jayrock.Json;
    using Jayrock.JsonRpc;
    using Jayrock.JsonRpc.Web;

public class HelloWorld : JsonRpcHandler
    {
        [ JsonRpcMethod("greetings") ]
        public string Greetings()
        {
            return "Welcome to Jayrock!";
        }
    }
}
[ JsonRpcMethod("greetings") ]恰好对应于ASP.NET 的[WebMethod],深入理解一下就知道,这两个自定义属性就是起到标记作用,用来声明方法是可以远程调用的。

客户端调用:
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "">
<html xmlns="" lang="en" xml:lang="en">
<head>
    <title>Hello Jayrock</title>
    <script type="text/javascript" src="http://blog.sina.com.cn/json.js"></script>
    <script type="text/javascript" src="http://blog.sina.com.cn/helloworld.ashx?proxy"></script>
    <script type="text/javascript">

window.onload = function()
{
    var s = new HelloWorld();

alert("sync:" + s.greetings());

s.greetings(function(response) {
      alert("async:" + response.result)
    });
}


    </script>
</head>
<body>
    <p>This page tests the HelloWorld service with Jayrock.</p>
</body>

可以看到helloworld.ashx?proxy指向了一个JS文件,他的内容就是:
// This JavaScript was automatically generated by
// Jayrock.Json.Rpc.Web.JsonRpcProxyGenerator, Jayrock, Version=0.9.7507.0, Culture=neutral, PublicKeyToken=null
// on 2006年12月5日 at 8:46:27 (中国标准时间)

// Proxy version 1.0

function HelloWorld(url)
{
   
   
    this["system.about"] = function(callback)
    {
        return call("system.about", [ ], callback);
    }
   
   
   
    this["system.version"] = function(callback)
    {
        return call("system.version", [ ], callback);
    }
   
   
   
    this["system.listMethods"] = function(callback)
    {
        return call("system.listMethods", [ ], callback);
    }
   
    this["greetings"] = function(callback)
    {
        return call("greetings", [ ], callback);
    }
   
    var url = typeof(url) === 'string' ? url : 'http://localhost:3409/Web/HelloWorld.ashx';
    var self = this;
    var nextId = 0;

function call(method, params, callback)
    {
        var request = { id : nextId++, method : method, params : params };
        return callback == null ?
            callSync(method, request) : callAsync(method, request, callback);
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11454.html