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 に渡されるパラメーターは、このクライアントを一意に識別するものです。

サーバーとクライアントは、同じルート ドメインの下の別のサブドメインでホストされます。サーバーがメッセージを正しく受信していることを確認しました。私が抱えている問題は、クライアント イベント ハンドラーがヒットしないことです。クライアント コードを でラップしようとしました$(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 には、WebSocket と同じクライアント側 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 に答える