Jayrock: JSON and JSON-RPC for .NET

mojoPortal 项目中使用Joyrock和MagicAjaxNET,他没有使用Asp.net ajax ,是因为mojoPortal是一个运行在Windows的 .net framework或Linux,Mac OS的Mono平台上的cms系统,asp.net ajax 的协议决定了它不能应用于mono上。Joyrock的具体应用可以去看mojoPortal 的最新版本的代码。

Joyrock是一个LGPL的开源的软件,实现了JSON和JSON-RPC,支持微软ASP.NET框架。

看看服务器端的写法:

<%@ WebHandler Class="JayrockWeb.HelloWorld" %>  
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" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
    <title>Hello Jayrock</title>
    <script type="text/javascript" src="json.js"></script>
    <script type="text/javascript" src="helloworld.ashx?proxy"></script>
    <script type="text/javascript">
/* <![CDATA[ */  
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)
{
    /* Returns a summary about the JSON-RPC server implementation for display purposes. */
 
    this["system.about"] = function(callback)
    {
        return call("system.about", [ ], callback);
    }
 
    /* Returns the version JSON-RPC server implementation using the major, minor, build and revision format. */
 
    this["system.version"] = function(callback)
    {
        return call("system.version", [ ], callback);
    }
 
    /* Returns an array of method names implemented by this service. */
 
    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);
    }  
    function callSync(method, request)
    {
        var http = newHTTP();
        http.open('POST', url, false, self.httpUserName, self.httpPassword);
        setupHeaders(http, method);
        http.send(JSON.stringify(request));
        if (http.status != 200)
            throw { message : http.status + ' ' + http.statusText, toString : function() { return message; } };
        var response = JSON.eval(http.responseText);
        if (response.error != null) throw response.error;
        return response.result;
    }  
    function callAsync(method, request, callback)
    {
        var http = newHTTP();
        http.open('POST', url, true, self.httpUserName, self.httpPassword);
        setupHeaders(http, method);
        http.onreadystatechange = function() { http_onreadystatechange(http, callback); }
        http.send(JSON.stringify(request));
        return request.id;
    }  
    function setupHeaders(http, method)
    {
        http.setRequestHeader('Content-Type', 'text/plain; charset=utf-8');
        http.setRequestHeader('X-JSON-RPC', method);
    }  
    function http_onreadystatechange(sender, callback)
    {
        if (sender.readyState == /* complete */ 4)
        {
            var response = sender.status == 200 ? 
                JSON.eval(sender.responseText) : {};
 
            response.xmlHTTP = sender;
 
            callback(response);
        }
    }  
    function newHTTP()
    {
        return typeof(ActiveXObject) === 'function' ? 
            new ActiveXObject('Microsoft.XMLHTTP') : /* IE 5 */
            new XMLHttpRequest(); /* Safari 1.2, Mozilla 1.0/Firefox, and Netscape 7 */
    }
}  

HelloWorld.rpcMethods =["system.about","system.version","system.listMethods","greetings"]; 上面JS文档是自动生成的,ASP.NET AJAX也有自动生成客户端访问对象的功能 Jayrock 远程方法要求写在一个ashx中,页面请求这个ashx的时候,在ProcessRequest 中根据Request对象中的参数信息,确定请求的服务器端方法名称和参数,然后进行调用,并返回结果。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏me的随笔

.NET Core中的包、元包与框架

.NET Core是一个由NuGet包组成的平台。一些产品受益于细粒度包的定义,也有一些受益于粗粒度包的定义。为了适应这种二重性,.NET Core平台被分为一...

12840
来自专栏逸鹏说道

图片在保存的时候===》出现这个异常:GDI+ 中发生一般性错误

异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html ? 一般这种情况都是没有权限,比如目录没有...

39080
来自专栏林德熙的博客

WPF Process.Start 出现 Win32Exception 异常

如果使用下面的代码启动另一个软件,那么在启动的软件路径不存在时,就会出现异常System.ComponentModel.Win32Exception,没有其他信...

20410
来自专栏『不羁阁』 | 行走少年郎专栏

iOS多线程:『pthread、NSThread』详尽总结

22150
来自专栏calvin

Microsoft.AspNet.Identity 自定义使用现有的表—登录实现

Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现。Microsoft.AspNet....

13120
来自专栏蜉蝣禅修之道

android之编辑框限定范围

23730
来自专栏MasiMaro 的技术博文

Windows资源

Windows资源是一种二进制数据,由链接器链接进程序成为程序的一部分,通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的,...

20310
来自专栏大内老A

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享(“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的“中性...

20680
来自专栏中国白客联盟

使用sqlmap的osshell不出现盘符的解决办法

做个笔记,dba权限时,使用sqlmap的osshell时,当输入路径时,但是sqlmap迟迟不写入盘符,如图: ? 当然,试过f:\,f:\\,f:/,f...

37060
来自专栏walterlv - 吕毅的博客

Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

发布于 2018-03-18 12:45 更新于 2018-06...

11210

扫码关注云+社区

领取腾讯云代金券