0

我在使用 iisnode 让 node-express 应用程序运行时遇到了一些困难。我在 iis 中有一个简单的 http pub/sub 服务器设置。这通过 POST 接收消息,并将数据推送到相关的侦听客户端。代码...

服务器

var express = require('express');
var app = require('express').createServer();

var clients = {};

app.configure(function(){
    app.use(express.bodyParser());
    app.use(express.methodOverride());
});

app.get('/pubsubleads/leads/:id', function(request, response) {
    var id = request.params.id.toString();

    response.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    clients[id] = response;

    request.on('close', function(){
        console.log('connection closing');
        delete clients[id];
    });
});

app.post('/pubsubleads/leads', function(request, response){
    console.log('New post');

    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end();

    var id = request.body.id;

    if(clients[id] != null) {
        console.log('id = ' + id);
        console.log('data = ' + request.body.data);

        clients[id].write('id: ' + request.body.id + '\n');
        clients[id].write('data: ' + request.body.data + '\n\n');
    }
});
app.listen(process.env.PORT);
console.log('Server started on port ' + process.env.PORT);

客户

var source = new EventSource('/pubsub/data/@Session.SessionID');

source.onopen = function (e) {
    alert('onopen');
    document.body.innerHTML += 'Connected <br>';
};

source.onmessage = function (e) {
    alert('onmessage: ' + e.data);
    document.body.innerHTML += e.data + '<br/>';
};

source.onerror = function (e) {
    if (e.readyState == EventSource.CLOSED) {
        alert('closed');
    }
};

...传递给 EventSource url 的参数是唯一标识此客户端的东西。

服务器和客户端托管在同一根域下的不同子域上。我已确认服务器正在正确接收消息。我遇到的问题是客户端事件处理程序永远不会被击中。我尝试将客户端代码包装在 a 中,$(document).ready()但这没有影响。我已经使用独立的节点进程在 IIS 之外复制了设置,并且可以正常工作。

我在 Windows 7 64 位上使用 Chrome 18、nodejs 0.6.18、iisnode、IIS 7.5。

我的想法很新鲜,并且无法找到在线讨论的任何类似问题。任何帮助,将不胜感激。

4

2 回答 2

3

默认情况下,IIS 在刷新前缓存最多 4MB 的响应数据,这在响应较短和静态文件的情况下提高了性能。您似乎打算随着时间的推移将短数据块流式传输回客户端,并期望这些数据块的传输延迟较低。

iisnode 允许您通过在每次写入后强制刷新响应数据来覆盖此默认 IIS 行为。请将 web.config 中的 system.webServer\iisnode\@flushResponse 配置设置设置为 true (https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config#L90) 转这种行为就。或者,如果您升级到 iisnode v0.1.19 或更高版本,您也可以使用新的 iisnode.yml 配置文件设置此值(请参阅http://tomasz.janczuk.org/2012/05/yaml-configuration-support-in -iisnode.html了解详细信息)。

于 2012-05-22T15:57:28.300 回答
0

EventSource 没有与 WebSockets 相同的客户端 API。您需要使用addEventListener

source.addEventListener('open', function (e) {
    // opened
});

source.addEventListener('message', function (e) {
    // e.data
});

source.addEventListener('error', function (e) {
    // whoops
});
于 2012-05-22T10:57:56.513 回答