IISでWCFサービスをホストさせる手順と、ハマりがちな問題について。
環境
Windows server 2008 R2
IIS 7.5
.NET Framework 4
その前に簡単にリクエストの処理を理解
HTTPリクエストの場合
- HTTP.sysがHTTPリクエストを受信
- HTTP.sysがW3SVCに通知
- W3SVCはWASに要求を渡す
- WASが構成情報(applicationhost.config)を取得
- WASがワーカープロセスを起動
- WASから構成情報をW3SVCに渡す
- W3SVCからHTTP.sysに構成情報の通知をし、設定更新
- HTTP.sysがハンドラーマッピングに基づきCLRをワーカープロセスに読み込み(※1)
- ワーカープロセスがリクエストを処理
- 受け取った結果をHTTP.sysに通知
- HTTP.sysがHTTPレスポンスを返す。
※1
*.svcの場合、aspnet_isapi.dllが読み込まれます。
TCPリクエストの場合
HTTP.sysは当然受けないので、代わりに受けるサービスがいます。
Net.Tcp Listener Adapterがそれになります。
詳しくは以下を確認ください。
https://technet.microsoft.com/ja-jp/library/ee890772.aspx
実体たち
HTTP.sys:C:\Windows\System32\drivers\HTTP.sys
W3SVC:C:\Windows\system32\svchost.exe -k iissvcs
WAS:C:\Windows\system32\svchost.exe -k iissvcs
ワーカープロセス:C:\Windows\System32\inetsrv\w3wp.exe
svchost.exeはwindowsの汎用ホストプロセスなので、タスクマネージャーで確認する際は、列にコマンドラインを表示させるとどれがIISのプロセスなのかわかります。
なお、以下のツールを使うと詳細まで確認できます。
https://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx
これをみるとW3SVCとWASはC:\Windows\system32\inetsrv\iisw3adm.dllをsvchost.exeがホストしていることがわかります。
構築する
1. IISのインストール
サーバーマネージャーから役割サービスの追加を行い、webサーバーを追加します。
2. アプリケーションサーバーのインストール
.NET Framework3.5.1、TCPポート共有、TCPのアクティブ化を追加します。
3. Net.tcp関連サービスの有効化
4. IISでnet.tcpを有効にする
IISマネージャーの対象サイトのバインド設定にnet.tcpを追加します。
合わせて詳細設定の[有効なプロトコル]にnet.tcpが追加されていることを確認します。
続いて上記サイトのアプリケーションの詳細設定内[有効なプロトコル]にnet.tcpを追加します。
5. ポートの確認
Windows ファイアウォールにブロックされないように確認しておきます。
以上で構築完了です。
トラブルシューティング
設定は正しいのにページが表示されない
多くの場合これです。
https://msdn.microsoft.com/ja-jp/library/cc737943%28v=ws.10%29.aspx
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
※.net framework4の場合のパスです。
インストールされているASP.NETを確認するには
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -lv Microsoft(R) ASP.NET IIS 登録ツール バージョン 4.0.30319.0 ローカル コンピューターの ASP.NET をインストールおよびアンインストールするための管理ユーティリティです。 Copyright(C) Microsoft Corporation. All rights reserved. 2.0.50727.0 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll 4.0.30319.0 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll 4.0.30319.0 C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll
とすることで確認できます。(管理者権限で実行してください)
システムエラーページが表示される
[The message could not be dispatched because the service at the endpoint address is unavailable for the protocol・・・]
WCFツールのServiceModelReg.exeを用いてWCFを再構築します
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ServiceModelReg.exe -r