SignalR 不触发 OnDisconnected

Poc*_*hen 5 c# asp.net signalr

问题:SignalR 没有OnDisconnected在我的网络服务器上触发。它非常简单,但不会触发。我试过了:

  • 关闭浏览器窗口
  • 导航离开
  • 重装
  • 从客户端在 SignalR 连接上触发 stop()。

public override Task OnDisconnected(bool stopCalled) {
    LogUtil.LogInfo("Disconn");
    return base.OnDisconnected(stopCalled);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 SignalR 2.2.0.0 并且OnConnected工作正常。
我尝试了最后一次客户端调用的建议,以确保连接正常运行。
我搜索了所有论坛、SO、GIT 等,但没有解决我的问题。

use*_*608 0

我也遇到了这个问题,我不得不使用 LongPolling。我还没有找到任何当前断开/重新连接 javascript 代码的示例。

这是我的代码(为了完整性,排除了劣质的 html):

<hr />

<style>
 table { table-layout: fixed; }
 table th, table td { overflow: hidden; }
</style>

<div id="logs">
    <table id="logTable" class="table">
        <thead>
            <tr>
                <th style="width: 20%">Time</th>
                <th style="width: 5%">Level</th>
                <th>Message</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>
</div>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="/lib/signalr-clientES5-1.0.0-alpha2-final.js" type="text/javascript"></script>
<script type="text/javascript">

    // global refs
    var transportType;
    var logger;
    var loggingHub;
    var loggingConnection;

    function prependLogRow(logEvent) {
        var d = new Date(logEvent.timeStamp); //.ToString("dd/MM H:mm:ss");
        var m = logEvent.message;
        var s = "<tr><td>" + d + "</td><td>" + logEvent.level + "</td><td>" + m + "</td></tr>";
        $("#logTable tbody").prepend(s);

        var rowCount = $('#logTable tr').length;
        if (rowCount > 500) {
            $("#logTable").find("tr:gt(250)").remove();
        }
    };

    function createLogEvent(message) {
        var logEvent = {};
        logEvent.timeStamp = new Date();
        logEvent.level = 'Info';
        logEvent.message = message;
        return logEvent;
    };

    function bindEvents(logger) {

        logger.connection.onclose = (e) => {
            var logEvent = createLogEvent('Logger disconnected. Retrying...');
            prependLogRow(logEvent);
            setTimeout(function () 
            {
                transportType = signalR.TransportType.LongPolling; //;WebSockets
                logger = new signalR.ConsoleLogger(signalR.LogLevel.Trace);
                loggingHub = new signalR.HttpConnection(`https://${document.location.host}/signalr`, { transport: transportType, logger: logger });
                loggingConnection = new signalR.HubConnection(loggingHub, logger);
                bindEvents(loggingConnection);
                var logEvent = createLogEvent('Logger reconnected.');
                prependLogRow(logEvent);
            }, 1000); // Restart connection after a second.
        };

        logger.on('Log', (logEvent) => {
            prependLogRow(logEvent);
        });

        logger.start().catch(err => {
            console.log('connection error');
        });
    };

    $(document).ready(function () {

        transportType = signalR.TransportType.LongPolling; //;WebSockets
        logger = new signalR.ConsoleLogger(signalR.LogLevel.Trace);
        loggingHub = new signalR.HttpConnection(`https://${document.location.host}/signalr`, { transport: transportType, logger: logger });
        loggingConnection = new signalR.HubConnection(loggingHub, logger);

        bindEvents(loggingConnection);

        var logEvent = createLogEvent('Logger loaded. Please wait...');
        prependLogRow(logEvent);
    })
</script>
Run Code Online (Sandbox Code Playgroud)

这段代码感觉不对,但这是我能够可靠工作的唯一迭代。