最近的开发的一个项目中,应用了微软的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);
}