【SignalR学习系列】7. SignalR Hubs Api 详解(JavaScript 客户端)

转自:https://www.cnblogs.com/Soulless/p/7239753.html

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的SignalR示例,其中客户端将接收服务器发送的消息,并在网页上显示它们。 服务器端: ```csharp using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRChat.Hubs { public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } } ``` 客户端: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>SignalR Chat Example</title> </head> <body> <input type="text" id="userInput" placeholder="Enter your name" /> <input type="text" id="messageInput" placeholder="Enter your message" /> <button id="sendButton">Send</button> <ul id="messagesList"></ul> <!-- SignalR JavaScript library --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.8/signalr.min.js"></script> <script> // create connection instance const connection = new signalR.HubConnectionBuilder() .withUrl("/chatHub") .configureLogging(signalR.LogLevel.Information) .build(); // start connection connection.start().catch(err => console.error(err.toString())); // send message to server document.getElementById("sendButton").addEventListener("click", event => { const user = document.getElementById("userInput").value; const message = document.getElementById("messageInput").value; connection.invoke("SendMessage", user, message).catch(err => console.error(err.toString())); event.preventDefault(); }); // receive message from server connection.on("ReceiveMessage", (user, message) => { const li = document.createElement("li"); li.textContent = `${user}: ${message}`; document.getElementById("messagesList").appendChild(li); }); </script> </body> </html> ``` 在此示例中,我们创建了一个名为“ChatHub”的SignalR集线器,它具有一个名为“SendMessage”的方法,该方法将消息广播给所有连接的客户端。在客户端,我们首先创建一个连接实例,然后启动它并使用它调用“SendMessage”方法以将消息发送到服务器。我们还订阅了名为“ReceiveMessage”的事件,以便在从服务器接收消息时更新网页上的消息列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值