2017-10-11 36 views
8

Tôi có một ứng dụng web đang tạo kết nối socket với máy chủ NodeJS được lưu trữ thông qua nút IIS. Kết nối dường như được thực hiện đúng cách khi tôi giải quyết lỗi phiếu thăm dò 404 trên máy khách mà ban đầu tôi có. Tuy nhiên, có vẻ như máy khách không nhận được sự kiện socket từ IIS Node.Máy khách không nhận sự kiện từ SocketIO qua Nút IIS

Lý thuyết của tôi là bởi vì nút IIS hoạt động như một proxy, sự kiện được gửi lại cho máy khách đang dừng ở đâu đó ở cấp Node IIS.

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); 
} 

Trong nút, sự kiện trên sẽ kích hoạt nhưng không nhận được tiền mặt.

Client trông như thế này:

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(); 
}); 

file web.config của tôi trông như thế này:

<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> 

Chạy tất cả điều này trên máy tính địa phương của tôi làm việc đúng cách. Các sự kiện socket được gửi và nhận. Thêm nút IIS vào luồng công việc có vẻ là nơi nó ngừng hoạt động. Mọi sự trợ giúp sẽ rất được trân trọng.

+0

Xem điều này có hữu ích không? https://github.com/tjanczuk/iisnode/issues/402, https://github.com/tjanczuk/iisnode/issues/268 và http://blog.novanet.no/scaling-concurrent-connections-with- node-js-and-socket-io-on-iis/ –

+0

bạn có thể Thêm Server.js của bạn Với sự kiện socket.on Tôi chỉ thấy Socket.emit() event – muthukumar

Trả lời

2

Trong khi sử dụng socket.io với proxy pass, bạn cần phải vượt qua một số biến như nâng cấp vv. Tôi thậm chí không thử sử dụng iis để proxy pass socket.io nhưng tôi đã gặp một số vấn đề trong apache proxy pass. Vì vậy, tôi chọn nginx để máy chủ proxy.

Có thể bạn cần phải viết loại tham số này trong iis, cách khác bạn có thể sử dụng nginx làm máy chủ proxy vượt qua.

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

Tôi muốn thêm rằng nếu bạn sử dụng proxy pass với cân bằng tải như tôi, bạn cần phải xử lý phiên trên redis hoặc memcache^^, bằng cách các sự kiện được xuất bản nhận được cả hai nút;) –

Các vấn đề liên quan