关键字:thrift js javascript C# Csharp webservice
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:
1 service UserStorage 2 { 3 i32 Sum( 1: i32 arg_number1, 2: i32 arg_number2), 4 string GetString() 5 }
3.4 命令行下,用thrift编译器,对它进行编译:
run.bat:
1 thrift-0.9.0.exe –gen csharp data.txt 2 thrift-0.9.0.exe –gen js data.txt 3 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在同一级)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5
6 namespace CSharpServer
7 {
8 public class UserStorageHandle : UserStorage.Iface 9 { 10
11 public UserStorageHandle() 12 { 13 ; 14 } 15
16 public int Sum(int arg_number1, int arg_number2) 17 { 18 int result = arg_number1 + arg_number2; 19 Console.WriteLine(DateTime.Now.ToString() + “ 收到请求:Sum,参数:arg_number1 = “ + arg_number1.ToString() + “,arg_number2 = “ + arg_number2.ToString() + “,返回:result = “ + result.ToString()); 20 return result; 21 } 22
23 private static int Counter = 0; 24
25 public string GetString() 26 { 27 int currentCounter = System.Threading.Interlocked.Increment(ref UserStorageHandle.Counter); 28 Console.WriteLine(DateTime.Now.ToString() + “ 收到请求:GetString,参数:没有,返回:result = \“thrift is OK : “ + currentCounter.ToString() + “\“”); 29 return “thrift is OK : “ + currentCounter.ToString(); 30 } 31
32 } 33 }
3.9 主程序Program.cs:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Thrift.Transport; 6 using Thrift.Protocol; 7 using Thrift.Server; 8 using System.Net; 9
10 namespace CSharpServer 11 { 12 class Program 13 { 14 private static HttpListener httpListener = null; 15 private static THttpHandler httpServer = null; 16
17 static void Main(string[] args) 18 { 19 string serviceUrl = “http://localhost:99/“; 20 try
21 { 22 UserStorageHandle handle = new UserStorageHandle(); 23 UserStorage.Processor processor = new UserStorage.Processor(handle); 24 TProtocolFactory protocolFactory = new TJSONProtocol.Factory(); 25
26 Program.httpServer = new THttpHandler(processor, protocolFactory); 27
28 Program.httpListener = new HttpListener(); 29 Program.httpListener.Prefixes.Add(serviceUrl); 30 Program.httpListener.Start(); 31 IAsyncResult result = Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null); 32 Console.WriteLine(“Thrift 服务成功启动,网址是 “ + serviceUrl); 33 } 34 catch (System.Exception ex) 35 { 36 Console.WriteLine(“发生错误:” + ex.Message); 37 Console.WriteLine(“按回车键退出”); 38 Console.ReadLine(); 39 return; 40 } 41 Console.WriteLine(“若需结束程序,请直接关闭窗口,或按回车。”); 42 Console.ReadLine(); 43 } 44
45 public static void WebRequestCallback(IAsyncResult result) 46 { 47 if (Program.httpListener == null) 48 { 49 Console.WriteLine(“发生错误:HttpListener已经被关闭”); 50 Console.WriteLine(“按回车键退出”); 51 Console.ReadLine(); 52 return; 53 } 54
55 HttpListenerContext httpListenerContext = Program.httpListener.EndGetContext(result); 56
57 Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null); 58
59 Program.httpServer.ProcessRequest(httpListenerContext); 60 } 61
62 } 63 }
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:
1
2 <html xmlns=”http://www.w3.org/1999/xhtml"\>
3
4
5
6 <script type=”text/javascript” src=”jquery-1.9.1.js”>
7 <script type=”text/javascript” src=”data_types.js”>
8 <script type=”text/javascript” src=”thrift.js”>
9 <script type=”text/javascript” src=”UserStorage.js”>
10
11
30
31
32
33