利用thrift實現js與C#通訊的執行個體代碼

來源:互聯網
上載者:User

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("http://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,就可以看到效果了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.