当导航离开具有signalR连接/连接集线器的页面时,我收到以下错误消息.
连接到 "http:// localhost:53604/signalr/signalr/connect?transport = serverSentEvents&connectionId = 0b308c0d-2122-4e60-a9fa-f6e3f3eb1f4e&connectionData =%5B%7B%22name%22%3A%22packageactionstatus%20%22%7D 页面加载时,%5D&tid = 9" 被中断.
我确实理解由于离开页面导致连接丢失(这是好的)但是在导航离开当前页面之前是否有一种安全的方法来停止连接?
我有一个 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 事件。
我一整天都在为此工作,但没有运气。我也尝试过(几乎)每一个 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 多个中心,用户可能会或可能不会通过向其页面添加或删除小部件来订阅这些中心。
据我所知,我有两个选择:
有没有人知道我可以用来完成这个的模式?还是我在这里遗漏了一些非常简单的东西?
语境
我正在将 SignalR 3 RC1 与 ASP.NET 5 用于我的项目,但我无法让我的客户端订阅特定组,以从我的服务器接收消息。
枢纽类
[HubName("ChatHub")]
public class ChatHub : Hub
{
public async Task Join(string userId)
{
if (!string.IsNullOrEmpty(userId))
{
await Groups.Add(Context.ConnectionId, userId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
JS代码
var chatHub = hubConnection.createHubProxy("chatHub");
chatHub .on("newMessage", (response) => {
console.log(response);
});
hubConnection.start().done(response => {
chatHub.invoke("join", "userid");
});
Run Code Online (Sandbox Code Playgroud)
网络接口
public class ChatController : ApiController
{
protected readonly IHubContext ChatHub;
public ChatController(IConnectionManager signalRConnectionManager)
{
ChatHub = signalRConnectionManager.GetHubContext<ChatHub>();
}
[Authorize]
[HttpPost]
[Route("Message")]
public async Task<IActionResult> CreateMessage([FromBody] messageParams dto)
{
await …Run Code Online (Sandbox Code Playgroud) 我开发了一个应用程序,服务器端技术是asp.net web api,客户端是javascript.在我的应用程序中,我使用Signalr通知客户端更新 - 从服务器到客户端的推送通知.
所有信号器交互都发生在Hub类之外,因为来自HTTP请求的推送而不是来自客户端通过信号器推送到服务器.
在处理成功的HTTP请求之后,我想让通知请求的人旁边的所有客户端都得到通知.
谁应该对这些通知负责?在处理合法请求后,我的服务器是否应该向客户端发送通知?(这就是我现在所做的)如果这是方法,除了提出请求的人之外我怎样才能通知所有客户?提醒 - 因为请求是Http而不是信号器推送,推送到客户端发生在Hub之外的类中.因此,我不能像您可能建议的那样使用Context或Client.Others属性.我怎么知道应该通知哪些客户?目前我只使用Clients.All和发出请求的人也会收到我不喜欢的通知.
选项2是在我的服务器响应成功状态代码之后.发出请求的客户将负责通知其他客户端 - 这意味着他会将消息推送到服务器,服务器将把该通知推送到所有其他客户端(这次它将在信号器集线器中,所以我可以使用Clients.Others).
我应该采取哪种方法?
我正在使用带有聊天模块的带有 SignalR 的 angular 和 AspNet 进行 Ionic 项目。我使用 SignalR 进行聊天。它运行顺利,但有时我会根据下面的屏幕截图出现错误,因此它根本停止工作。我在 IIS 上托管了我的服务并创建了代理并与客户端和服务器进行了通信。这是示例
(function () {
angular
.module('app')
.factory('SignalRFactory', SignalRFactory);
SignalRFactory.$inject = ['$rootScope', 'Hub', 'ionicToast'];
function SignalRFactory($rootScope, Hub, ionicToast) {
var signalRLocal = this;
var serverURL = 'https://serivcerURL.com/signalr';
//Hub setup
var hub = new Hub('CommunicationHub', {
rootPath: serverURL,
listeners: {
'send': function (data) {
console.log("send " + data);
}
},
errorHandler: function (error) {
//Here i am getting that websocket closed error
console.error(error);
}
});
signalRLocal.Connect = function (user) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的 UWP 应用程序连接到 SignalR Core 集线器。
在 .NET Core 应用程序 (2.1) 中,它运行良好,而在 UWP 中,它在hub.StartAsync()被调用时抛出异常。
证书颁发机构无效或不正确
这是我的代码:
hub = new HubConnectionBuilder()
.WithUrl("http://localhost:49791/hubs/status")
.Build();
await hub.StartAsync();
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我猜我必须在包清单中配置一些东西,但是什么?
signalr-hub ×10
signalr ×9
asp.net ×3
c# ×3
javascript ×3
asp.net-mvc ×2
.net ×1
angularjs ×1
asp.net-core ×1
uwp ×1