【SignalR學習系列】7. SignalR Hubs Api 詳解(JavaScript 客戶端)

来源:http://www.cnblogs.com/Soulless/archive/2017/07/26/7239753.html
-Advertisement-
Play Games

SignalR 的 generated proxy 服務端 JavaScript 客戶端 generated proxy 非 generated proxy 什麼時候使用 generated proxy 如果你要給客戶端的方法註冊多個事件處理器,那麼你就不能使用 generated proxy。如果 ...


SignalR 的 generated proxy

服務端

public class ContosoChatHub : Hub
{
    public void NewContosoChatMessage(string name, string message)
    {
        Clients.All.addContosoChatMessageToPage(name, message);
    }
}

JavaScript 客戶端

generated proxy

var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (name, message) {
    console.log(name + ' ' + message);
};
$.connection.hub.start().done(function () {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
         contosoChatHubProxy.server.newContosoChatMessage($('#displayname').val(), $('#message').val());
         $('#message').val('').focus();
     });
});

非 generated proxy

var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(name, message) {
    console.log(name + ' ' + message);
});
connection.start().done(function() {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.invoke('newContosoChatMessage', $('#displayname').val(), $('#message').val());
        $('#message').val('').focus();
                });
    })

 

什麼時候使用 generated proxy

如果你要給客戶端的方法註冊多個事件處理器,那麼你就不能使用 generated proxy。如果你不使用 generated proxy ,那麼你就不能引用 "signalr/hubs" URL。

 

客戶端設置

首先需要引用jQuery,SignalR,signalr/hubs

<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.0.min.js"></script>
<script src="signalr/hubs"></script>

 

如何引用動態的 generated proxy

ASP.NET MVC 4 or 5 Razor 

<script src="~/signalr/hubs"></script>

ASP.NET MVC 3 Razor 

<script src="@Url.Content("~/signalr/hubs")"></script>

ASP.NET Web Forms 

<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>

/signalr/hubs 是 SignalR 自動生成的,當你啟動調試的時候會在Script Documents 看到它

 

建立一個連接

建立一個連接 (generated proxy方式)

var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (name, message) {
    console.log(userName + ' ' + message);
};
$.connection.hub.start()
    .done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
    .fail(function(){ console.log('Could not Connect!'); });

建立一個連接 (非 generated proxy方式)

var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(userName, message) {
    console.log(userName + ' ' + message);
});
connection.start()
    .done(function(){ console.log('Now connected, connection ID=' + connection.id); })
    .fail(function(){ console.log('Could not connect'); });

$.connection.hub 和 $.hubConnection() 創建的對象是一樣的。

 

start 方法的非同步執行

start 方法是非同步執行的,它返回一個  jQuery Deferred 對象,你可以給 pipe, done, and fail 添加回調函數。

當你直接把  "Now connected" 代碼放在 start 方法後面,而不是放在 .done 的回調函數里,那麼 console.log 會在連接前就執行。

 

怎麼開啟跨域連接

