読者です 読者をやめる 読者になる 読者になる

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

WebMatrix 3 と iisnode の環境で WebSocket を有効にする方法

WebMatrix 3 を使うと簡単に Node.js と Socket.IO の開発環境を作ることが出来ますが、Socket.IO で WebSocket を使おうとするとコネクションが途中でフリーズしてしまいます。

f:id:shiba-yan:20130725010424p:plain

本来なら 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>

これで試してみると、今度は以下のようなエラーになってしまいました。

f:id:shiba-yan:20130725010824p:plain

どうやら 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 への切り替えが行われました。

f:id:shiba-yan:20130725011201p:plain

そういえば、WebMatrix 2 の時は iisnode のバージョンが古くて WebSocket に対応していませんでしたが、WebMatrix 3 で入ってくる iisnode は 0.2.4 だったので、WebSocket が使えるバージョンになっていました。

この手順でも WebSocket が使えない場合は、一度 iisnode を削除してから WebMatrix の Node.js テンプレートを選んで、インストールし直すのが良いかもしれません。