我已成功使用signalR在ASP.NET MVC3中创建一个简单的聊天应用程序.在我的开发机器上,一切都很棒.
应用程序在具有多个Web服务器的Web场环境中是否以相同的方式工作(例如,上线)?signalR如何跨这些服务器管理其集线器?
谢谢.
我无法弄清楚如何通过WebAPI ApiController调用SignalR集线器.我已经在这里整理了一个样本,可以简化问题并演示问题.
我有一个简单的SignalR集线器,只有两种方法.
[HubName("chat")]
public class ChatHub : Hub
{
public void Join(string room)
{
// NOTE: this is not persisted - ....
Groups.Add(Context.ConnectionId, room);
}
public void Send(string room, string message)
{
var msg = String.Format(
"{0}: {1}", Context.ConnectionId, message);
Clients.Group(room).newMessage(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个非常简单的HTML页面,当DOM准备好时,它连接到聊天中心,如下所示.
<html>
<head>
<title>Simple Chat</title>
<script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.0.0.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
var chat;
//$(function () {
// connectToHubs();
//});
$(connectToHubs);
function connectToHubs() {
$.connection.hub.logging …Run Code Online (Sandbox Code Playgroud) 在下一页:http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection
在底部附近(正好在文本"RegisterHubs.Start"下方),我试图使用Autofac重现一段Ninject代码.
到目前为止,我已经成功地让自己头痛,但没有多少.我已经搜索了Autofac wiki和网络以获得一些帮助.虽然,我相信我可能错过了一些信息.
更新:这是页面上的相关Ninject代码.
public static class RegisterHubs
{
public static void Start()
{
var kernel = new StandardKernel();
var resolver = new NinjectSignalRDependencyResolver(kernel);
kernel.Bind<IStockTicker>()
.To<Microsoft.AspNet.SignalR.StockTicker.StockTicker>()
.InSingletonScope();
kernel.Bind<IHubConnectionContext>().ToMethod(context =>
resolver.Resolve<IConnectionManager>().
GetHubContext<StockTickerHub>().Clients
).WhenInjectedInto<IStockTicker>();
var config = new HubConfiguration()
{
Resolver = resolver
};
App.MapSignalR(config);
}
}
Run Code Online (Sandbox Code Playgroud)
更新2:我还想添加试图编写的对象.
public class StockTickerHub : Hub
{
private readonly IStockTicker _stockTicker;
public StockTickerHub(IStockTicker stockTicker) { }
}
public class StockTicker
{
public StockTicker(IHubConnectionContext clients) { }
}
Run Code Online (Sandbox Code Playgroud) 我已经在signalr向外扩展阅读了大量和收藏似乎是那些中提到: http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr 即以下服务总线: - SQL - Redis - Azure
问题甚至在文中说明:"使用背板,最大消息吞吐量低于客户端直接与单个服务器节点通信时的吞吐量.这是因为背板将每条消息转发到每个节点,因此背板可以成为瓶颈."
我正在创造......等待它......是的!聊天应用程序.我希望能够将其扩展到数百万用户.无论我是否做大(哈!),我都计划逐步记录这个过程.现在我已准备好大部分应用程序,我想知道这个扩展问题.我看了这个非常有用的视频:
http://channel9.msdn.com/Events/Build/2013/3-502
跳到55分钟."自定义横向扩展".以及其他想法,如过滤消息总线.
现在希望你很兴奋,而不是因为无聊而无法自杀...我的想法是做如下: - 每个受欢迎的房间给一个服务器 - 每个房间因此可以轻松应对交通和信号灯可以很好地广播到客户端并将消息日志存储到GROUPS服务器(即每组保存所有组消息) - 然后私人消息需要使用背板或服务器推送 - 因此用户连接将需要更新sql server DB(很容易)和通过ajax而不是signalr发布的数据
但是,我想探索所有选项.(如果你有它们,请发布任何更好的想法)我也想尝试测试REDIS的私人消息.为什么?!!因为如果我希望用户能够拥有私人消息组...并且用户1,2和3都非常烦人并且在服务器1,2和3上.(啊,你很少......!)为了更好虽然性能,我想实现一个Redis消息过滤器,只发送到服务器上的客户端!
那么,我究竟在寻找什么?基本上我需要资源.我找不到任何有用的Redis消息总线示例(asp.net示例没有过滤器.是的,我可以添加AddResolverblabla行!:))
我还需要以下示例: - 服务器到服务器ajax帖子:我是服务器noobie! - 一个负载均衡器示例,用于指定每个聊天室(或只是某个页面)的特定空间 - Redis消息总线可以处理多少条消息?即使使用过滤器,它也很容易变成瓶颈吗?我找不到任何带过滤器的表演的例子
最后我需要你的大脑!;)如果你坐在那里认为有更好的方法,请告诉我.
非常感谢所有读过这篇文章的人,我期待着你们的回复.(如果你发现它有用,请向上投票!有很多论坛有类似的问题,但没有正确的答案)
我正在考虑使用实时消息替换我们公司的监控仪表板.
在我们公司,我们有一个仪表板,显示超过700台物理机的(相当详细的)状态,以及添加的元信息.它大约在1.5年前由我的一位同事在ASP.NET Web Forms(我不喜欢)中构建,以使调度员能够协调我们的技术人员应该去解决问题的位置(这些机器位于不同的地理位置) ).
不幸的是,该应用程序使用30秒的完整页面自动刷新,后面有一个大查询.它很慢,它完全重置你的视图(正如我所说,仪表板包含超过700多台机器).我个人想改变这个.使用起来非常烦人.我们的调度员已经学会了接受这一点,但我认为他们应该得到更好的待遇.
我想在新的仪表板上显示相同的内容,但具有实时更新和"消息"日志.在我们公司,我们在MS堆栈上工作了大约90%,因此我计划使用ASP.NET MVC,SignalR,SQL Server和Knockout.
看看这个简单的图表:
+----+ +----+ +----+ +----+ +----+ +----+ +----+
| PC | | PC | | PC | | PC | | PC | | PC | | PC | ... ...
+--+-+ +--+-+ +-+--+ +--+-+ +--+-+ +--+-+ +--+-+
| | | | | | |
| +--+ +--+ +----+ <-+ <-+ <-+
| | | |
+---v---v-----v-----v+ +-----------------------+
| | TCP/IP | |
| Monitoring Backend +---------> Data …Run Code Online (Sandbox Code Playgroud) 当我使用datetime列过滤器执行查询时
WHERE [Order].CreatedOn >= @CreatedOn
Run Code Online (Sandbox Code Playgroud)
使用a SqlDependency,对数据源的更改将触发SqlDependency.OnChange事件,但SqlDataReader与之关联的SqlCommand不会返回数据(reader.HasRows始终返回false).
当我只是将我的SQL语句中的过滤条件更改为
WHERE [Order].StatusId = 1"
Run Code Online (Sandbox Code Playgroud)
它只是工作正常和SqlDataReader返回数据(reader.HasRows返回true)
码:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace SignalRServer
{
public partial class DepartmentScreen : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var u = System.Security.Principal.WindowsIdentity.GetCurrent().User;
var UserName = u.Translate(Type.GetType("System.Security.Principal.NTAccount")).Value;
CheckForNewOrders(DateTime.Now);
}
private void CheckForNewOrders(DateTime dt) …Run Code Online (Sandbox Code Playgroud) 在我的集线器中,如何获取所有当前连接的connectionId的列表?
从本质上讲,我正在进行一些加密(是的,我已经与一群人交谈,没有任何内置工作)并且Aes每个连接都有一个实例.所以基本上当我需要向所有客户端发送消息时,我不能只做Clients.All,而是必须手动枚举所有客户端,获取其Aes编码器(通过id),然后向其发送消息.
使用.NET Core RC2.有SignalR工作,但试图让它返回JSON中的camelCase属性.
对于我正在使用的API ...
services.AddMvc().AddJsonOptions(o => {
o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
Run Code Online (Sandbox Code Playgroud)
也许SignalR还没有任何用处(毕竟,它甚至不应该工作......),但是想知道是否有人想出来了吗?我尝试了一些像......
services.AddTransient<IContractResolver, CamelCasePropertyNamesContractResolver>();
Run Code Online (Sandbox Code Playgroud)
......但是没有去.
有人这个工作了吗?
我在控制台应用程序和WPF客户端中有一个signalR集线器.在启动时,signalR连接初始化,并应始终保持活动状态.每秒使用当前SystemTime将消息从服务器推送到客户端(这是您可以在带有'SystemTimeUpdateNotification'的日志中看到的)
我现在描述的行为是在Windows7设备上:每隔一段时间我就会看到客户端失去与服务器的连接.由于某种原因,客户端检测到它已处于非活动状态并停止连接.我不知道'自上午4/20/2017 3:04:06 AM'和'超时00:00:50'来自哪里'非活动'.如果我在同一时间检查服务器上的日志,我可以看到没有keepalive消息.
2017-04-20 05:04:04.0728,Trace,Received notification SystemTimeUpdateNotification
2017-04-20 05:04:05.0859,Trace,Received notification SystemTimeUpdateNotification
2017-04-20 05:04:06.0999,Trace,Received notification SystemTimeUpdateNotification
2017-04-20 05:05:13.1020,Trace,Received notification SystemTimeUpdateNotification
2017-04-20 05:05:14.1160,Trace,Received notification SystemTimeUpdateNotification
2017-04-20 05:05:14.5511,Info,The client has been inactive since 4/20/2017 3:04:06 AM and it has exceeded the inactivity timeout of 00:00:50. Stopping the connection.
2017-04-20 05:05:14.5871,Info,SignalR connectionstate changed from 'Connected' to 'Disconnected'
2017-04-20 05:05:14.5871,Trace,Received notification NotificationConnectionStateChanged
2017-04-20 05:05:14.5981,Info,Disconnecting...
2017-04-20 05:05:14.5981,Info,Cancel ongoing operations
2017-04-20 05:05:19.6104,Info,SignalR connectionstate changed from 'Disconnected' to 'Connecting'
2017-04-20 05:05:19.6104,Trace,Received notification NotificationConnectionStateChanged
2017-04-20 05:05:19.6104,Info,Disconnecting... … 我正在尝试在ASP.NET Core 3.0 Blazor(服务器端)应用程序与Azure SignalR服务之间建立连接。最后,我将SignalR客户端(服务)注入到一些Blazor组件中,以便它们可以实时更新我的UI / DOM。
我的问题是,.StartAsync()在集线器连接上调用方法时,我收到以下消息:
响应状态代码不表示成功:404(未找到)。
该文件加载了我对SignalR服务的配置,包括URL,连接字符串,键,方法名称和集线器名称。这些设置在静态类中捕获,SignalRServiceConfiguration并在以后使用。
public static class BootstrapSignalRClient
{
public static IServiceCollection AddSignalRServiceClient(this IServiceCollection services, IConfiguration configuration)
{
SignalRServiceConfiguration signalRServiceConfiguration = new SignalRServiceConfiguration();
configuration.Bind(nameof(SignalRServiceConfiguration), signalRServiceConfiguration);
services.AddSingleton(signalRServiceConfiguration);
services.AddSingleton<ISignalRClient, SignalRClient>();
return services;
}
}
Run Code Online (Sandbox Code Playgroud)
public class SignalRServiceConfiguration
{
public string ConnectionString { get; set; }
public string Url { get; set; }
public string MethodName { get; set; }
public string Key { get; set; }
public string HubName { …Run Code Online (Sandbox Code Playgroud) c# signalr signalr.client asp.net-core-signalr azure-signalr
signalr ×10
c# ×8
asp.net ×2
ajax ×1
asp.net-core ×1
autofac ×1
connection ×1
jquery ×1
json ×1
knockout.js ×1
ninject ×1
real-time ×1
timeout ×1