Как я могу остановить соединение через веб-сокет веб-браузера Winform при обновлении или закрытии страницы? - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над проектом WPF, я использую веб-браузер winform, чтобы сделать его доступным для веб-страницы, и обновляю данные с помощью WebSocket.Но есть странная проблема.Когда я щелкаю веб-браузер, чтобы обновить его 6 раз, или переключаюсь на другой интерфейс (закрытый, а затем открываю веб-браузер) 6 раз, веб-страница не может создать новый WebSocket и сообщает об ошибке сценария SecurityError.

Я изменил ядро ​​веб-браузера на IE11 в моем проекте.Я также нашел связанную информацию.Система Windows ограничивает количество подключений к веб-сокету в браузере IE.Размер по умолчанию - 6.

Согласно моему тесту, в IE (11) и Google Chrome при обновлении или закрытии страницы веб-сокет автоматически закрывается, а веб-браузер в WinForm - нет, если только весьПриложение закрыто, но вы можете написать сценарий js, чтобы страница активно закрывала экземпляр веб-сокета до закрытия страницы.но поскольку веб-страница предоставлена ​​другими, мы не можем ее изменить, я могу только выполнить некоторую обработку внутри своего программного обеспечения.

Это демонстрация веб-страницы:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <div id="content"></div>
        <button onclick="test()">Test</button>
        <script>
            function test() {
                let ws = new WebSocket('ws://localhost:3000/test');
                let el = document.getElementById("content");

                ws.onopen = function () {
                    console.log("[CLIENT] open()");
                    ws.send('Hello!');
                };

                ws.onmessage = function (message) {
                    console.log(message.data);
                    el.innerHTML = message.data
                };

                ws.onerror = function (err) {
                    el.innerHTML = err
                }
            }
        </script>
    </body>
</html>

Я думализ нескольких решений сейчас:

  • Используйте js, чтобы попытаться закрыть все веб-сокеты

  • Найдите способ настроить веб-браузер так, чтобы он мог автоматическизакройте веб-сокет при его обновлении и закрытии.

  • Используйте новый процесс для размещения Webbrowser, завершите процесс непосредственно при закрытии

НоЯ не знаю, как реализованы эти решения, надеюсь, есть лучшие способы и предложения.

...