IISでTCPをトランスポートするWCFの構築時手順とトラブルシューティング

IISWCFサービスをホストさせる手順と、ハマりがちな問題について。

環境

Windows server 2008 R2
IIS 7.5
.NET Framework 4

その前に簡単にリクエストの処理を理解

HTTPリクエストの場合

  1. HTTP.sysがHTTPリクエストを受信
  2. HTTP.sysがW3SVCに通知
  3. W3SVCはWASに要求を渡す
  4. WASが構成情報(applicationhost.config)を取得
  5. WASがワーカープロセスを起動
  6. WASから構成情報をW3SVCに渡す
  7. W3SVCからHTTP.sysに構成情報の通知をし、設定更新
  8. HTTP.sysがハンドラーマッピングに基づきCLRをワーカープロセスに読み込み(※1)
  9. ワーカープロセスがリクエストを処理
  10. 受け取った結果をHTTP.sysに通知
  11. HTTP.sysがHTTPレスポンスを返す。

※1 *.svcの場合、aspnet_isapi.dllが読み込まれます。 f:id:ihisa:20150617130106p:plain

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がホストしていることがわかります。 f:id:ihisa:20150619175434p:plain


構築する

1. IISのインストール

サーバーマネージャーから役割サービスの追加を行い、webサーバーを追加します。 f:id:ihisa:20150617130122p:plain

2. アプリケーションサーバーのインストール

.NET Framework3.5.1、TCPポート共有、TCPのアクティブ化を追加します。 f:id:ihisa:20150617130134p:plain

3. Net.tcp関連サービスの有効化

  • Net.Tcp Listener Adapter
  • Net.Tcp Port Sharing Service の2つのサービスを自動起動にしておきます。 f:id:ihisa:20150617130142p:plain

4. IISでnet.tcpを有効にする

IISマネージャーの対象サイトのバインド設定にnet.tcpを追加します。 f:id:ihisa:20150617130150p:plain

合わせて詳細設定の[有効なプロトコル]にnet.tcpが追加されていることを確認します。 f:id:ihisa:20150617130157p:plain

続いて上記サイトのアプリケーションの詳細設定内[有効なプロトコル]にnet.tcpを追加します。 f:id:ihisa:20150617130208p:plain

5. ポートの確認

Windows ファイアウォールにブロックされないように確認しておきます。

以上で構築完了です。


トラブルシューティング

設定は正しいのにページが表示されない

多くの場合これです。
https://msdn.microsoft.com/ja-jp/library/cc737943%28v=ws.10%29.aspx

記載の通りIISASP.NETを再登録します。

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