我有一个Azure托管的Web应用程序,它与一些辅助角色的实例一起工作.目前,Web应用程序通过将消息放入Azure队列中以供工作人员接收,将工作传递给这些工作人员.工作人员通过将消息放入"反馈"队列来传递状态和进度消息.目前,为了通知我的浏览器客户端进度,我在浏览器中将基于ajax的定期轮询调用转换为MVC控制器方法,该方法依次读取Azure'反馈'队列并将这些消息作为json返回给浏览器.
显然,SignalR对于这种笨拙的轮询/排队方法看起来是一个非常有吸引力的替代方案,但是当我们讨论需要发送的多个工作者角色(而不是Web角色)时,我发现很少有关于如何执行此操作的指导个人或所有客户的身份.
该SignalR.WindowsAzureServiceBus 由克莱门斯vasters看起来极好,但留下一个有点高,干燥末即一个很好的例子,解决缺乏.
补充评论:从我的阅读到目前为止,似乎没有可能通过SignalR方法从工作者角色(而不是Web角色)到浏览器客户端的直接通信.工作人员似乎必须使用队列与Web角色进行通信.这反过来会强制轮询方法,即必须轮询来自工作者角色的消息的队列 - 这种轮询必须从它出现的浏览器中发起(从中驱动)(如何在Web角色中设置轮询循环?)
总之,即使使用 Clemens Vasters的SignalR.WindowsAzureServiceBus扩展方法,SignalR也无法处理从工作者角色到浏览器的直接通信.
任何来自专家的意见将不胜感激.
我想将文件从客户端上传到服务器.有没有办法用SignalR上传文件,还是我需要一个控制器?
我刚刚开始测试SignalR以监控应用程序.我有一个控制器,可以通过客户端调用Hub.我注意到,每次客户端使Connection.Hub.Start()在服务器中创建一个新的Hub实例时,我需要一直刷新我的控件,所以我不希望它为每个实例创建新的Hub.
有没有办法为所有客户创建单个集线器,或者我错过了什么?
有没有一种从控制器调用SignalR hub中的方法的好方法?
现在我有这个:
public class StatsHub : Hub
{
private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub());
public static StatsHub Instance { get { return instance.Value; } }
public StatsHub()
{
if (this.Clients == null)
{
var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>();
this.Clients = hubContext.Clients;
this.Groups = hubContext.Groups;
}
}
// methods here...
}
Run Code Online (Sandbox Code Playgroud)
所以在我的控制器动作中,我可以说,例如
StatsHub.Instance.SendMessage("blah");
Run Code Online (Sandbox Code Playgroud)
它几乎是好的,除了hubContext没有Hub的Caller或Context属性 - 这很好.
希望有更好的方法吗?
将Python与SignalR集成有哪些选择?
Python代码是大型第三方产品的一部分,而不是语言偏好.SignalR服务器提供对现有.NET产品的订阅.
我们想在Python中重用.NET SignalR服务器.
我有一个带有简单HTML页面的ASP.NET Web应用程序和一些通过SignalR进行通信的JavaScript.这很好.现在我试图从另一个项目(在同一个解决方案中)调用Hub上的方法,并使用.NET Signalr Client Api:
var connection = new HubConnection("http://localhost:32986/");
var hub = connection.CreateHubProxy("MessageHub");
connection.Start();
hub.Invoke("SendMessage", "", "");
Run Code Online (Sandbox Code Playgroud)
最后一行导致InvalidOperationException: The connection has not been established.但我可以从我的JavaScript代码连接到集线器.
如何使用C#代码连接到Hub?
UPDATE
写完这篇文章后的那一刻,我试着添加.Wait()并且它有效!所以这将做:
var connection = new HubConnection("http://localhost:32986/");
var hub = connection.CreateHubProxy("MessageHub");
connection.Start().Wait();
hub.Invoke("SendMessage", "", "");
Run Code Online (Sandbox Code Playgroud) 我希望能够对现有SignalR集线器上的方法签名,名称等进行更改.是否有针对SignalR集线器版本化的定义策略,以便旧的JS代码可以继续工作,而无需为新调用创建新的新命名集线器?
我似乎无法让SignalR 3在从Beta8升级的ASP .Net 5 RC-1上工作.我为SignalR尝试了最新的RC1包,但遇到了以下问题.我试过这个"Microsoft.AspNet.SignalR.Server": "3.0.0-rc1-15810"包
services.AddSignalR();
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
"IServiceCollection"类型在未引用的程序集中定义.您必须添加对程序集"Microsoft.Extensions.DependencyInjection.Abstractions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"的引用.
和 app.UseSignalR();
导致这一个:
"IApplicationBuilder"类型在未引用的程序集中定义.您必须添加对程序集"Microsoft.AspNet.Http.Abstractions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"的引用.
当我切换到"Microsoft.AspNet.SignalR.Server": "3.0.0-rc2-15909"包时,我收到运行时错误:
mscorlib.dll中出现"System.TypeLoadException"类型的异常,但未在用户代码中处理
附加信息:无法从程序集"Microsoft.AspNet.Http.Abstractions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = adb9793829ddae60"加载类型"Microsoft.AspNet.Http.RequestDelegate".
我正在MassTransit和rabbitmq的帮助下开发分布式应用程序
我必须提供在网页上生成报告而无需通过点击按钮重新加载页面的能力,我也应该调用Windows服务进行数据准备(该服务处理每个请求30秒 - 1分钟).
我基于此示例的第一次尝试:https://github.com/MassTransit/Sample-RequestResponse
[HttpPost]
public async Task<HttpStatusCodeResult> GenerateReport(string someJsonData)
{
var serviceAddress = new Uri(ConfigurationManager.AppSettings["BaseLineRecordService"]);
var client = this.Bus.CreateRequestClient<ICreateReportRequest, ICreateReportResponse>(serviceAddress, TimeSpan.FromHours(1));
ICreateReportResponse response = await client.Request(new CreateReportRequest());
reportHub.ShowRepordData(response); // Update data by SingleR
return new HttpStatusCodeResult(200);
}
Run Code Online (Sandbox Code Playgroud)
但据我所知,这不是一个更好的方法,因为我在所有数据准备期间都保持联系.
我读了很多文章,我找到了三种方法.哪种方式更受欢迎?
1)喜欢这篇文章http://www.maldworth.com/2015/07/19/signalrchat-with-masstransit-v3/
2)作为第一个但使用Rest API调用而不是IIS端的消费者
3)本文的想法http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service
我在Angular应用程序中使用SignalR.当我在Angular中销毁组件时,我也想停止与集线器的连接.我使用命令:
this.hubConnection.stop();
Run Code Online (Sandbox Code Playgroud)
但是我在Chrome控制台中收到错误: Websocket已关闭状态代码:1006
在Edge中:错误错误:未捕获(在承诺中):错误:由于连接被关闭而取消了调用.错误:由于连接已关闭而取消了调用.
它实际上工作,连接已经停止,但我想知道为什么我得到错误.
这就是我启动集线器的方式:
this.hubConnection = new HubConnectionBuilder()
.withUrl("/matchHub")
.build();
this.hubConnection.on("MatchUpdate", (match: Match) => {
// some magic
})
this.hubConnection
.start()
.then(() => {
this.hubConnection.invoke("SendUpdates");
});
Run Code Online (Sandbox Code Playgroud)
编辑
我终于找到了这个问题.它是由Mongo改变流引起的.如果我从SendUpdates()方法中删除代码,则会触发OnDisconnected.
public class MatchHub : Hub
{
private readonly IMatchManager matchManager;
public MatchHub(IMatchManager matchManager)
{
this.matchManager = matchManager;
}
public async Task SendUpdates() {
using (var changeStream = matchManager.GetChangeStream()) {
while (changeStream.MoveNext()) {
var changeStreamDocument = changeStream.Current.FullDocument;
if (changeStreamDocument == null) {
changeStreamDocument = BsonSerializer.Deserialize<Match>(changeStream.Current.DocumentKey);
}
await Clients.Caller.SendAsync("MatchUpdate", changeStreamDocument); …Run Code Online (Sandbox Code Playgroud) signalr ×10
c# ×4
asp.net-mvc ×2
javascript ×2
api-design ×1
asp.net ×1
asp.net-core ×1
integration ×1
masstransit ×1
mongodb ×1
python ×1
rabbitmq ×1
signalr-hub ×1
versioning ×1