首页 > 技术文章 > 学习json-rpc

jellochen 2014-07-03 22:33 原文

最近做一个和SmartHome相关的项目,文档不全不说,连个像样的Demo都没,痛苦!!当然,这是题外话。今天来说说项目中主要用到的通讯协议:json-rpc,简单地说,它是以json格式进行的远程调用,是一种比xml-rpc更lightweight的协议,具体的介绍可参考json-rpc官网Wiki。这里参考了Jayrock: JSON and JSON-RPC for .NET 也使用Jayrock来说说json-rpc的应用。

1.准备工作

首先,添加引用,先通过Nuget获取Json.net,然后引用Jayrock.dll和Jayrock.Json.dll

建立一些Model,这个根据实际情况来创建。我这里服务器用户登录需要的json的格式,例如:

{"method":"Login","params":{"username":"test2014","password":"test2014"}}

我们这里创建这么几个实体:

#region Login
    public class LoginModel
    {
        public string method { get; set; }
        public LoginParams _params { get; set; }
    }
    public class LoginParams
    {
        public string username { get; set; }
        public string password { get; set; }
    }
    public class LoginReturnModel
    {
        public string result { get; set; }
        public string info { get; set; }
    } 
    #endregion

    #region GetDeviceInfo
    public class GetDeviceInfoModel
    {
        public string method { get; set; }
        public GetDeviceInfoParams _params { get; set; }
    }
    public class GetDeviceInfoParams
    {

    }
    public class GetDeviceInfoReturnModel
    {
        public string result { get; set; }
        public GetDiveInfoReturnInfo[] info { get; set; }
    }
    public class GetDiveInfoReturnInfo
    {
        public string deviceid { get; set; }
        public string deviceno { get; set; }
        public string identify { get; set; }
        public string lable { get; set; }
    } 
    #endregion
View Code

2.准备页面和处理程序

创建HtmlPage1.html页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="js/json.js"></script>
    <script type="text/javascript" src="Handler.ashx?proxy"></script>
    <script type="text/javascript">
        window.onload = function () {
            var s = new Handler();
            s.Login('test2014@99guard.com', 'test2014');
            alert(s.GetDeviceInfo());
        }
    </script>
</head>
<body>

</body>
</html>

创建Handler.ashx:

using Jayrock.JsonRpc;
using Jayrock.JsonRpc.Web;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace JsonRpcTest3
{
    /// <summary>
    /// Handler 的摘要说明
    /// </summary>
    public class Handler : JsonRpcHandler
    {
        string requestUri;
        string requestMethod;
        string contentType;
        public Handler()
        {
            requestUri = "http://u.99guard.com:8080/homehand_spring_6/ziga8/usss.do";
            requestMethod = "POST";
            contentType = "application/json-rpc";
        }
        [JsonRpcMethod(Name="Login")]
        public bool Login(string username, string password)
        {
            string result;
            LoginParams lp = new LoginParams();
            lp.username = username;
            lp.password = password;
            LoginModel lm = new LoginModel();
            lm.method = "Login";
            lm._params = lp;
            string jsonData = JsonConvert.SerializeObject(lm).Replace("_params", "params");
            byte[] bytes = Encoding.UTF8.GetBytes(jsonData+" ");
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
            request.Method = requestMethod;
            request.ContentType = contentType;
            request.ContentLength = bytes.Length;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (Stream s = response.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(s,Encoding.UTF8))
                {
                    result = sr.ReadToEnd();
                }
            }
            LoginReturnModel lrm = JsonConvert.DeserializeObject<LoginReturnModel>(result);
            bool status = lrm.result == "0" ? true : false;
            if (status)
            {
                StoreSession(response.Headers["Set-Cookie"]);
            }
            return status;
        }

        [JsonRpcMethod(Name = "GetDeviceInfo")]
        public string GetDeviceInfo()
        {
            string sessonId = File.ReadAllText(@"d:\1.txt");
            string result;
            GetDeviceInfoModel model = new GetDeviceInfoModel();
            model.method = "GetDeviceInfo";
            model._params = new GetDeviceInfoParams();
            string jsonData = JsonConvert.SerializeObject(model).Replace("_params", "params");
            byte[] bytes = Encoding.UTF8.GetBytes(jsonData + " ");
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
            request.Method = requestMethod;
            request.ContentType = contentType;
            request.ContentLength = bytes.Length;
            request.Headers.Add("Cookie", sessonId);
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (Stream s = response.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(s, Encoding.UTF8))
                {
                    result = sr.ReadToEnd();
                }
            }
            GetDeviceInfoReturnModel returnModel = JsonConvert.DeserializeObject<GetDeviceInfoReturnModel>(result);
            return JsonConvert.SerializeObject(returnModel);
        }

        public void StoreSession(string session)
        {
            if (!string.IsNullOrEmpty(session))
            {
                File.WriteAllText(@"d:\1.txt", session);
            }
        }
    }
}

运行结果:

推荐阅读