源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

利用thrift实现js与C#通讯的实例代码

  • 时间:2022-05-11 22:12 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:利用thrift实现js与C#通讯的实例代码
1.为什么要用thrift js C#?     1.1 首先,js 通过 thrift 访问C#,实际上是一种c/s模式。thrift是通信工具,js是客户端,C#是服务端。     1.2 使用js直接与thrift server通信。让web开发变得更简单。如果使用Web Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发效率。而thrift则会自动生成两端的操作类,你只需要处理方法内部的逻辑即可。     1.3 js直接与thrift server通信,可以提高性能,并且用C#开发server,开发效率也非常高。(那些web service弱爆了)     1.4 当然,我们不能只看到优点。用这种方法也有比较明显的缺点:如果使用web service,则网页与web service可以封装在一个工程里,部署到IIS上后,可以存在于一个网站内。而使用了thrift后,你还需要手动管理thrift程序。包括:         1.4.1 你需要拥有服务端的绝对控制权,比如,你可以直接登录服务器的操作系统上进行操作。因此,如果你只有一个网页空间,则不适合这种方法。当然,你也可以用web service里绑定thrift,但这样你又需要自己手动进行序列化与反序列操作,而且两次转换让性能更低,有违初衷         1.4.2 给thrift server程序增加自动启动,与监视程序,来完成thrift的崩溃后自动重启。   2.环境     Win7 - VS2012 - .net 4.0 C# 控制台工程(用来承载thrift)     Win7 - VS2012 - .net 4.0 C# Web工程(用来调试js,超方便)   3.步骤(以下步骤,对于小白来说,有些困难。QQ讨论群:23152359 )     3.1 去thrift官方下载thrift库,目前是0.9.0。     3.2 去thrift官方下载编译好的win下的thrift编译器,是一个exe文件。     3.3 写一个数据结构定义文件。我在这里只是用了服务,没有定义自定义数据结构。         data.txt:
[u]复制代码[/u] 代码如下:
 service UserStorage  {      i32 Sum( 1: i32 arg_number1, 2: i32 arg_number2),      string GetString()  }
3.4 命令行下,用thrift编译器,对它进行编译:    run.bat:
[u]复制代码[/u] 代码如下:
 thrift-0.9.0.exe --gen csharp data.txt  thrift-0.9.0.exe --gen js data.txt  pause
    3.5 建立一个名字为CSharpServer的C#控制台工程,.net 4.0的。     3.6 为这个工程,添加现有项目:thrift库目录\thrift-0.9.0\lib\csharp\src\Thrift.csproj,然后引用这个项目。     3.7 把thrift编译出来的UserStorage.cs(在gen-csharp目录里),拖动到解决方案管理器里的CSharpServer项目的根目录下,UserStorage.cs与Program.cs应该在同一级。     3.8 在CSharpServer项目里创建一个UserStorage的处理类UserStorageHandle.cs:(它应该与UserStorage.cs与Program.cs在同一级)
[u]复制代码[/u] 代码如下:
using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace CSharpServer  {      public class UserStorageHandle : UserStorage.Iface      {          public UserStorageHandle()          {          }          public int Sum(int arg_number1, int arg_number2)          {              int result = arg_number1 + arg_number2;              Console.WriteLine(DateTime.Now.ToString() + " 收到请求:Sum,参数:arg_number1 = " + arg_number1.ToString() + ",arg_number2 = " + arg_number2.ToString() + ",返回:result = " + result.ToString());              return result;          }          private static int Counter = 0;          public string GetString()          {              int currentCounter = System.Threading.Interlocked.Increment(ref UserStorageHandle.Counter);              Console.WriteLine(DateTime.Now.ToString() + " 收到请求:GetString,参数:没有,返回:result = \"thrift is OK : " + currentCounter.ToString() + "\"");              return "thrift is OK : " + currentCounter.ToString();          }      }  }
    3.9 主程序Program.cs:
[u]复制代码[/u] 代码如下:
using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using Thrift.Transport;  using Thrift.Protocol;  using Thrift.Server;  using System.Net;  namespace CSharpServer  {      class Program      {          private static HttpListener httpListener = null;          private static THttpHandler httpServer = null;          static void Main(string[] args)          {              string serviceUrl = "http://localhost:99/";              try              {                  UserStorageHandle handle = new UserStorageHandle();                  UserStorage.Processor processor = new UserStorage.Processor(handle);                  TProtocolFactory protocolFactory = new TJSONProtocol.Factory();                  Program.httpServer = new THttpHandler(processor, protocolFactory);                  Program.httpListener = new HttpListener();                  Program.httpListener.Prefixes.Add(serviceUrl);                  Program.httpListener.Start();                  IAsyncResult result = Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null);                  Console.WriteLine("Thrift 服务成功启动,网址是 " + serviceUrl);              }              catch (System.Exception ex)              {                  Console.WriteLine("发生错误:" + ex.Message);                  Console.WriteLine("按回车键退出");                  Console.ReadLine();                  return;              }              Console.WriteLine("若需结束程序,请直接关闭窗口,或按回车。");              Console.ReadLine();          }          public static void WebRequestCallback(IAsyncResult result)          {              if (Program.httpListener == null)              {                  Console.WriteLine("发生错误:HttpListener已经被关闭");                  Console.WriteLine("按回车键退出");                  Console.ReadLine();                  return;              }              HttpListenerContext httpListenerContext = Program.httpListener.EndGetContext(result);              Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null);              Program.httpServer.ProcessRequest(httpListenerContext);          }      }  }
    3.10 按F5,启动CSharpServer项目。     3.11 新开一个VS2012(内存不够的赶快去买),建立一个叫JsProject的C# .net 4.0 Web空工程。     3.12 去jquery官网下载jquery-1.9.1.js(mini版也行,随便)     3.13 把thrift编译的js文件data_types.js与UserStorage.js,thrift库的js库文件(thrift库目录\thrift-0.9.0\lib\js\thrift.js),以及刚下载的jq文件jquery-1.9.1.js,全部拖动到解决方案资源管理器的JsProject项目的根目录下:         data_types.js \ jquery-1.9.1.js \ thrift.js \ UserStorage.js 应该与Web.config在同一级。     3.14 在根目录下创建一个Test.html文件,Test.html 应该与Web.config在同一级:             Test.html:
[u]复制代码[/u] 代码如下:
<!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 type="text/javascript" src="jquery-1.9.1.js"></script>      <script type="text/javascript" src="data_types.js"></script>      <script type="text/javascript" src="thrift.js"></script>      <script type="text/javascript" src="UserStorage.js"></script>      <script>          $(document).ready(function ()          {              var debugPosation = 0;              try              {                  var transport = new Thrift.Transport("http://www.1sucai.cn/");                  var protocol = new Thrift.Protocol(transport);                  var client = new UserStorageClient(protocol);                  var result_GetString = client.GetString();                  var result_Sum = client.Sum(255, 322);              }              catch (e)              {                  alert("出错鸟:" + e.message);              }          });      </script>  </head>  <body>  </body>  </html>
    3.15 给Test.html的 “ var debugPosation = 0; ” 这一行,下断点,然后F5,就可以看到效果了。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部