SignalR 事件在部署到服务器时变得间歇性

2023-12-08

当通过 VS - IIS Express 在本地运行时,一切正常 100%。

然后,当我发布到网络服务器(在网络上或在线上)时,我有一些事件因“OnConnected”而停止触发......但并非总是如此。如果我刷新它可能会触发,也可能不会。

有问题的事件是 ResetTimer,请参阅下面的示例代码。

我已经登录,控制台没有显示任何错误。

我正在使用信号器 1.0.1

    <script type="text/javascript">
    var timerTime, setIntervalInstance;
    $(function () {
        $('#rollresults').tablesorter({ headers: { 0: { sorter: false }, 1: { sorter: true }, 2: { sorter: false } } });

        $.connection.hub.logging = true;
        // Proxy created on the fly          
        var chat = $.connection.brewBattleHub;
        // Start the connection
        $.connection.hub.qs = '[email protected]["groupName"]';
        $.connection.hub.start().done(function () {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.roll($("#drinkname").val(), $("#comment").val().substr(0, 40));
                $("#rollresults").show('slow');
                $("#broadcast").prop("disabled", "disabled");
                $("#drinkname").prop("disabled", "disabled");
                $("#comment").prop("disabled", "disabled");
            });

            setIntervalInstance = window.setInterval(timerTick, 1000);
        }).fail(function (reason) {
            console.log("SignalR connection failed: " + reason);
            //chat.server.sendMessage(@Model.UserName + " has Error! (Check logs)");
        });


        // Declare a function on the chat hub so the server can invoke it          
        chat.client.addRoll = function (player, roll, drink, comment) {
            $("#rollresults").find("tr").eq(1).removeClass('loserrow');
            $('#rollresults tbody').append('<tr><td>' + player + '</td>' + '<td>' + roll + '</td>' + '<td>' + drink + '</td>' + '<td>' + comment + '</td></tr>');
            $("#rollresults").trigger("update");
            $("#rollresults").tablesorter({ sortList: [[1, 0]] });
            $("#rollresults").find("tr").eq(1).addClass('loserrow');
        };

        chat.client.addMessage = function (message) {
            $('#messages').append("<div class='message'>" + message + "</div>");
        };

        chat.client.resetTimer = function () {
            timerTime = 30;
        };

        function timerTick() {
            if (timerTime > 0) {
                timerTime = timerTime - 1;
                $('#timer').html("<div>Starting in: " + timerTime + "</div>");
                $("#timerbox").show('slow');
            } else {
                clearInterval(setIntervalInstance);
                $("#broadcast").removeProp("disabled", "disabled");
                $('#timerbox').hide('slow');
            }
        }
    });

集线器相关部分

        public override Task OnConnected()
    {
        var @group = GetOrCreateGroup();

        var user = new ConnectedUser { ConnectionId = Context.ConnectionId, Name = Context.User.Identity.Name };
        @group.AddUser(user);

        foreach (var connectedUser in @group.ConnectedUsers.Where(u => u != user))
        {
            Clients.Caller.addMessage(HttpUtility.HtmlEncode(connectedUser.Name + " has connected."));
        }

        Groups.Add(Context.ConnectionId, @group.Name);
        Clients.OthersInGroup(@group.Name).addMessage(HttpUtility.HtmlEncode(user.Name + " has connected."));
        Clients.Caller.addMessage(HttpUtility.HtmlEncode("You've connected..."));

        ResetTimer(@group.Name);
        return base.OnConnected();
    }

    Group GetOrCreateGroup()
    {
        var groupName = Context.QueryString["groupName"].ToUpper();
        var @group = BattleGroups.FirstOrDefault(g => g.Name.ToUpper() == groupName);

        if (group == null)
        {
            group = new Group { Name = groupName };
            BattleGroups.Add(group);
        }
        return @group;
    }

    public void ResetTimer(string groupName)
    {
        Clients.Group(groupName).resetTimer();
    }

