asp.net signalR 專題—— 第四篇 模擬RPC模式的Hub操作

一線碼農發表於2016-03-28

  在之前的文章中,我們使用的都是持久連線,但是使用持久連線的話,這種模擬socket的形式使用起來還是很不方便的,比如只有一個唯一的

OnReceived方法來處理業務邏輯,如下圖:

1         protected override Task OnReceived(IRequest request, string connectionId, string data)
2         {
3             return Connection.Broadcast(data);
4         }

 

但是在singlaR體系中並不是這樣,我們還有更加平易近人的一個類似RPC的Hub層,如下圖一樣:

是不是很好奇??? 下面我們來看看這個Hub層怎麼構建。

 

一:新建hub集線器層

    選擇web模板,下面有一個singlaR集線器類的模板,新建即可,在這個模板中有一個示例程式碼,Clients.All.hello() 就是用來呼叫客戶端的hello方法,

而MyHub1中的Hello()用來讓客戶端呼叫,如此這樣來實現雙向通訊,如下圖:

 

二:在Startup中註冊

  其實註冊很簡單,比持久連線還容易,因為持久連線需要一個“類”map一個“url”這樣的模式,而Hub就不需要了,它就是用一個預設的singlar路徑

map整個hub,比如下圖中的提示:

 

三:實現客戶端

    客戶端實現的話,有代理一說和無代理一說,無代理的話,我們自己createProxy,有代理的話就是利用動態生成一個js檔案進行程式設計。

 

1. 無代理模式

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <meta charset="utf-8" />
    <script src="scripts/jquery-1.10.2.js"></script>
    <script src="scripts/jquery.signalR-2.1.2.js"></script>
</head>
<body>
    <script type="text/javascript">
        //無代理
        var conn = $.hubConnection();

        var proxy = conn.createHubProxy("MyHub1");

        //註冊客戶端方法 “hello”
        proxy.on("hello", function (data) {
            console.log("客戶端方法被呼叫");
        });

        conn.start().done(function (data) {

            //呼叫伺服器方法
            proxy.invoke("Hello");

        });
    </script>
</body>
</html>

 

從上面可以看到,invoke方法就是呼叫伺服器方法的操作,比如這裡服務端的Hello方法,js中的on就是用來繫結客戶端方法,讓伺服器呼叫,

然後我們執行一下:

 

2. 有代理模式

  有代理的模式下,需要動態生成一個js,使用方式就是script引用。

<script src="/signalr/js"></script>

 

然後執行程式之後,就有了自動生成的一個js檔案,是不是很神奇~~~

 

有了這個js之後,我們就可以方便的程式設計了,但是有個遺憾點就是,js是在程式執行後才生成的,這樣的話,在程式碼程式設計的時候是無法有這個動態生

成的js檔案,唯一可以做到的就是:先將執行好的js程式碼copy到script資料夾下面,新增引用之後,就可以在vs中程式設計了,如下圖:

好了,有人說這種方式不是很方便,確實不方便,我們也有更高階的用法,那就是使用singlar.utils下面的signlar.exe +vs事件生成,這種模式

可以參考本頁面右上角的微博。

 

好了,就此打住~,繼續忙活了。

 

相關文章