SignalR主动通知订阅者示例
html代码:
<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script> <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script> <script> $(function () { var hub = $.connection.payHub; hub.client.waitNotify = function (tran, url) { console.log("waitNotify:" + tran + " " + url); if (tran) { location.href = url; } }; $.connection.hub.start().done(function () { console.log("hub done"); }); }) </script>
hub代码:
[HubName("payHub"), Authorize] public class payHub : Hub { public static Dictionary<Guid, string> userPayHub = new Dictionary<Guid, string>(); public static void Notify(Guid userId, string redirectUrl) { if (userPayHub.ContainsKey(userId)) { Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<Hubs.payHub>() .Clients.Client(Hubs.payHub.userPayHub[userId]) .waitNotify(true, redirectUrl); } } public override Task OnConnected() { var uid = this.Context.User.Identity.GetUserId(); userPayHub[uid] = this.Context.ConnectionId; return base.OnConnected(); } public override Task OnDisconnected(bool stopCalled) { var uid = this.Context.User.Identity.GetUserId(); userPayHub.Remove(uid); return base.OnDisconnected(stopCalled); } public override Task OnReconnected() { var uid = this.Context.User.Identity.GetUserId(); userPayHub.Remove(uid); return base.OnReconnected(); } }
通知调用Notify方法即可。
关键点:GlobalHost.ConnectionManager.GetHubContext