Tag: signalr hub

在signalr中向特定用户发送消息

我有一个signalR服务器(控制台应用程序)和一个客户端应用程序(Asp.net MVC5) 如何在OAuth成员资格中向特定用户发送消息。 实际上我无法从中心请求上下文中解析发件人用户。 Context.User.Identity.Name 我的中心 public class UserHub : Hub { #region Hub Methods public void LoggedIn(string userName, string uniqueId, string ip) { Clients.All.userLoggedIn(userName, uniqueId, ip); } public void LoggedOut(string userName, string uniqueId, string ip) { var t = ClaimsPrincipal.Current.Identity.Name; Clients.All.userLoggedOut(userName, uniqueId, ip); } public void SendMessage(string sendFromId, string userId, string sendFromName, string userName, […]

如何使AutoFac对每个顶级对象使用相同的嵌套依赖实例? (每个集线器的SignalRdependency injection)

我试图以这种测试通过的方式设置我的AutoFac注册: [Test] public void Autofac_registration_test() { // Given var builder = new ContainerBuilder(); RegisterServices(builder); var container = builder.Build(); // When var firstHub = container.Resolve(); var secondHub = container.Resolve(); // Then firstHub.Should().NotBe(secondHub); firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context); firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context); } 即我想在单个Hub一直使用相同的Context对象,但在创建新Hub时使用不同的Context对象。 RegisterServices目前只是: private void RegisterServices(ContainerBuilder builder) { builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); // How should I scope this? } 哪个在firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context);失败了firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context); 因为Context是临时范围的。 但是每个生命周期的范围上下文也会失败,这次是在firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context); […]

SignalR – 检查用户是否仍然连接

我有一个方法集线器,称为客户端。 此方法启动一个带有委托的计时器,该委托每10秒运行一次。 由于如果没有人连接到集线器,继续运行此委托是没有意义的,我想在重新计划之前检查是否有任何用户仍然从委托内部连接。 有没有办法做到这一点?

如何从外部调用SignalR集线器方法?

这是我的Hub代码: public class Pusher : Hub, IPusher { readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext(); public virtual Task PushToOtherInGroup(dynamic group, dynamic data) { return _hubContext.Clients.Group(group).GetData(data); } } 我希望使用以下代码在另一个项目中调用此方法: var pusher = new Pusher.Pusher(); pusher.PushToOtherInGroup(“Test”, new {exchangeTypeId, price}); 我想调用PushToOtherInGroup ,在调用方法时我没有得到任何错误。但是推送器不起作用。 这是我的Ui代码: $(function() { hub = $.connection.pusher; $.connection.hub.start() .done(function() { hub.server.subscribe(‘newPrice’); console.log(‘Now connected, connection ID=’ + $.connection.hub.id); }) .fail(function() […]

signalR – 获取用户名

我正在使用signalr和asp.net MVC3来构建示例聊天应用程序。 这是我的信号器中心的样子 public class MyHub:Hub,IDisconnect { public Task Join() { string username = HttpContext.Current.User.Identity.Name; //find group based on username string group = getGroup(username) return Groups.Add(Context.ConnectionId, group); } public void doStuff() { string group = getGroup(); Clients[group].doStuffOnBrowser(); } } 我的问题是我的应用程序在页面加载时崩溃了。 在使用调试器时,我发现即使用户已经过身份validation,HttpContext.Current.User.Identity.Name仍为null。 如何在Task Join()方法中获取用户名?

SignalR – 从集线器外部通过另一个项目中的集线器进行广播

我的解决方案中有两个项目: 项目1:“SignalRChat”(MVC) – 工作正常 项目2:“DatabaseWatcherService”Windows服务 – 工作正常 我正试图从我的Windows服务中调用SignalRChat Hub,但它似乎没有工作。 这是我通过Windows服务调用我的Hub的地方( https://github.com/SignalR/SignalR/wiki/Hubs#broadcasting-over-a-hub-from-outside-of-a-hub ): void PerformTimerOperation(object sender, EventArgs e) { eventLog1.WriteEntry(“Timer ticked…”); var message = “test”; var context = GlobalHost.ConnectionManager.GetHubContext(); context.Clients.All.addNewMessageToPage(message); } 尝试连接时出现以下错误: 消息=远程服务器返回错误:(500)内部服务器错误。 我正在尝试通过var connection = new HubConnection(“http://localhost:2129”); 端口2129是我运行的MVC项目。

如何使用SignalR Hub将消息从服​​务器发送到客户端

我刚刚开始探索signalR,我希望能够从服务器向所有客户端发送消息。 这是我的中心 using System; using System.Collections.Generic; using System.Linq; using System.Web; using SignalR; using SignalR.Hubs; using SignalR.Hosting.Common; using SignalR.Hosting.AspNet; using System.Threading.Tasks; namespace MvcApplication1 { public class Chat : Hub { public void Send(String message) { // Call the addMessage methods on all clients Clients.addMessage(message); } } } 这是我的客户页面 $(function () { //Proxy created on the fly […]

SignalR OnDisconnected – 为聊天室处理“用户在线”的可靠方式?

我正在实施一个聊天室。 到目前为止,这么好 – 用户可以通过JS客户端从他们的浏览器发送消息,我可以使用C#客户端做同样的事情 – 这些消息被广播给其他用户。 现在,我正在尝试实施“在线用户”。 我的方法如下: OnConnected – 将数据库中的用户更新为IsOnline = true OnDisconnected – 如果用户没有任何其他连接,请将db中的用户更新为IsOnline = false 我正在将状态存储在数据库中,因为我必须在数据库中查询用户缩略图 – 这似乎是在集线器中使用字典的简单替代方法。 我遇到的问题是OnDisconnected并不总是为每个客户端ID调用 – 过时的连接阻止“如果用户没有任何其他连接”位解析为true,那么用户总是“线上”。 我能想到的一个hacky解决方案是在OnDisconnect上始终将用户设置为脱机 – 但这意味着如果用户打开两个选项卡并关闭一个选项卡,它们将“脱机”。 然后,我可以将用户重新设置为联机以获取发送的每条消息,但这似乎完全浪费了处理周期,并且仍然留下了一段时间,当用户真正在线时,用户被视为离线。 我相信如果有办法保证为每个客户端调用OnDisconnected,这个问题就会消失。 好像我让客户端打开很长时间(> 10分钟)然后断开连接, OnDisconnected永远不会被调用。 我会尽力确定repro步骤并保持更新。 那么 – 这是处理在线状态的有效方法吗? 如果是这样,还有什么方法可以确保OnDisconnected最终为每个连接触发? 这个问题让我担心,因为现有的Connections会随着时间的推移而继续增长,如果我没有弄错的话,最终由于未处理的状态连接而溢出。 码: 我正在使用内存中的分组方法。 发送消息(C#): private readonly static ConnectionMapping _chatConnections = new ConnectionMapping(); public void SendChatMessage(string key, ChatMessageViewModel message) […]

使用SignalR和IProgress接口的进度报告

我有一个Hub类,它有一个长时间运行的方法,我需要在它工作时显示一个进度条。 我读过这篇文章 ,我认为可以在异步方法中使用IProgress接口来发送长时间运行的操作状态。 我写了一个像这样的方法: public async Task GetServerTime(IProgress prog) { await Task.Run(() => { for (int i = 0; i < 10; i++) { prog.Report(i * 10); System.Threading.Thread.Sleep(200); } }); return DateTime.Now.ToString(); } 我尝试调用这样的方法: var appHub = $.connection.appHub; $.connection.hub.start(); appHub.server.getServerTime() .done(function (time) { alert(time); }); 但我不知道如何获得进度报告。

Signalr / Hub未在IIS 7中加载,但在Visual Studio中正常工作

我正在使用SignalR的Asp .Net 4.0框架上的Web应用程序,从Nuget包安装它。 当我调试或运行应用程序而不在本地调试时,它可以正常工作。 但是,当它部署到生产服务器时,它无法找到动态注入httphandlers的signal/hubs文件。 由于它的动态特性,它必须在运行中创建,所以我不能只将工作文件复制到项目中。 我尝试了以下加载文件的方法: 并在代码背后: ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference(“~/signalr/hubs”)); 所有这些都在本地工作,但不在服务器上。 在html中呈现的路径看起来是正确的,但那里没有文件,提供404错误。 如果重要,则服务器已将应用程序设置为完全信任,并且该应用程序将作为IIS中使用子域的另一个站点下的应用程序运行。