Как настроить 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 (подробности см. Здесь).