好吧,我正在尝试执行有关视频流的证明,我正在使用asp.net c#.我有点迷茫,你有什么想法或建议吗?
我理解为什么SignalR不允许你访问HttpContext.但是,这对我们来说是个问题.让我解释:
我们的应用程序是一个多租户应用程序,用户在登录时选择环境.这基本上在HttpSession中注册了ConnectionStringName.在我们的SignalR Hub中,我们需要访问数据库Disconnect.但这是不可能的,因为此时我们没有HttpContext,无法确定要写入的环境.
任何人都可以向我们提出如何解决这个问题的建议吗?我们有点卡在这一点上.
编辑:如果您的解决方案在负载平衡环境中工作,则为奖励积分.
界面中可用的On和Subscribe方法之间有什么区别IHubProxy.何时应该使用一个而不是另一个
我有一个带有 SignalR 集线器的 ASP .Net Core 2.2 Web API。是否可以使用 Postman 调用其方法之一(例如,SendMessageToAll)?问题是我只有 API - 没有前端 - 我需要测试。
我尝试将 URl 放到 Postman (api.mydomain.com/chatHub) 中的集线器,但后来我不确定如何构建主体。我知道 SignalR 最好使用 WebSockets,我不知道 PostMan 是否具有 WebSocket 功能。如果 WebSockets 不可用,我相信 SignalR 也可以执行 HTTP 请求,这是 Postman 可以做的。但我用的是什么身体?我是使用 HTTP GET 还是 POST?
我在 Postman 中看到有人在使用这个 body 的帖子:
{
"Target": "SendMessageToGroup",
"Arguments": [
"groupA",
"hello from server"
]
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了相同的方法,但是当我在邮递员上单击“发送”时,我的集线器的 SendMessageToGroup 方法不会被触发。
谢谢
signalr signalr-hub signalr.client postman asp.net-core-webapi
这是两个问题,但是:
为我的Hub设置顶级异常处理程序的最佳方法是什么?目前版本的SignalR似乎不可能
当我在Hub中抛出错误时,为什么这在客户端上实际上没有做任何事情?
$ .connection.hub.error(function(){return alert("test");});
当我调试时,我可以看到我的错误方法被连线,但是当我在Hub上抛出异常时,我可以看到从来没有尝试调用我在上面设置的方法.唯一发生的事情是SignalR将错误发送到控制台.
为了记录,我可以很好地连接其他事件
//Called during exceptions just fine
$.connection.hub.received(function() {
return alert("Received Data");
});
//Seems to do nothing?
$.connection.hub.error(function() {
return alert("Received Exception");
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试调试SignalR集线器,并注意到即使使用单个客户端,构造函数也会被多次调用.这是预期的行为吗?我期待构造函数只被调用一次用于类初始化,但我多次击中断点.
我在SignalR写一个游戏.这个想法是你用你的笔记本电脑连接,它将用作"显示器",然后你连接智能手机,它将被用作"操纵杆".整个设置非常有效.
现在一切正常,我决定重构代码.我意识到操纵杆和显示器之间的关系是一种方式(显示器永远不需要将信息发送回操纵杆).因此我决定在操纵杆上不需要任何signalR可调用的客户端功能(例如,gameHub.client.joyStickMethod()在操纵杆js中没有用.
就在那时我发现了一些奇怪的东西
事实证明,public override Task OnConnected()除非我定义一个,否则不会调用我覆盖以处理不同类型的客户端(显示和操纵杆)的hub方法myHub.client.clientSideMethod().这是我正在处理的例子:
var gameHub = $.connection.gameHub;
gameHub.client.connection();
$("#joystick").joystick({
hub: gameHub
});
gameHub.client.activateJoystick = function () { };
$.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
$.connection.hub.start(); //this will invoke on connected
Run Code Online (Sandbox Code Playgroud)
你看到那个空的客户端方法?这就是为什么OnConnected在服务器端调用的原因.如果我删除该行代码,则不会调用它.
var gameHub = $.connection.gameHub;
gameHub.client.connection();
$("#joystick").joystick({
hub: gameHub
});
//gameHub.client.activateJoystick = function () { };
$.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
$.connection.hub.start(); //this will invoke on connected
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为Hub上没有客户端方法.我可以RegistrateJoystick在Hub上添加一个方法并调用它,但我认为这种行为是出乎意料的.我的问题是:
有没有办法手动"连接"到集线器,以便OnConnect调用该方法?
我们遇到了这个指定不同超时属性的链接:https: //github.com/SignalR/SignalR/wiki/Configuring-SignalR
还有一个很好的帖子(什么时候重新连接signalR会出现?)关于SignalR客户端和SignalR服务器之间如何断开连接和重新连接.
只是为了重复上述帖子中的不同情况:
"当客户端脱机然后不久重新获得连接时,就会发生集线器重新连接.SignalR配置值很大程度上决定了以下示例的时间戳,因此不要逐字记录时间.
以下是几个涉及重新连接行为的示例及其结果(时间格式m:ss):
情况1
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于ISP问题,客户端失去连接(并意识到它失去了连接)
0:15 - 客户重获连接
0:16 - 触发OnReconnected事件
情况2
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)
0:15 - 客户重获连接
这里可能发生两件事
答:0:16 - 没有任何反应,客户继续使用之前的连接
B:0:~45 - 客户端实现断开连接*
B:0:46-客户端转换到重新连接状态
B:0:47 - 客户端成功重新连接并触发OnReconnected事件.
情况3
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)
0:~45 - 客户实现其断开连接*
0:46 - 客户端转换到重新连接状态
1:15 - 服务器确定客户端已经消失了太长时间然后忘记它,排队一个"断开连接"命令,让客户端接收它,如果它稍后重新连接.***
1:15 - OnDisconnect以1:16触发 - 客户重新获得连接
1:17 - 客户端进行"软"重新连接(不触发OnReconnected)
1:18 - 客户端检索"disconnect"命令
1:19 - 客户端调用"停止"并进行软断开(不触发OnDisconnected)
情况4
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - …
我似乎与SignalR的JS Client Hub有问题.
问题是'on'处理程序似乎不起作用 - 它不会产生错误,但不会接收服务器发送的任何信号.下面的代码显示了一个提取,我调用服务器(使用调用)工作正常 - 然后在服务器上我回调acceptHubData应该在客户端上获取但不是.
我的目标是当导航到页面时,每个页面将打开与特定集线器的连接,并在用户移动到另一个页面时释放此连接!
编辑:使用以下代码片段工作,但我想知道为什么下面的代码使用'on'事件不起作用!
var superHub = $.connection.mySuperHub;
superHub.client.acceptHubData = function (data) {
$('<li>hello there' + data + '</li>').prependTo($('#ul1'))
}
$.connection.hub.start().done(function () {
$('<li>done phase 1</li>').prependTo($('#ul1'))
});
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!
这是客户端代码(以js为单位)
$(document).ready(function () {
var myHub;
try {
var connection = $.hubConnection();
connection.start().done(function () {
myHub = connection.createHubProxy("mySuperHub");
myHub.on('acceptHubData', function (data) {
alert(data); // THIS IS NOT CALLED!
});
myHub.invoke('AcceptSignal', "hello from the client2");
});
}
catch (e) {
alert(e.message);
}
});
Run Code Online (Sandbox Code Playgroud)
这是服务器代码:
[HubName("mySuperHub")]
public …Run Code Online (Sandbox Code Playgroud) 我在AspNet MVC 4应用程序中使用SignalR 1.1.2版本和Windsor Castle.我的问题是,自从我转移到较新的SignalR版本后,此错误消息显示出来.
"The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly."
Run Code Online (Sandbox Code Playgroud)
在线
RouteTable.Routes.MapHubs();
Run Code Online (Sandbox Code Playgroud)
这是RegisterHubs类
public static class RegisterHubs
{
public static void Start()
{
var signalrDependencyContainer = new WindsorContainer().Install(new HubsInstaller());
var signalrDependency = new SignalrDependencyResolver(signalrDependencyContainer.Kernel);
GlobalHost.DependencyResolver = signalrDependency;
RouteTable.Routes.MapHubs();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一些我在互联网上找到的东西,比如:
lodctr /R
cd C:\Windows\Inf\.NETFramework
lodctr corperfmonsymbols.ini
Run Code Online (Sandbox Code Playgroud)
但我仍然收到相同的错误消息.有任何想法吗?
我正在使用dotnet framework 4.5.
这是堆栈跟踪
at System.Diagnostics.PerformanceCounter.InitializeImpl()
Run Code Online (Sandbox Code Playgroud)
谢谢!
更新
我正在添加Drew请求的屏幕截图.


