我目前正在将socket.io实现到我的node.js / express应用程序中。
在服务器端,我有以下代码 -
var httpServer = http.createServer(app);
var io = require('socket.io')(httpServer, { resource: appSettings.VirtualDirectory + 'socket.io' });
httpServer.listen(Port);
在客户端,我有 -
_connection = require('socket.io-client')(this._serverUrl, { query: "token={usersauthtoken}", path: "/" + (window.location.pathname.split('/').slice(0, -1).join('/') + '/socket.io').substring(1) });
这种方法在没有IISNode的情况下工作正常但是一旦我部署到我们的登台服务器,这就是问题开始发生的地方。
将应用程序放在IIS的根目录而没有虚拟目录时,客户端会显示以下错误 -
WebSocket连接到' wss://OurStagingServer.com/socket.io/?token = eyJhbGciQDiJWJzI1Ni ... I9vFloGOskkTGyQErYRtz6E& EIO = 3& transport = websocket& sid = naKugwkujh6i_v3rAAAA'失败:WebSocket握手期间出错:意外的响应代码:400
但是,看起来确实发生了连接,客户端正在拾取从服务器发出的事件。
在混合中使用虚拟目录时,我的客户端正在请求正确的URL -
https://OurStagingServer.com/VirtualDirectory/socket.io/?token= {令牌}
但是正在接收404并且来自express.js的日志显示它正在接收请求,但看起来它只是在寻找一个显然无法找到然后放弃的静态文件并返回404响应。
只有能够在根目录中部署才不是一种选择,如果不了解导致错误的原因,我也不会乐意这样做。
我已按照IISNode说明禁用web.config文件中的websockets(显然是为了阻止IIS 8使用自己的实现?)
我还应该说我使用Express 4,使用最新版本的socket.io和IISNode。