如何在 Azure 上配置 IIS 以从 Node.js 应用程序流式传输分块数据?

如何在 Azure 上配置 IIS 以从 Node.js 应用程序流式传输分块数据?

我有一个 Node.js 应用,它用于Transfer-Encoding: Chunked通过 HTTP 持续传输数据,直到客户端断开连接。在运行 Node 的本地实例时,它运行良好,但当部署到 Azure 应用服务(通过iis节点),客户端连接挂起而从未接收数据。

日志记录表明 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 尝试在发送之前缓冲整个响应,但我不知道如何禁用此行为。

答案1

我遇到了完全相同的问题。设置flushResponse为 true web.config- 请参阅https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config以获得完整的选项列表。

因此,你应该在web.config

<iisnode flushResponse="true"/>

答案2

我假设您在虚拟机上运行 IIS(并且不使用 Azure 应用服务)。
那么问题来了给出了一些如何禁用 IIS 响应缓冲(又名AspBufferingOn)。

基本上你需要安装ASP 功能该选项将显示在 IIS 管理器中(查看详细信息这里)。

答案3

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

相关内容