当部署到服务器SignalR事件变得断断续续(SignalR event becomes inter

2019-08-19 05:14发布

当通过VS本地运行 - IIS表达这一切工作正常100%。

当我再发布到Web服务器(网络或在线)我有一些事件停止射击的“OnConnected” ......但不是所有的时间。 如果我刷新它可能会再火也可能不会。

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

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

我使用signalr 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 = 'groupName=@ViewContext.RouteData.Values["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');
            }
        }
    });

毂的Relavent部

        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();
    }

安慰

 [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'. 

附录

实际上并不似乎工作本地(只是大部分的时间)为100%,我认为这可能是通过延迟推出的问题吗?

Answer 1:

不是满足修复,但增加一个线程睡眠ResetTimer() 似乎已经解决了它。

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

附录

甚至更好的修复,问题是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();
    }


文章来源: SignalR event becomes intermittent when deployed to a server
标签: signalr