Tag: signalr.client

SignalR hub中的Context为null

我有一个Web窗体应用程序和测试,以查看SignalR如何满足我的要求。 我的中心代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; namespace SignalRTest.Hubs { public class NotificationHub : Hub { public static readonly System.Timers.Timer _Timer = new System.Timers.Timer(); public NotificationHub() { var myInfo = Context.QueryString[“myInfo”]; _Timer.Interval = 2000; _Timer.Elapsed += TimerElapsed; _Timer.Start(); } void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) { Random rnd = new Random(); […]

SignalR和Reactive组合

我找到了关于如何让SignalR和Rx很好地发挥作用的小gem: Rx和Reactive教程 但是,您可能已经注意到这只适用于从服务器 – >客户端进行的操作。 有谁知道如何走另一条路? 我希望我的框架更像是一个基于NServiceBus的“消息”,而不是RPC(信号器标准示例往往是)。 这样做的原因是弱类型的世界不适合RPC。 在服务器端,我希望能够在客户端调用周围放置接口,但我不能,因为客户端可能甚至不是OO并且没有合同和接口的概念。 所以我希望将所有内容都变成基于消息的,中间的代理通过反应式SOA服务。 希望Reactive和DTO将成为我代码中唯一的依赖项。 那么有谁知道如何实现这一目标?

SignalR 2长轮询“协议”请求在未在本地运行时超时

目前我有一个非常健谈的应用程序,需要得到Singleton的支持(参见下面的代码)。 我升级到SignalR 2.0并遵循升级指南,但在将其部署到环境后,有时所有对“协议”的请求都会失败,信号器会中断,当它没有中断时,推送速度非常慢从服务器向客户端发送通知,也许这与使用长轮询有关? 这是我的服务器端代码的样子。 Owin中的配置方法启动类 var hubConfig = new HubConfiguration(); hubConfig.EnableDetailedErrors = true; GlobalHost.DependencyResolver.UseSqlServer(ConfigurationManager.AppSettings[“ConnectionString”].ToString()); app.MapSignalR(hubConfig); 如您所见,我正在使用SQL背板。 这是我的Hub的样子 public class MyHub : Hub { public void JoinGroup(int someId) { Groups.Add(Context.ConnectionId, someId.ToString()); } public void LeaveGroup(int someId) { Groups.Remove(Context.ConnectionId, someId.ToString()); } } 这里要说的另一点是我正在使用群组。 这可能是问题的一部分,我注意到群组似乎让事情变得更慢,好像信号器正在等待群组中的所有用户在推出通知后完成。 我的Singleton看起来像这样。 public class Broadcaster { private readonly static Lazy _instance = new Lazy(() […]

如何在SignalR客户端中使用async / await与hub.On

我有一个与SignalR Hub(服务器)通信的.Net Windows服务(客户端)。 大多数客户端方法都需要时间来完成。 当从服务器接收调用时,我如何(或者我需要)包装目标方法/ hub.On以避免警告: “因为没有等待这个调用,所以当前方法的执行在调用完成之前继续。考虑将await运算符应用于调用的结果” 在客户端上,这是启动/设置代码的示例: IHubProxy _hub string hubUrl = @”http://localhost/”; var connection = new HubConnection(hubUrl, hubParams); _hub = connection.CreateHubProxy(“MyHub”); await connection.Start(); _hub.On(“SendMessageToClient”, i => OnMessageFromServer(i.Id, i.Message)); _hub.On(“SendCommandToClient”, i => OnCommandFromServer(i.Id, i.Command)); 同样在客户端上,这是方法的示例: public static async Task OnMessageFromServer(string Id, string message) { try { var result = await processMessage(message); //long running task […]

SignalR – 发送消息OnConnected

我今天一直在试验SignalR,它真的很整洁。 基本上我想要实现的目标如下: 设备连接后,应立即向第一个设备发送消息。 如果有超过1个连接的设备,我想发送两条消息。 除最后连接的客户端之外的所有人。 并且仅向最后连接的客户端发送一条消息。 当我将它放在自定义API控制器中并且基本上调用动作时,我一直使用的代码非常完美,但这不是我想要的。 一旦设备在OnConnected内连接而没有任何用户交互,我想发送消息,但是当我将我的代码放在OnConnected覆盖内时它停止工作。 它不再发送给特定客户端(首先连接和最后连接)。 我希望有人能够帮助我解决这个问题,因为我现在已经敲了几个小时。 public override System.Threading.Tasks.Task OnConnected() { UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1); int amountOfConnections = UserHandler.ConnectedIds.Count; var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault(); var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections – 1).Select(x => x.Key).ToList(); if (amountOfConnections == 1) { Clients.Client(UserHandler.ConnectedIds.First().Key).hello(“Send to only(also first) one”); } else { Clients.Clients(allExceptLast).hello(“Send to everyone except last”); […]

signalr unity3d连接

我对信号员来说还是个新手。 我使用信号器核心在单位和信号器之间建立连接,但我的代码根本没有返回任何东西。 这让我想知道我的代码是否真的有效。 在我建立连接之后,unity将等待服务器端调用一个函数然后它将执行它需要做的事情。 这是我的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.AspNetCore.SignalR.Client; public class tyrNewSignalR : MonoBehaviour { void Start() { var connection = new HubConnectionBuilder() .WithUrl(“http://api-dev-vrcafe.azurewebsites.net/restart”) .WithConsoleLogger() .Build(); connection.On(“Restart”, data => { Console.WriteLine($”Received: {data}”); // Create unity part // Unity logic Debug.Log(“Connection Success!”); cleanCart(); }); connection.On(“Cart”, data => { Console.WriteLine($”Received: {data}”); // Create […]

使用webAPI承载令牌进行SignalR认证

+我使用这个解决方案使用ASP.NET Web API 2,Owin和Identity实现基于令牌的身份validation……效果非常好。 我使用了这个其他的解决方案 ,这通过将承载令牌传递给连接字符串来实现signalR集线器授权和认证,但看起来要么是承载令牌没有,要么某处出现其他错误,这就是为什么我在这里寻求帮助。 ..这些是我的代码… QueryStringBearerAuthorizeAttribute:这是负责validation的类 using ImpAuth.Entities; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security; using Microsoft.Owin.Security.OAuth; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using System.Web; namespace ImpAuth.Providers { using System.Security.Claims; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; using Microsoft.AspNet.SignalR.Owin; public class QueryStringBearerAuthorizeAttribute : AuthorizeAttribute { public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) { var token […]

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) […]