Как настроить IIS в Azure для потоковой передачи фрагментированных данных из приложения Node.js?

У меня есть приложение Node.js, которое использует Transfer-Encoding: Chunked непрерывно передавать данные через HTTP, пока клиент не отключится. При запуске локального экземпляра Node он работает нормально, но при развертывании в службе приложений Azure (которая запускает приложения Node через iisnode) клиентские соединения зависают, даже не получая данные.

Ведение журнала означает, что приложение Node правильно обрабатывает запросы и передает данные, но по какой-то причине данные не доходят до клиента.

Вот упрощенный пример того, как я передаю данные из Node:

var server = http.createServer();
server.on('request', function(request, response) {
    var interval = setInterval(function() {
        response.write("some data\r\n");
    }, 1000);
    request.on('close', function() {
        clearInterval(interval);
    });
});
server.listen(config.port);

В моем iisnode.yml Конфигурационный файл, который я установил flushResponse: true предотвратить iisnode от буферизации ответных блоков.

Я предполагаю, что IIS пытается буферизовать весь ответ перед отправкой, но я не знаю, как отключить это поведение.

3 ответа

У меня была точно такая же проблема. Задавать flushResponse чтобы быть правдой в web.config - см. https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config для получения полного списка параметров.

Итак, у вас есть строка в web.config:

<iisnode flushResponse="true"/>
on('request', function(request, response) {
    var interval = setInterval(function() {
        response.write("some data\r\n");
    }, 1000);
    request.on('close', function() {
        clearInterval(interval);
    }
}

Я предполагаю, что вы используете IIS на своей виртуальной машине (и не используете службу приложений Azure).
Этот вопрос SO дает несколько указаний, как отключить буферизацию ответов IIS (также известную как AspBufferingOn).

В основном вам нужно установить функцию ASP, и эта опция будет отображаться в IIS Manager (подробности см. Здесь).

Другие вопросы по тегам