1

我希望能够向特定客户端发送消息,我有工作代码,但我找不到识别用户的方法,因为在每个页面加载/刷新时客户端 ID 都会改变,所以我不能依赖它。我试图将查询字符串附加到连接,但我只能找到相同上下文的查询字符串。

这是我的集线器,在发送方法中,我希望能够在发送消息时将发送到特定连接 id 的 id 匹配:

public class Chat : Hub
{
    public string addMsg()
    {
        return "";
    }

    public void Send(string message, string id)
    {

        Clients.Client(Context.ConnectionId).receiveMessage(message);
    }
}

这是我的客户端代码,我想将要发送消息的人的 id 传递给服务器发送方法,并使用其他连接用户的查询字符串值将其与我发送的 id 匹配。

var chat = $.connection.chat;

chat.client.receiveMessage = function (message) {
  alert("Received from server: " + message);
};

chat.addMsg = function (message) {

};

$("#sendMessage").click(function () {
  chat.server.send($('#newMessage').val(), 6);
});

$.connection.hub.qs = "id=1";

$.connection.hub.start().done(function () {
  var myClientId = $.connection.hub.id;
  var qs = $.connection.hub.qs;
});

我希望我的问题是有道理的,我已经尝试破解这个问题一段时间了,下面是一些链接到我用来到达我现在所在位置的一些文章,我只是错过了最后一块拼图,请对我放轻松:)

http://weblogs.asp.net/davidfowler/archive/2012/11/11/microsoft-asp-net-signalr.aspx

SignalR-向特定客户端发送数据

https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs

4

2 回答 2

3

我不认为这会按照你想要的方式工作。连接 ID 就是这样 - 特定连接的标识符。SignalR 本身对用户身份验证一无所知。然而,它是建立在 ASP.NET 之上的,所有您熟悉的身份验证方法(Windows、Forms 等)都可以按您的预期工作。

一旦 ASP.NET 对用户进行了身份验证,您就可以在集线器中以Context.User. 现在由您负责维护此用户与一个或多个连接 ID 之间的映射。除了浏览器刷新之外,您可能还需要处理从多个浏览器或机器访问您的服务的用户。向该用户发送消息意味着将其发送到所有这些浏览器和机器。

Jabbr做到了这一切,甚至更多。您确实应该查看该代码以找到实现此功能的好方法。

于 2012-11-24T18:05:55.137 回答
0

如何在集线器中使用 Clients.Caller 对象,并覆盖 OnConnected 方法:

public override Task OnConnected()
{
    Clients.Caller.sendInitMessage(...);
    return base.OnConnected();
}
于 2013-12-10T15:14:55.970 回答