我有一个在控制台应用程序上下文中运行的自托管 SignalR 应用程序。我通过使用包装器类连接到其中的集线器,以防止我不得不从我的 ASP.NET 项目中引用 SignalR.Core 程序集。所以它是我的应用程序中的另一个 C# 类,它负责向连接的客户端广播消息。
我可以直接从 Javascript 调用 PlanHub 方法(Register 和 Unregister),这些断点会被命中。但是,当我从 Hub 外部的类调用客户端方法时(即使我使用 Clients.All 来消除组注册问题),客户端也永远不会收到消息。我做错了什么?
运行此代码时,我可以验证 Clients.All.updateStatus(planId, message); 代码是否已成功命中,但客户端的控制台未记录任何内容.
相关代码如下:
PlanHub.cs
public class PlanHub : Hub
{
private const string GroupPrefix = "PlanGroup_";
public void Register(int companyId)
{
Groups.Add(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
public void Unregister(int companyId)
{
Groups.Remove(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
}
PlanPublisher.cs
public class PlanPublisher
{
private readonly static Lazy<PlanPublisher> _instance = new Lazy<PlanPublisher>(() =>
new PlanPublisher(GlobalHost.ConnectionManager.GetHubContext<PlanHub>().Clients));
private IHubConnectionContext<dynamic> Clients { get; set; }
private PlanPublisher(IHubConnectionContext<dynamic> clients)
{
Clients = clients;
}
public static PlanPublisher Instance => _instance.Value;
public void UpdateStatus(int planId, string message)
{
//This code gets hit and no exceptions are thrown, but the clients
//never receive the message. Using Clients.All instead of my
//Groups for testing -- still doesn't work
Clients.All.updateStatus(planId, message);
}
}
调用代码(来自另一个 C# 类)
PlanPublisher.Instance.UpdateStatus(plan.Id, $"Publishing started for {plan.Name}...");
Javascript
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script src="~/scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:8080/signalr/hubs"></script>
<script>
$(document).ready(function() {
$.connection.hub.url = "http://localhost:8080/signalr";
var planMessagePublisher = $.connection.planHub;
planMessagePublisher.client.updateStatus = function (planId, message) {
console.log('Status: ' + planId + ' - ' + message);
};
$.connection.hub.start().done(function() {
//This works! My PlanHub.Register method gets called successfully
planMessagePublisher.server.register(@Model.CompanyId);
// New connection ID is successfully sent to console
console.log('Now connected, connection ID=' + $.connection.hub.id);
});
});
</script>
JS 控制台调试器输出
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Auto detected cross domain url.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Client subscribed to hub 'planhub'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Negotiating with 'http://localhost:8080/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport starting.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:8080/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAA5D8YUVyzBEG4tTlTaGn0MgAAAAACAAAAAAADZgAAwAAAABAAAABDjF1MaCTzZI0XTM8gC29xAAAAAASAAACgAAAAEAAAAKrk0jv%2FKF4YFzDvNwmSR8IoAAAAacm1d1r7dJpjOtVtCFIFRpugkubyZm1e5Z8OtOFtnhZyEBO1SO4lqhQAAABiG7hBydTiypPh8k2ZYz20ropNxw%3D%3D&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D&tid=6'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Websocket opened.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport connected. Initiating start request.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoking planhub.Register
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoked planhub.Register
它注册成功,但从未收到任何数据。 Clients.All.updateStatus(planId, message); 断点被击中多次,但控制台从未收到任何额外的日志记录数据。
编辑: 有人建议我调查自定义依赖项解析器是否在起作用。此处发布的代码存在于其自己的项目中,除了您在此处看到的内容外,几乎没有其他内容。调用 PlanPublisher.UpdateStatus() 的代码确实有一个自定义依赖项解析器,但这应该无关紧要,因为它在自己的程序集中是独立的。 PlanPublisher.cs 和 PlanHub.cs 包含在一个非常简单的项目中,该项目仅引用了 SignalR.Core 和 SignalR.SelfHost。
最佳答案
我试图简化您的示例(使用 SignalR 2.2.0)
中心类:
public class PlanHub : Hub
{
private const string GroupPrefix = "PlanGroup_";
// hubcontext
private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext <PlanHub> ();
public void Register(int companyId)
{
Groups.Add(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
public void Unregister(int companyId)
{
Groups.Remove(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
// static method using hub context
public static void Static_UpdateStatus(int planId, string message)
{
hubContext.Clients.All.updateStatus(planId, message);
}
}
因为我真的没有后端而且我不知道你要怎么做,我只是设置了一个计时器每 10 秒从 C# 调用一次方法。
调用和虚拟定时器:
public void startTimer()
{
timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(ExecuteTimerJob);
timer.Interval = 10000; // 10 sec
timer.Start();
}
public static void ExecuteTimerJob(object source, System.Timers.ElapsedEventArgs e)
{
// this is the call from C#
PlanHub.Static_UpdateStatus(123, "some message");
}
JS:
$(function () {
var planHub = $.connection.planHub;
$.connection.hub.start().done(function () {
console.debug('Connected to PlanHub...');
})
planHub.client.updateStatus = function (planId, message) {
console.log("planId: " + planId);
console.log("message: " + message);
}
});
浏览器控制台结果:
关于javascript - SignalR 2.2 客户端未收到任何消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955461/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:
如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one
我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。Ruby是一种美丽的语言,但有一个我讨厌写很多次的关键词“结束”。有什么方法可以写出简洁的代码而不用每次都写“end”吗?
参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍 介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。 内容有: ①:Hub模型的方法介绍 ②:服务器端代码介绍 ③:前端vue3安装并调用后端方法 ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke() 去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on