Jayrock: JSON and JSON-RPC for .NET
时间:2022-04-25
本文章向大家介绍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对象中的参数信息,确定请求的服务器端方法名称和参数,然后进行调用,并返回结果。
- 未来10年21个核心工作岗位
- Asp.net 2.0 WebPart使用经验点滴
- 使用LinqToExcel读取Excel
- 时代的需要:越来越多的Java工程师开始转向hadoop?
- 如何结合IbatisNet的LIST遍历实现模糊查询
- Flash/Flex学习笔记(41):碰撞检测
- [.NET网格计算框架] Alchemi
- 修改WordPress登陆文件名wp-login.php,防密码被暴力破解
- NDoc - .NET 代码文档生成器
- Mono P/Invoke :DLLImport
- MONO x64 amd_x64
- DN榜:最近3个域名成交金额均达到六位数美金
- 采访Philipp Crocoll:安卓平台上整合Java和C#
- “AS3.0高级动画编程”学习:第一章高级碰撞检测
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- postman的使用技巧
- Nodejs Serialport文档翻译
- Flask-Login文档翻译
- jsp作业——简单的试卷和自动打分
- ESP8266烧入nodemcu简易教程
- 搭建简易的物联网服务端和客户端-STM32(一)
- 搭建简易的物联网服务端和客户端-Nodejs_net(二)
- 搭建简易的物联网服务端和客户端-Nodejs_mysql(三)
- 搭建简易的物联网服务端和客户端-net+mysql(四)
- 搭建简易的物联网服务端和客户端-Nodejs_express服务(六)
- TF中Placement的最后一道防线——Placer
- 搭建简易的物联网服务端和客户端-ECharts数据显示(七)
- 搭建简易的物联网服务端和客户端-整合(八)
- 搭建简易的物联网服务端和客户端-Maibu显示(九)
- 搭建简易的物联网服务端和客户端-DCloud手机端(十)