WebMatrix 3 を使うと簡単に Node.js と Socket.IO の開発環境を作ることが出来ますが、Socket.IO で WebSocket を使おうとするとコネクションが途中でフリーズしてしまいます。
本来なら 101 Switching Protocols で HTTP から WebSocket への切り替えになるのですが、Pending のまま応答がありません。
調べてみると、IIS 8.0 Express ではデフォルトで WebSocketModule が有効になっているので、iisnode の WebSocket と競合してしまっていたようです。
Tomek on Software: How to use WebSockets with node.js apps hosted in iisnode
なので、大人しく iisnode の人に従って、IIS に組み込まれている WebSocketModule を無効にする設定を Web.config へ追加します。
<system.webServer> <!-- IIS の WebSocketModule を無効にする --> <webSocket enabled="false" /> </system.webServer>
これで試してみると、今度は以下のようなエラーになってしまいました。
どうやら Web.config では webSocket 要素での設定変更が許可されていないようです。
仕方ないので applicationhost.config を開いて、configSections 要素内にある webSocket の設定を以下のように修正します。
<!-- overrideModeDefault を Allow に変更する --> <!--<section name="webSocket" overrideModeDefault="Deny" />--> <section name="webSocket" overrideModeDefault="Allow" />
これで Web.config から webSocket の設定を変更出来るようになります。
そしてもう一度試してみると、今度はバッチリと 101 Switching Protocols で HTTP から WebSocket への切り替えが行われました。
そういえば、WebMatrix 2 の時は iisnode のバージョンが古くて WebSocket に対応していませんでしたが、WebMatrix 3 で入ってくる iisnode は 0.2.4 だったので、WebSocket が使えるバージョンになっていました。
この手順でも WebSocket が使えない場合は、一度 iisnode を削除してから WebMatrix の Node.js テンプレートを選んで、インストールし直すのが良いかもしれません。