利用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:
service userstorage
{
i32 sum( 1: i32 arg_number1, 2: i32 arg_number2),
string getstring()
}
3.4 命令行下,用thrift编译器,对它进行编译:
run.bat:
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在同一级)
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:
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:
<!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("//www.jb51.net/");
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,就可以看到效果了。