2017-10-11 4 views
8

Ich habe eine Webanwendung, die eine Socket-Verbindung mit einem NodeJS-Server herstellt, der über IIS-Knoten gehostet wird. Die Verbindung scheint ordnungsgemäß ausgeführt zu werden, als ich einen 404-Abfragefehler auf dem Client löste, den ich ursprünglich hatte. Jetzt sieht es jedoch so aus, als ob der Client keine Socket-Ereignisse vom IIS-Knoten empfängt.Client empfängt kein Ereignis von SocketIO über IIS Knoten

Meine Theorie ist, dass, weil IIS-Knoten wie ein Proxy agiert, das an den Client gesendete Ereignis irgendwo auf der IIS-Node-Ebene anhält.

exports.register = function(socket) { 
    User.schema.post('save', function (doc) { 
     console.log("Save socket"); 
     onSave(socket, doc); 
    }); 
} 

function onSave(socket, doc, cb) { 
    socket.emit('User List Update', doc); 
} 

Im Knoten wird das obige Ereignis ausgelöst, es wird jedoch nicht am Frontend empfangen.

Der Kunde sieht wie folgt aus:

<configuration> 
    <appSettings> 
     <add key="virtualDirPath" value="/reception" /> 
    </appSettings> 
    <system.webServer> 
     <handlers> 
      <add name="iisnode" path="server/app.js" verb="*" modules="iisnode" /> 
     </handlers> 
     <iisnode enableXFF="true" /> 
     <webSocket enabled="false"/> 
     <rewrite> 
      <rules> 
       <rule name="reception"> 
        <match url="/*" /> 
        <action type="Rewrite" url="server/app.js" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

Laufen all dies auf meinem lokalen Rechner funktioniert:

var socket = io.connect("http://myinternallyhostedserver:7777/reception"); 

socket.on('User List Update', function() { 
    console.log('Received socket event!'); 
    if (vm.enableAlert) { 
     vm.alertSound.play(); 
    } 
    vm.getUsers(); 
}); 

Meine web.config-Datei sieht wie folgt aus. Socket-Ereignisse werden gesendet und empfangen. Das Hinzufügen eines IIS-Knotens in den Workflow scheint dort zu sein, wo er nicht mehr funktioniert. Jede Hilfe würde sehr geschätzt werden.

+0

Sehen Sie, ob das hilft? https://github.com/tjanczuk/iisnode/issues/402, https://github.com/tjanczuk/iisnode/issues/268 und http://blog.novanet.no/scaling-concurrent-connections-with- node-js-and-socket-io-on-iis/ –

+0

können Sie bitte Ihre Server.js hinzufügen Mit socket.on Event Ich sehe nur Socket.emit() Ereignis – muthukumar

Antwort

2

Bei der Verwendung von socket.io mit Proxy-Pass, müssen Sie einige Variablen wie Upgrade etc. übergeben. Ich habe nicht einmal versucht, mit IIS zu Proxy-Pass socket.io, aber ich stieß auf einige Probleme in Apache-Proxy-Pass. Daher wähle ich Nginx zum Proxy-Server.

Vielleicht müssen Sie diese Art von Parametern in iis schreiben, alternativ können Sie nginx als Proxy-Pass-Server verwenden.

location/{ 
     proxy_pass http://socket_nodes_2/doSomething; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_redirect off; 

     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

upstream socket_nodes_2 { 
    server 192.168.1.155:1338; 
    server 192.168.1.156:1338; 
} 
+0

Ich möchte hinzufügen, dass, wenn Sie Proxy-Pass mit verwenden Load Balancing wie ich, Sie müssen Sitzung auf Redis oder Memcache ^^ behandeln, übrigens die veröffentlichte Ereignis beide Knoten erhalten;) –

Verwandte Themen