首先需要安裝 Microsoft.Owin.Cors ,然後使用 Map 和 RunSignalR 代替 MapSignalR,跨域中間件只會在需要跨域的 SignalR 請求里執行。

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;
namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Branch the pipeline here for requests that start with "/signalr"
            app.Map("/signalr", map =>
            {
                // Setup the CORS middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration 
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };
                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

 

如何處理連接的生命周期事件

SignalR 提供了下述你可以捕獲的生命周期事件。

  • starting: 在任何數據發送之前執行。
  • received: 當任何數據通過連接獲取到的時候執行。可以得到數據。
  • connectionSlow: 當客戶端檢測到緩慢或者不流暢的連接的時候執行。 
  • reconnecting: 當潛在的協議重新開始連接的時候執行。 
  • reconnected: 當潛在的協議以及重新建立連接的時候執行。
  • stateChanged: 當連接的狀態發生改變的時候執行。可以提供一個舊的和新的狀態(Connecting, Connected, Reconnecting, 或者 Disconnected)。
  • disconnected: 當連接中斷以後執行。

捕獲 connectionSlow 事件 (generated proxy方式)

$.connection.hub.connectionSlow(function () {
    console.log('We are currently experiencing difficulties with the connection.')
});

捕獲 connectionSlow 事件 (非generated proxy方式)

var connection = $.hubConnection();
connection.connectionSlow(function () {
    console.log('We are currently experiencing difficulties with the connection.')
});

 

如何捕獲和處理異常

如果你不在服務端明確地打開詳細錯誤信息,那麼SignalR只會列出一些簡單的錯誤信息,你可以通過下麵的代碼開啟詳細錯誤信息記錄。

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
app.MapSignalR(hubConfiguration);

給錯誤事件添加一個捕獲方法

generated proxy 方式

$.connection.hub.error(function (error) {
    console.log('SignalR error: ' + error)
});

非 generated proxy 方式

var connection = $.hubConnection();
connection.error(function (error) {
    console.log('SignalR error: ' + error)
});

方法調用的時候捕獲異常

generated proxy 方式

contosoChatHubProxy.newContosoChatMessage(userName, message)
    .fail(function(error) { 
        console.log( 'newContosoChatMessage error: ' + error) 
    });

非 generated proxy 方式

contosoChatHubProxy.invoke('newContosoChatMessage', userName, message)
    .fail(function(error) { 
        console.log( 'newContosoChatMessage error: ' + error) 
    });

 

開啟客戶端日誌記錄

generated proxy 方式

$.connection.hub.logging = true;
$.connection.hub.start();

非 generated proxy 方式

var connection = $.hubConnection();
connection.logging = true;
connection.start();

 

參考鏈接:

https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MiniProfiler ,一個簡單而有效的迷你剖析器,可以有效的實時監控頁面。通過直接引用、Ajax、Iframe形式訪問的其它頁面進行監控,監控內容包括資料庫內容,並可以顯示資料庫訪問的SQL。 1.安裝 首先新建一個 asp.net mvc 項目 右鍵項目,管理NuGet程式包。 安裝 Min ...
  • 前言 很多同學可能對於CAP這個項目想有更一步的瞭解,包括她的工作原理以及適用的場景,所以博主就準備了一場直播給大家講解了一下,這個視頻是直播的一個錄像。 由於我這次直播本來是沒有打算對外的,所以也是沒有怎麼準備的,所以在直播的過程中出現了一些講解不到位或者是意外的情況,還請大家能夠諒解~。 最後, ...
  • 背水一戰 Windows 10 之 控制項(媒體類): InkCanvas 塗鴉編輯 ...
  • ASP.NET MVC ,一個適用於WEB應用程式的經典模型 model-view-controller 模式。相對於web forms一個單一的整塊,asp.net mvc是由連接在一起的各種代碼層所組成。 最近又接觸了關於asp.net mvc的項目,又重拾以前的記憶,感覺忘了好多,特此記錄。 ...
  • 建立一個 SignalR 連接 配置 SignalR 連接 在 WPF 客戶端里設置連接的最大值 設置 Query String 參數 讀取 query string 指定傳輸協議 可以指定以下四種方式 LongPollingTransport ServerSentEventsTransport W ...
  • 心得體會:沒事谷歌谷歌 ...
  • 如何將鍵盤快捷方式映射到自定義按鈕,怎麼使用快捷鍵啟動自己創建的菜單,剛開始做的時候迷糊了,找了很久。可能也是因為剛開始做不是很明白,後面慢慢就懂了。其實非常簡單的。 很多快捷鍵已經在Visual studio中使用的,在確定快捷鍵之前驗證下你想設置的快捷鍵是否可以使用,當然是不可以重覆啦,是吧。 ...
  • 每個控制項都有自己預設的模板,這是MS本身就編寫好的,如果我們能夠得到這些模板的XAML代碼,那麼它將是學習模板的最好的示例,要想獲得某個控制項ctrl的預設模板,請調用以下方法: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...