SignalR – 使用(IUserIdProvider)向特定用户发送消息* NEW 2.0.0 *
在最新版本的Asp.Net SignalR中,增加了一种使用接口“IUserIdProvider”向特定用户发送消息的新方法。
public interface IUserIdProvider { string GetUserId(IRequest request); } public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } }
我的问题是:我如何知道我要向谁发送信息? 这个新方法的解释是很肤浅的。 和SignalR 2.0.0的草案声明,并且不会编译。 有没有人实现这个function?
更多信息: http : //www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
拥抱。
SignalR为每个连接提供ConnectionId。 要find哪个连接属于谁(用户),我们需要在连接和用户之间创build一个映射。 这取决于你在应用程序中如何识别用户。
在SignalR 2.0中,这是通过使用内置的IPrincipal.Identity.Name
来完成的,这是在ASP.NET身份validation期间设置的login用户标识符。
但是,您可能需要使用不同的标识符映射与用户的连接,而不是使用Identity.Name。 为此,这个新的提供者可以和你的自定义实现一起使用,以便将用户与连接映射。
使用IUserIdProvider将SignalR用户映射到连接的示例
让我们假设我们的应用程序使用userId
来标识每个用户。 现在,我们需要发送消息给特定的用户。 我们有userId
和message
,但SignalR还必须知道我们的userId和连接之间的映射关系。
为了实现这一点,首先我们需要创build一个实现IUserIdProvider
的新类:
public class CustomUserIdProvider : IUserIdProvider { public string GetUserId(IRequest request) { // your logic to fetch a user identifier goes here. // for example: var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name); return userId.ToString(); } }
第二步是告诉SignalR使用我们的CustomUserIdProvider
而不是默认的实现。 这可以在初始化集线器configuration时在Startup.cs中完成:
public class Startup { public void Configuration(IAppBuilder app) { var idProvider = new CustomUserIdProvider(); GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider); // Any connection or hub wire up and configuration should go here app.MapSignalR(); } }
现在,您可以使用文档中提到的userId
将消息发送给特定的用户,如:
public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } }
希望这可以帮助。
这是一个开始..打开build议/改进。
服务器
public class ChatHub : Hub { public void SendChatMessage(string who, string message) { string name = Context.User.Identity.Name; Clients.Group(name).addChatMessage(name, message); Clients.Group("2@2.com").addChatMessage(name, message); } public override Task OnConnected() { string name = Context.User.Identity.Name; Groups.Add(Context.ConnectionId, name); return base.OnConnected(); } }
JavaScript的
(请注意, addChatMessage
和sendChatMessage
也是上面的服务器代码中的方法)
$(function () { // Declare a proxy to reference the hub. var chat = $.connection.chatHub; // Create a function that the hub can call to broadcast messages. chat.client.addChatMessage = function (who, message) { // Html encode display name and message. var encodedName = $('<div />').text(who).html(); var encodedMsg = $('<div />').text(message).html(); // Add the message to the page. $('#chat').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.sendChatMessage($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); });
testing
看看SignalRtesting的function。
testing“SendToUser”自动使用通过使用常规的owinauthentication库传递的用户身份。
这种情况是你有一个从多个设备/浏览器连接的用户,你想把消息推送到他所有的活动连接。