Console

 [09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Negotiating with '/signalr/negotiate?     groupName=Public'. jquery.signalR-1.0.1.js:54 
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Attempting to connect to SSE endpoint 'http://server:88/signalr/connect?transport=serverSentEvents&connectionToke…onData=%5B%7B%22name%22%3A%22brewbattlehub%22%7D%5D&groupName=Public&tid=4' jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: EventSource connected jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000 jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Triggering client hub event 'addMessage' on hub 'brewBattleHub'. 

Addendum

实际上似乎并没有在本地 100% 工作(只是大多数时候),我认为这可能是通过延迟引入的问题?


不是一个令人满意的修复,但在 ResetTimer() 之前添加线程睡眠seems已修复它。

    Groups.Add(Context.ConnectionId, @group.Name);
    Clients.OthersInGroup(@group.Name).addMessage(HttpUtility.HtmlEncode(user.Name + " has connected."));
    Clients.Caller.addMessage(HttpUtility.HtmlEncode("You've connected..."));

    Thread.Sleep(TimeSpan.FromSeconds(1)); //<<<<<<<<<
    ResetTimer(@group.Name);

Addendum

甚至更好的修复,问题是 Groups.Add 是异步的!等待它也解决了这个问题。 (不要忘记也使 OnConnected 异步)

    public async override Task OnConnected()
    {
      --->> await Groups.Add(Context.ConnectionId, "TestGroup"); 

            Clients.Group("TestGroup").showBoxOne();
            Clients.Group("TestGroup").showBoxTwo();
            Clients.Group("TestGroup").showBoxThree();
            Clients.Group("TestGroup").showBoxFour();
            Clients.Group("TestGroup").showBoxFive();
        }

        await base.OnConnected();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR 事件在部署到服务器时变得间歇性 的相关文章

  • SignalR:如何停止在页面重新加载时创建新连接

    您好 我正在开发一个聊天应用程序以及应用程序中的一些其他页面 一旦我登录 我就会维护用户的会话 我的主要目的是 每当其他用户连接到服务器时 用户应该收到通知 我面临的问题是每当我导航到应用程序中的其他页面时 连接就会丢失 如何停止此行为并继
  • SignalR 和浏览器连接限制

    我用 SignalR 制作了一个简单的应用程序进行测试 当页面加载时 它会调用服务器上的函数 该函数然后调用在屏幕上打印消息的客户端函数 我这样做是为了检查客户端和服务器功能是否正常工作以及 SignalR 通信是否正常 我的问题是 如果我
  • 信号器程序集加载问题 OWIN

    我在尝试加载类时收到此错误Microsoft AspNet SignalR Owin集会 执行离开后抛出异常Configuration中的方法startup cs 我已经注册了一个全局异常处理程序来尝试捕获异常 但它没有被捕获 public
  • SignalR Core - 错误:Websocket 已关闭,状态代码:1006

    我在 Angular 应用程序中使用 SignalR 当我销毁 Angular 中的组件时 我也想停止与集线器的连接 我使用命令 this hubConnection stop 但我在 Chrome 控制台中收到错误 Websocket 已
  • SignalR - 建立连接需要相当长的时间

    我刚刚开始使用 SignalR 进行实时更新 建立连接后我需要执行一些操作 所以我在 done 方法中编写了该代码 我面临的问题是 建立连接需要一些时间 因此我无法执行我想要执行的操作 以下是我的 js 代码片段 function Prox
  • 如何保留 SignalR 连接 ID

    我正在尝试构建一个聊天应用程序 其中用户 ID 由其自动生成的 signalR 连接 ID 表示 页面刷新时 实例化新连接时连接 ID 会发生变化 有没有办法持久保存用户连接 ID 的状态 直到浏览器会话结束 即直到他结束客户端上的会话 有
  • 将 Autofac 与 SignalR 结合使用时出现范围错误

    我正在尝试注入HttpContextBase在我的 SignalR 中心 public class EventHub Hub IDisconnect private readonly HttpContextBase httpContextB
  • 如何使用角度中的signalr读取从web api发送的数据?

    我想在角度客户端中通过 signalr 读取从 asp net web api 发送的数据 为此 我在下面给出的 Web api 中创建了 Hub ProgressHub cs public class ProgressHub Hub pu
  • SignalR 和 HttpContext/Session

    我明白为什么 SignalR 不给你访问 HttpContext https stackoverflow com questions 7854663 signalr doesnt use session on server 然而 这对我们来
  • SignalR:使用 GlobalHost.ConnectionManager 发送数据不起作用

    我有一个这样的中心 public class MessageHubBub Hub public void ServerMethod Clients All sayHi hello GlobalHost ConnectionManager G
  • SignalR 连接到多个服务器

    可以使用 Javascript 客户端连接到多个SignalR服务器 例如
  • 如何修复信号器的 ChunkLoadError

    我在本地运行我的 nx 站点时遇到问题 任何使用 signalR 的联合应用程序都开始抛出 ChunkLoadError 我尝试过更改 signalR 的版本 重新加载 清除缓存并单独运行我的联合应用程序 结果总是一样的 Uncaught
  • 实体框架“意外的连接状态”异常

    经过三个小时的调试和搜索 我希望这里有人能找到答案 如果我连续快速调用以下函数 例如间隔 System InvalidOperationException 意外的连接状态 使用包装提供程序时 请确保在包装的 DbConnection 上实现
  • WebRTC 和 Asp.Net Core

    我想将音频流从我的 Angular Web 应用程序录制到我的 Asp net Core Api 我认为 使用 SignalR 及其 websockets 是实现这一目标的好方法 通过这个打字稿代码 我可以获得一个 MediaStream
  • 信号器 CORS 问题

    在我的服务器端 我使用带有信号器的 Web api 2 在我的客户端 我使用的是 angularjs 这是我启动信号连接时的 http 请求 gt GET gt http example com signalr negotiate clie
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • 如何在 asp.net mvc 4 中使用 signalr v2 beta

    v2 之前 RouteTable Routes MapHubs 在 v2 中 MapHubs 不再存在 wiki 说添加一个 Startup 类和一个 Configuration 方法以及对 app MapHubs 的调用 namespac
  • @aspnet/signalr 与 @microsoft/signalr javascript 库

    aspnet signalr 与 microsoft signalr javascript 库有什么区别 两者似乎都对 DotNetCore SignalR 有效 两者似乎都很活跃 在一些教程中 我找到 aspnet signalr 在Do
  • RavenDB 和 SignalR Nuget 包依赖项冲突

    基本冲突 SignalR 希望 Newtonsoft Json 版本为 4 0 7 或更高版本 而 RavenDB 希望版本等于 4 0 5 这显然意味着它们不能并排安装 因此 除了从其中之一下载源代码并在本地计算出依赖项 然后必须签入从中
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary

随机推荐