WCF サービスと ASP.NET
ここでは、Windows Communication Foundation (WCF) サービスを ASP.NET とサイド バイ サイドでホストし、これらを ASP.NET 互換モードでホストする方法について解説します。
WCF を ASP.NET とサイド バイ サイドでホストする方法
WCF サービスを Internet Information Services (IIS) 上で稼働させる場合、これを .ASPX ページや ASMX Web サービスと同じアプリケーション ドメイン内に置くことができます。ASP.NET には、AppDomain の管理、動的コンパイルなどの共通インフラストラクチャ サービスが組み込まれており、WCF と ASP.NET HTTP ランタイムのどちらにも対応しています。WCF の既定の構成は、ASP.NET とサイド バイ サイドになっています。
ASP.NET の HTTP ランタイムは、ASP.NET 向けの要求を処理しますが、同じ AppDomain 上で稼働していても、WCF サービスに対する要求の処理には関与しません。WCF のサービス モデルは、個々の WCF サービスに向けられたメッセージを途中受信し、WCF のトランスポート/チャネル スタックを介して転送します。
この結果、サイド バイ サイド モデルは次のようになります。
- ASP.NET と WCF サービスは、AppDomain の状態を共有できます。どちらのフレームワークも同じ AppDomain に共存できるので、WCF は AppDomain の状態 (静的変数、イベントなど) も、ASP.NET と共有できます。
- WCF サービスは、ホスティング環境や伝送方式にかかわらず、動作が一貫しています。ASP.NET HTTP ランタイムは意図的に、IIS/ASP.NET ホスティング環境や HTTP 通信と強く結合する形で設計されています。一方 WCF は、ホスティング環境やトランスポートの種類に関係なく同じように動作します。WCF の動作は IIS の内部でも外部でも同じであり、IIS 7.0 でホストされているサービスは、HTTP 以外のプロトコルを使用するエンドポイントを含め、すべてのエンドポイントで動作が同じです。
- HTTP ランタイムに実装された機能は、同じ AppDomain 内でも、ASP.NET のコンテンツには適用されますが、WCF には適用されません。ASP.NET アプリケーション プラットフォームに含まれている HTTP 固有の機能の多くは、ASP.NET コンテンツが含まれている AppDomain 内でホストされている WCF サービスには適用されません。このような機能の例を次に示します。
- HttpContext : WCF のサービスからアクセスされた場合、Current は常に null を返します。
- ファイル ベースの承認 : WCF のセキュリティ モデルでは、サービス要求が承認済みであるかどうかを判断する際、アクセス制御リスト (ACL) をサービスの .svc ファイルに適用することはできません。
- 構成ベースの URL 承認 : 同様に、WCF のセキュリティ モデルでは、System.Web の <authorization> 構成要素で指定された、URL ベースの承認規則が順守されません。ASP.NET の URL 承認規則によって保護された URL 空間にサービスが存在する場合、WCF 要求に関しては、これらの設定が無視されます。
- HttpModule の拡張機能 : WCF ホスティング インフラストラクチャは、PostAuthenticateRequest イベントが発生すると WCF に対する要求を途中受信します。ASP.NET HTTP パイプラインには制御を返しません。したがって、パイプラインのこれ以降の段階で要求を途中受信するよう設計されたモジュールは、WCF に対する要求を途中受信できません。
- ASP.NET の偽装 : 既定では、WCF に対する要求は常に IIS のプロセス ID で実行されます。ASP.NET で、System.Web の <identity impersonate="true" /> という構成オプションにより偽装を有効にしていても同様です。
以上の制約は、IIS アプリケーション上で稼働する WCF サービスにのみ適用されます。ASP.NET コンテンツの動作が、WCF の有無によって変わることはありません。
従来 HTTP パイプラインにより提供されていた機能を必要とする WCF アプリケーションは、WCF に組み込まれている、同等の機能の使用を検討します。これらは、特定のホストやトランスポートに依存しません。
- OperationContext (HttpContext の代わり)
- ServiceAuthorizationBehavior (ASP.NET のファイル ベースまたは URL ベースの承認の代わり)
- IDispatchMessageInspector または独自の階層チャネル (HTTP モジュールの代わり)
- WCF による各操作の偽装 (System.Web による偽装の代わり)
また、サービスを WCF の ASP.NET 互換モードで実行することも検討します。
WCF サービスを ASP.NET 互換モードで提供する方法
WCF モデルはホスティング環境やトランスポートにかかわらず一貫した動作をするように設計されていますが、アプリケーションによっては、このレベルの柔軟性が必要とされない場合も少なくありません。WCF の ASP.NET 互換モードはこのように、IIS 以外で動作したり、HTTP 以外のプロトコルで通信したりする必要がない代わりに、ASP.NET Web アプリケーション プラットフォームのあらゆる機能を活用したい場合に適しています。
既定であるサイド バイド サイドの構成では、WCF ホスティング インフラストラクチャが WCF メッセージを途中受信し、HTTP パイプラインを使用せずに処理されました。これと異なり、ASP.NET 互換モードで実行される WCF サービスは、ASP.NET の HTTP 要求と同じライフサイクルになります。互換モードでは、WCF サービスは、IHttpHandler を実装することにより HTTP パイプラインを使用します。これはASPX ページや ASMX Web サービスに対する要求を処理する方法と同じです。したがって、WCF は、次に挙げるような ASP.NET の機能に関して、ASMX とまったく同じように動作します。
- ASP NET 互換モードで動作する HttpContext: WCF サービスは、Current やこれに関連する状態にアクセスできます。
- ファイル ベースの承認 : ASP.NET 互換モードで稼動する WCF サービスは、ファイル システムのアクセス制御リスト (ACL) をサービスの .svc ファイルに関連付けることによって、セキュリティで保護されます。
- URL 承認の設定 : ASP.NET の URL 承認規則は、WCF のサービスが ASP.NET 互換モードで動作していれば、WCF に対する要求にも適用されます。
- HttpModuleCollection の拡張機能 : WCF サービスを ASP.NET 互換モードで実行した場合は、ASP.NET の HTTP 要求と同じライフサイクルになるので、HTTP パイプラインに構成された HTTP モジュールはすべて、サービス起動の前後で、WCF に対する要求を処理できます。
- ASP.NET の偽装 : WCF サービスは、ASP.NET の偽装されたスレッドの ID で動作します。アプリケーションで ASP.NET の偽装が有効になっている場合、これは IIS プロセスの ID とは異なります。特定のサービス操作に対して ASP.NET と WCF の両方の偽装が有効になっている場合、サービスは最終的に WCF から取得された ID で動作します。
WCF の ASP.NET 互換モードは、アプリケーションごとに、その Web.config ファイルに次のような記述をすることにより有効になります。
<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled=”true” /> </system.serviceModel>
既定値は false です。値が true に設定されていれば、アプリケーション上で動作する WCF サービスがすべて、ASP.NET 互換モードで実行されることを示します。
ASP.NET 互換モードでは、要求の処理方法が WCF の既定の構成とまったく異なるので、個々のサービス実装は、ASP.NET 互換モードが有効化されているアプリケーション内で動作するかどうかを制御できます。各サービスは、ASP.NET 互換モードをサポートするかどうかを、AspNetCompatibilityRequirementsAttribute で示すことができます。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
アプリケーション全体を互換モードにしたとき、個々のサービスのサポート レベルがどうなるかを表に示します。
アプリケーション全体の互換モード設定 | AspNetCompatibilityRequirementsMode 設定 | 実際の動作 |
---|---|---|
aspNetCompatibilityEnabled = “true” |
サービスは正常に動作します。 |
|
aspNetCompatibilityEnabled = “true” |
サービスは正常に動作します。 |
|
aspNetCompatibilityEnabled = “true” |
サービスがメッセージを受信した時点でアクティベーション エラーが発生します。 |
|
aspNetCompatibilityEnabled = “false” |
Required |
サービスがメッセージを受信した時点でアクティベーション エラーが発生します。 |
aspNetCompatibilityEnabled = “false” |
Allowed |
サービスは正常に動作します。 |
aspNetCompatibilityEnabled = “false” |
NotAllowed |
サービスは正常に動作します。 |
メモ : |
---|
IIS 7.0 や WAS 上で稼働する WCF サービスは、HTTP 以外のプロトコルでも通信できます。しかし WCF サービスが ASP.NET 互換モードのアプリケーション上で動作している場合、HTTP 以外のエンドポイントと通信することはできません。最初のメッセージを受信した時点で、アクティベーション例外が発生します。 |
WCF サービスの ASP.NET 互換モードの詳細については、AspNetCompatibilityRequirementsMode を参照してください。