标签: signalr-hub

SignalR JS客户端方法未被调用

我无法获得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-hub

6
推荐指数
1
解决办法
1万
查看次数

SignalR版本兼容性(StatusCode:405'方法不允许')

我正在处理我正在研究的S​​ignalR项目的问题.我正在尝试使用.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

6
推荐指数
1
解决办法
4521
查看次数

从后端业务层调用 SignalR Hub

我有一个 MVC 网站,上面有一些相当大的业务对象。我的 MVC 控制器调用管理器对象,这些对象将工作委托给其他对象集。

基本上代码是深层的服务器端,而集线器在某种程度上就像一个控制器,因为它非常接近客户端。

有没有办法根据传递给这些 Manager 对象的 Hub 引用来执行 SignalR 方法?

signalr signalr-hub signalr.client

5
推荐指数
1
解决办法
3404
查看次数

集线器中的 SignalR 延迟触发 OnDisconnected

当我离开 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 事件。

javascript c# signalr signalr-hub

5
推荐指数
0
解决办法
783
查看次数

如何在ASP.NET 5中使用SignalR

我最近听说过SignalR,我想在ASP vNext中实现它.

我已经尝试了一些ASP MVC 5的指南,但我无法让它工作.有人能指出我正确的方向吗?

signalr signalr-hub asp.net-core

5
推荐指数
1
解决办法
4495
查看次数

无法使用 SignalR 读取未定义的属性“客户端”

我一整天都在为此工作,但没有运气。我也尝试过(几乎)每一个 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)

signalr asp.net-web-api signalr-hub

5
推荐指数
1
解决办法
8316
查看次数

SignalR 服务:根据用户角色获取消息

我创建

  1. MVC 应用程序(已安装 -Install-Package Microsoft.AspNet.SignalR.JS)(参考此处

  2. Web 服务 (//从 Nuget 包窗口安装 //Install-Package Microsoft ASP.NET SignalR .NET Client //Install-Package Microsoft ASP.NET SignalR Core Components)

  3. Signalr 服务(已安装 -Install-Package Microsoft.AspNet.SignalR.SelfHost 和 Install-Package Microsoft.Owin.Cors)

我在做什么:我正在调用 MVC 页面,并在使用 Web 服务处理一项任务之后。在该 Web 服务中,当任务正在处理时,我想通知用户正在处理的任务背后发生了什么,或者它是使用 Signalr 服务完成的。

我分别创建了 All 项目。

使用网络服务我正在调用信号集线器(请参阅此处

面临的挑战: 我想向该用户广播消息,如果没有。用户在那里然后取决于我想发送消息的角色。

在此处输入图片说明

编辑:在我的项目中添加了额外的增强功能:我没有。MVC 应用程序及其相应的 Web 服务和我的单个 signalR 服务,那么我如何识别哪个 MVC 应用程序调用它相应的服务和服务推送给所有或它的应用程序用户或特定用户。像pusher一样,将为应用程序创建应用程序 ID 和用户的令牌数量。有可能做到这一点。

javascript c# asp.net-mvc signalr signalr-hub

5
推荐指数
1
解决办法
1273
查看次数

连接开始后连接到 SignalR 集线器

假设我的服务器应用程序中有两个或更多集线器。我的 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 多个中心,用户可能会或可能不会通过向其页面添加或删除小部件来订阅这些中心。

据我所知,我有两个选择:

  1. 调用 connection.stop() 然后调用 connection.start()。现在两个中心订阅都在工作。这感觉不对,因为在所有集线器上,OnConnected() 事件都会触发,我的应用程序将一直启动和停止。
  2. 为所有可能的集线器创建集线器代理对象,在所有可能的集线器上订阅一个虚拟方法,以便应用程序可以在以后根据需要订阅集线器方法。这也感觉不对,因为我需要创建 20 多个集线器代理,而我可能只需要其中的几个。

有没有人知道我可以用来完成这个的模式?还是我在这里遗漏了一些非常简单的东西?

javascript asp.net signalr signalr-hub signalr.client

5
推荐指数
1
解决办法
3170
查看次数

在正常运行时间较长后,服务器端 SignalR 连接失败

我在 StackOverflow 上搜索了许多与 SignalR 连接相关的其他问题,但似乎都不适用于我的具体情况。

我有一个使用 SignalR 集线器的应用程序。客户端可以使用两种方法连接到集线器:

  1. 通过使用底层客户端连接到集线器的.NET Core API
  2. 直接连接到中心的 URL

我遇到的问题是使用 .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)

c# asp.net signalr-hub asp.net-core asp.net-core-webapi

5
推荐指数
1
解决办法
5741
查看次数

处理 Asp.Net Core 3.1 中 SignalR 集线器中的所有异常

在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)

c# exception signalr-hub asp.net-core asp.net-core-signalr

5
推荐指数
1
解决办法
4898
查看次数