使用MVC4向特定客户端发送SignalR推送通知

10K35H 5H4KY4

我正在尝试将SignalR与MVC4 c#项目一起使用,以仅将推送通知发送给选定的客户端。为此,我通过将“ Context.ConnectionId”存储在c#静态变量中使用“ context.Clients.Client”(因为无法使用与signalr的会话)。但是由于“ contextConnectionId”是静态变量,因此,该消息仍被广播到所有客户端:(

除了使用信号进行会话之外,还有其他替代方法吗?(找不到相关文章,但没有具体答案)

代码如下:

Java脚本

 $(document).ready(function (){
 {
    var chat = $.connection.PushNotify;
    chat.client.addNewMessageToPage = function (type, message) {
        if(type == "something")
        {
            alert(message);
        }
    }
    // Start the connection.
    $.connection.hub.start().done(function () {
        chat.server.send($('').val(), $('').val());
    });
 )}

在C#HUB中

[HubName("PushNotify")]
public class PushNotify : Hub
{
    public void Send(string name, string message)
    {
        //assume its c# static variable
        GlobalVariable.contextConnectionId = Context.ConnectionId;
    }
}
public class PushNotification
{
    public void SendMessage(string message, string type = "msg")
    {
        if (!string.IsNullOrEmpty(GlobalVariable.contextConnectionId))
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<PushNotify>();
            context.Clients.Client(GlobalVariable.contextConnectionId).addNewMessageToPage(type, message);
        }

    }
}

我认为您的示例不会按预期工作。当您将连接映射到静态变量时,实际上会将您的静态变量覆盖到最后一个称为Send方法的连接。

连接到集线器的每个客户端都传递一个唯一的连接ID。您可以在中心上下文的Context.ConnectionId属性中检索此值。

这意味着您GlobalVariable.contextConnectionId不能是一个简单的字符串。您必须以某种方式映射您的客户端,并且每个客户端都将具有唯一的连接ID。也许这里一个字典就足够了,或者包含更多信息的自己的类。(即浏览器信息,IP加法器...)

(引自此链接)这将为您提供帮助:http : //www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

编辑

提供更多信息:

我相信最简单的解决方案是使用组。http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups

您的中心类将包含一种加入组的方法:

public Task JoinGroup(string groupName)
{
    return Groups.Add(Context.ConnectionId, groupName);
}

public Task LeaveGroup(string groupName)
{
    return Groups.Remove(Context.ConnectionId, groupName);
}

并说一个PostMessage要分组,它仅发送到给定的分组:

public void SendMessage(string groupName, string message, string type = "msg")
{
    var context = GlobalHost.ConnectionManager.GetHubContext<PushNotify>();
    context.Clients.Group(groupName).addNewMessageToPage(type, message);
}

当您的客户加入时,他们可以连接到一个群组,其他所有内容都将由SignalR处理。

从客户加入群组并发布消息:

var chat = $.connection.PushNotify;
$.connection.hub.start().done(function () {
    chat.server.joinGroup("Group1");
    chat.server.sendMessage("Group1", "Hi There");
});

接收消息是一样的

chat.client.addNewMessageToPage = function (type, message) {
   ...
}

其他解决方案

另一个解决方案可能是使用您自己的映射或SignalR Connection映射。这些解决方案需要覆盖OnConnected和OnDisconnected方法并映射您的连接。即:

private readonly static ConnectionMapping<string> _connections = 
        new ConnectionMapping<string>();

public override Task OnConnected()
{
    string name = Context.User.Identity.Name;
    _connections.Add(name, Context.ConnectionId);
    return base.OnConnected();
}

public override Task OnDisconnected(bool stopCalled)
{
    string name = Context.User.Identity.Name;
    _connections.Remove(name, Context.ConnectionId);
    return base.OnDisconnected(stopCalled);
}

public void SendChatMessage(string who, string message)
{
    string name = Context.User.Identity.Name;
    foreach (var connectionId in _connections.GetConnections(who))
    {
        Clients.Client(connectionId).addChatMessage(name + ": " + message);
    }
}

像本例一样:http : //www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

向客户端推送/发送MySQL更改

FCM从服务器向特定设备发送通知,而无需修改客户端代码

每秒通过C#使用signalR向客户端发送消息

使用发布-订阅模式通过SignalR向客户端发送更新

在Node.JS中向客户端发送通知

使用SignalR从长期运行的过程推送到客户端

使用SignalR将数据推送到客户端

Laravel API - 使用 Firebase FCM 向 Android 和 iOS 客户端应用发送通知

使用ZeroMQ向特定客户端发送回复并在客户端断开连接时排队

Flask websocket 向特定客户端发送消息

如何使用socket.io向特定客户端发送消息

如何使用Faye Websockets向特定客户端发送消息?

将Signalr与Web API集成以将通知推送到客户端

使用Java中的JButton向客户端发送消息

使用Web套接字向客户端发送消息

使用 Ajax 调用从 NodeJS 向客户端发送数据

使用 FLASK 向所有客户端发送响应

使用Java的akka websocket,计算客户端数量,向客户端发送消息

如何使用SignalR与特定客户端通信?

向Delphi的Kinvey发送推送通知给客户?

SignalR Core如何每n秒向客户端发送消息

在ASP.NET Core SignalR中,如何从服务器向客户端发送消息?

SIgnalR:如何在连接时向客户端发送异常?

如何在NET Core 2.0的SignalR alpha上向所有客户端发送消息

在SignalR中向断开连接的客户端发送消息时发生异常

解析推送通知是从服务器发送的,但客户端未接收到

Firebase 函数:通过 FCM 发送的推送通知的客户端网络套接字断开错误

SignalR客户端特定于angularjs

凤凰频道:向特定客户发送推送