Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVC4向特定客户端发送信号器推送通知_C#_Asp.net Mvc 4_Signalr - Fatal编程技术网

C# 使用MVC4向特定客户端发送信号器推送通知

C# 使用MVC4向特定客户端发送信号器推送通知,c#,asp.net-mvc-4,signalr,C#,Asp.net Mvc 4,Signalr,我正在尝试将SignalR与MVC4 c#项目一起使用,以便仅向选定的客户端发送推送通知。 为此,我使用“context.Clients.Client”,方法是将“context.ConnectionId”存储在c#静态变量{中,因为无法使用与signal}的会话。 但由于“contextConnectionId”是一个静态变量;该消息仍向所有客户端广播:( 除了使用信号会话或任何其他优雅的方式,还有其他选择吗?(找到的相关帖子很少,但没有具体的答案) 代码如下: javaScript $(d

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

除了使用信号会话或任何其他优雅的方式,还有其他选择吗?(找到的相关帖子很少,但没有具体的答案)

代码如下:

javaScript

 $(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”)]
公共类:集线器
{
公共无效发送(字符串名称、字符串消息)
{
//假设它的c#静态变量
GlobalVariable.contextConnectionId=Context.ConnectionId;
}
}
公共类推送通知
{
公共无效发送消息(字符串消息,字符串类型=“msg”)
{
如果(!string.IsNullOrEmpty(GlobalVariable.contextConnectionId))
{
var context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.Client(GlobalVariable.contextConnectionId).addNewMessageToPage(类型,消息);
}
}
}

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

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

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

(引用自此链接)这将帮助您:

编辑

提供更多信息:

我相信你的问题最简单的解决方法就是分组

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

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

public Task LeaveGroup(string groupName)
{
    return Groups.Remove(Context.ConnectionId, groupName);
}
让我们假设一个只发送给给定组的PostMessage to group:

public void SendMessage(string groupName, string message, string type = "msg")
{
    var context = GlobalHost.ConnectionManager.GetHubContext<PushNotify>();
    context.Clients.Group(groupName).addNewMessageToPage(type, message);
}
接收消息是一样的

chat.client.addNewMessageToPage = function (type, message) {
   ...
}
其他解决方案

另一种解决方案可以使用您自己的映射或信号器连接映射。这些解决方案需要覆盖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);
    }
}
专用只读静态连接映射\u连接=
新连接映射();
已连接的公用覆盖任务()
{
字符串名称=Context.User.Identity.name;
_connections.Add(name,Context.ConnectionId);
返回base.OnConnected();
}
公共覆盖任务OnDisconnected(bool stopCalled)
{
字符串名称=Context.User.Identity.name;
_删除(名称、上下文、连接ID);
返回基.OnDisconnected(stopCalled);
}
public void SendChatMessage(字符串who,字符串message)
{
字符串名称=Context.User.Identity.name;
foreach(在_connections.GetConnections(who)中的var connectionId)
{
Clients.Client(connectionId).addChatMessage(name+“:”+message);
}
}

如本例所示:

我认为您可以使用group。这可能也值得一看:@D Dan:您能否举例说明在这种情况下如何使用字典。关于第一个(group)版本:客户端调用LeaveGroup的位置/时间?例如,如果我有一个查找项目类型(车辆、用户…)的地图,这些类型来自提要(SignalR)通过他们的特定组。如果我过滤掉UI上的车辆,我可能会保留车辆组更新,因为我甚至不再显示它们,我不需要最新数据,这将是不必要的流量。上下文。用户为空为什么?
chat.client.addNewMessageToPage = function (type, message) {
   ...
}
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);
    }
}