我无法获得SignalR服务器端Hub代码来调用JS客户端方法.反过来工作正常 - 所以当我的客户端向服务器发送消息时,它按预期交付.我一直都非常小心避免明显的陷阱,但我想我仍然会忽略一些东西.这是我的代码:
来自MessageHub.cs:
public bool SendMessage( ClientMessage message )
{
...
Clients.All.addMessage("my message");
...
}
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
$.connection.hub.start()
.done(function () {
messageHub = $.connection.message;
// addMessage is never invoked.
messageHub.client.addMessage = function (message) {
alert('message added');
};
/* // I tried this based on some sample code but still not invoked.
messageHub.addMessage = function (message) {
alert('message added');
};
*/
// This works as expected.
messageHub.server.registerUser(userId);
...
});
Run Code Online (Sandbox Code Playgroud)
如上所述,我找不到任何明显的设置缺陷,但这里有一些可能的相关点:
所以,鉴于上述情况,我错过了一些明显的东西吗?如果没有,识别故障点的最佳方法是什么?
PS这与问题没有特别的关系,但是,由于某些原因,Fiddler不再从我的任何浏览器捕获任何流量,这使得调试WS或HTTP流量有点挑战 - 我猜这是Windows 8的事情. ..
我正在处理我正在研究的SignalR项目的问题.我正在尝试使用.Net Core构建服务器,使用传统的.Net(框架4.6.1)构建客户端.但是,服务器和客户端似乎不兼容.
我遇到的最后一个问题是StatusCode:405,ReasonPhrase:'Method Not Allowed'.我在GitHub上找到了一个答案,表明版本之间存在许多重大变化.
看看可用的NuGet包版本,我更加困惑.对于.Net Core服务器,我正在使用1.0.0-preview1-final.还有一个1.0.0-alpha2-final可用,但我不知道'alpha'是否比'preview'更新或更旧.
在客户端我使用的是2.2.2版本,并且有各种版本可供选择,我尝试了最旧和最新版本,但两个版本都给了我相同的"方法不允许"错误.
错误是在客户端,在服务器端,我的断点甚至没有被击中,所以它也可能是一个Owin/iis问题.
有没有可以映射SignalR客户端和服务器版本兼容性的图表?我想这将是向前迈出的一大步.
version signalr signalr-hub signalr.client asp.net-core-signalr
我有一个 MVC 网站,上面有一些相当大的业务对象。我的 MVC 控制器调用管理器对象,这些对象将工作委托给其他对象集。
基本上代码是深层的服务器端,而集线器在某种程度上就像一个控制器,因为它非常接近客户端。
有没有办法根据传递给这些 Manager 对象的 Hub 引用来执行 SignalR 方法?
当我离开 Silverlight 中的页面时,我在 Javascript 中调用了一个包含以下内容的函数:
$.connection.hub.stop();
在我的 Hub 类中,我覆盖了 OnDisconnected()
通常, OnDisconnected 事件会触发,但有时它不会触发,并且在超时和 OnDisconnected 被触发之前似乎需要花费不同的时间。
在我离开创建连接的页面后,Fiddler 显示原始信号器/连接?...请求没有响应代码(列显示“-”,正文列显示“-1)-不应该这个回报200?

如果我导航回该页面,则会建立一个新连接。
有时发出信号/中止请求,传递相同的connectionToken,但原始连接请求保持不变(打开)。

