Ошибка конфигурации или кода в колбах и IIS версии 10: WebSockets не может подключиться - PullRequest
0 голосов
/ 23 июня 2019

Я создал приложение для фляги, которое использует флягу модуля для обслуживания стандартных веб-страниц и сокеты модуля для отчета о расчетах, запрошенных через эти веб-страницы.

Эта установка работает нормально через отдельное приложение фляги (запустив app.run ()), но не перенес его на веб-сервер моей компании: мы используем сервер Microsoft iis, настроенный с fastCGI, и модуль wfastcgi.

Настройка iis была выполнена в соответствии с этим руководством: https://www.storehubs.com/Blog/deploy-python-flask-application-iis/. После того, как приложение для колб было развернуто, веб-страница работала так, как ожидалось.Однако WebSockets не может подключиться, и я получаю:

Ошибка подключения WebSocket к 'ws: // localhost / echo': Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 404.

Эта ошибка приводит меня к выводу, что на моем сервере что-то отвечает, но запрос не достигает моего приложения.

При поиске в Интернете некоторые говорят, что отключение обработчика iss WebSocket поможет.но это не так.Из моего приложения Host.config:

    <system.webServer>
        <webSocket enabled="false" />
    </system.webServer>

Для моего теста я использую два файла:

sample.py:

from flask import Flask, render_template
from flask_sockets import Sockets

app = Flask(__name__)
app.debug = True

sockets = Sockets(app)

@sockets.route('/echo')
def echo_socket(ws):
    print(ws.environ['QUERY_STRING'])
    while True:
        message = ws.receive()
        if message is None: 
            break
        ws.send(message[::-1])

@app.route('/', methods=['GET'])
def echo_test():
    return render_template('echo_test.html')

if __name__ == '__main__':
    app.run()

и echo_test.html:

    <!DOCTYPE html>
    <html>
      <head>
        <script type="text/javascript">
            function ws_url(s) {
                var l = window.location;
                path = l.pathname.substring(0, l.pathname.lastIndexOf("/"));
                return ((l.protocol === "https:") ? "wss://" : "ws://") + l.host + path + s;
            }
            var u = ws_url('/echo')
            var ws = new WebSocket(u);
            ws.onopen = function() {
                ws.send("socket open");
            };
            ws.onclose = function(evt) {
                alert("socket closed");
            };
            ws.onmessage = function(evt) {
                alert(evt.data);
            };
        </script>
      </head>
      <body>
      <button type="button" onclick="SendMessage()">Click Me!</button>
          <script type="text/javascript">
           function SendMessage() {
               ws.send("button clicked!\nHoura!")
           }
        </script>
        <br><br>
      <button type="button" onclick="CloseSocket()">Close!</button>
          <script type="text/javascript">
           function CloseSocket() {
               ws.close()
           }
        </script>

      </body>
    </html>

В моем скрипте python отсутствует код для WebSocket, который должен обрабатываться Flask-Sockets, или это проблема конфигурации на стороне IIS?

Очень жду ответа на эту, казалось бы, основную проблему.

...