为什么 OnDisconnected 事件不是每次都在集线器中立即触发,因为在客户端中显式地停止了连接?
使用 SignalR 1.2.1 .NET 4.0
阅读文档后,我认为这不适用于我的情况:
在某些情况下不会调用 OnDisconnected 方法,例如当服务器出现故障或应用程序域被回收时。当另一台服务器上线或 App Domain 完成其回收时,某些客户端可能能够重新连接并触发 OnReconnected 事件。
我最近听说过SignalR,我想在ASP vNext中实现它.
我已经尝试了一些ASP MVC 5的指南,但我无法让它工作.有人能指出我正确的方向吗?
我一整天都在为此工作,但没有运气。我也尝试过(几乎)每一个 SO 问题,但我没有让它起作用......
我正在使用非常简单的 SignalR 推送消息和单独的简单前端运行 web api 来显示此推送消息。在我的情况下,推送消息是不断变化的数字。
索引.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test app</title>
<script src="scripts/jquery-2.1.4.js"></script>
<script src="scripts/jquery.signalR-2.2.0.js"></script>
<script src="/signalr/hubs"></script>
</head>
<body>
<div id="testElm">TEST: </div>
<script type="text/javascript">
$(document).ready(function () {
$.connection.hub.url = "http://localhost:55833/signalr";
var hub = $.connection.displayHub;
hub.client.pushMessage = function (response) {
$('#testElm').text(response);
};
$.connection.hub.start();
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的枢纽班
public class DisplayHub : Hub
{
public DisplayHub() : this(GlobalHost.ConnectionManager.GetHubContext<DisplayHub>().Clients) { }
public DisplayHub(IHubConnectionContext<dynamic> clients)
{
}
public void PushMessage(string message)
{
// generate random number and …Run Code Online (Sandbox Code Playgroud) 我创建
MVC 应用程序(已安装 -Install-Package Microsoft.AspNet.SignalR.JS)(参考此处)
Web 服务 (//从 Nuget 包窗口安装 //Install-Package Microsoft ASP.NET SignalR .NET Client //Install-Package Microsoft ASP.NET SignalR Core Components)
Signalr 服务(已安装 -Install-Package Microsoft.AspNet.SignalR.SelfHost 和 Install-Package Microsoft.Owin.Cors)
我在做什么:我正在调用 MVC 页面,并在使用 Web 服务处理一项任务之后。在该 Web 服务中,当任务正在处理时,我想通知用户正在处理的任务背后发生了什么,或者它是使用 Signalr 服务完成的。
我分别创建了 All 项目。
使用网络服务我正在调用信号集线器(请参阅此处)
面临的挑战: 我想向该用户广播消息,如果没有。用户在那里然后取决于我想发送消息的角色。

编辑:在我的项目中添加了额外的增强功能:我没有。MVC 应用程序及其相应的 Web 服务和我的单个 signalR 服务,那么我如何识别哪个 MVC 应用程序调用它相应的服务和服务推送给所有或它的应用程序用户或特定用户。像pusher一样,将为应用程序创建应用程序 ID 和用户的令牌数量。有可能做到这一点。
假设我的服务器应用程序中有两个或更多集线器。我的 javascipt 客户端(Angular SPA)最初需要连接到第一个集线器,并且需要订阅这样的方法:
connection = $.hubConnection(appSettings.serverPath);
firstHubProxy = connection.createHubProxy('firstHub');
firstHubProxy('eventFromFirstHub', function () {
console.log('Method invokation from FirstHub');
});
connection.start().done(function (data) {
console.log("hub started");
});
Run Code Online (Sandbox Code Playgroud)
一切正常。现在,我的 Angular SPA 用户可能决定在他的页面上放置一个小部件,该小部件需要订阅来自第二个集线器的方法:
secondHubProxy = connection.createHubProxy('firstHub');
secondHubProxy('eventFromSecondHub', function () {
console.log('Method invokation from SecondHub');
});
Run Code Online (Sandbox Code Playgroud)
第二个集线器的方法不起作用。我猜是因为它是在connection.start().
我的示例是简化的,在我的实际应用程序中,将有 20 多个中心,用户可能会或可能不会通过向其页面添加或删除小部件来订阅这些中心。
据我所知,我有两个选择:
有没有人知道我可以用来完成这个的模式?还是我在这里遗漏了一些非常简单的东西?
我在 StackOverflow 上搜索了许多与 SignalR 连接相关的其他问题,但似乎都不适用于我的具体情况。
我有一个使用 SignalR 集线器的应用程序。客户端可以使用两种方法连接到集线器:
我遇到的问题是使用 .NET Core API(方法 1)进行连接。当服务器端应用程序运行很长一段时间(可能是 2 周)时,API 使用的 SignalR 连接会失败。与 SignalR 集线器的直接连接(方法 2)仍然有效。
以下是通过 API 进行连接的方式:
.NET Core Web API
[Route("~/api/heartbeat")]
[HttpPost]
public async Task SendHeartbeat(nodeId) {
await SignalRClient.SendHeartbeat(nodeId);
...
}
Run Code Online (Sandbox Code Playgroud)
信号R客户端
public static class SignalRClient
{
private static HubConnection _hubConnection;
/// <summary>
/// Static SignalRHub client - to ensure that a single connection to the SignalRHub is re-used,
/// and to prevent excessive connections that cause …Run Code Online (Sandbox Code Playgroud) 在Web API中,所有异常都可以通过中间件来处理。在 Asp.Net Core 5.0 中,集线器过滤器将完成这项工作。
但是如何在 SignalR 集线器中处理 Asp.Net Core 3.1 中的异常呢?有没有唯一的方法可以在每个方法中编写 try/catch ,如下所示?
[Authorize]
public class OrdersHub : BaseHub
{
public async Task GetOrder(Guid requestId, int orderId)
{
try
{
var data = await ordersService.GetOrderAsync(orderId);
await Clients.Caller.SendAsync("GetOrderResult", requestId, result);
}
catch (Exception ex)
{
await Clients.Caller.Reject(requestId, ex);
}
}
}
Run Code Online (Sandbox Code Playgroud) signalr-hub ×10
signalr ×7
c# ×4
asp.net-core ×3
javascript ×3
asp.net ×2
asp.net-mvc ×1
exception ×1
version ×1