WCF サービスと ASP.NET

このトピックでは、Windows Communication Foundation (WCF) サービスを ASP.NET とサイド バイ サイドでホストする方法、およびそれらを ASP.NET 互換モードでホストする方法について説明します。

WCF を ASP.NET とサイド バイ サイドでホストする

Internet Information Services (IIS) でホストされている WCF サービスは、.ASPX ページや ASMX Web サービスと同じ単一の共通アプリケーション ドメイン内に置くことができます。 ASP.NET には、AppDomain 管理や動的コンパイルなど、WCF と ASP.NET HTTP ランタイムの両方に対応する共通インフラストラクチャ サービスが用意されています。 WCF の既定の構成は、ASP.NET とのサイド バイ サイドです。

Screenshot showing WCF Services and ASP .NET: sharing state.

ASP.NET の HTTP ランタイムは、ASP.NET 向けの要求を処理しますが、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 です。 代わりに RequestContext を使用してください

    • ファイル ベースの承認: 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 に組み込まれている、同等の機能の使用を検討します。これらは、特定のホストやトランスポートに依存しません。

また、サービスを 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 とまったく同じように動作します。

  • HttpContext: ASP.NET 互換モードで動作する 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 です。 値が false の場合は、アプリケーションで動作する WCF サービスがすべて、ASP.NET 互換モードでは実行されないことを示します。

ASP.NET 互換モードでは、要求の処理方法が WCF の既定の構成とまったく異なるので、個々のサービス実装で、ASP.NET 互換モードが有効化されているアプリケーション内で動作するかどうかを制御できます。 各サービスは、ASP.NET 互換モードをサポートするかどうかを、AspNetCompatibilityRequirementsAttribute で示すことができます。 この属性の既定値は Allowed です。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

アプリケーション全体を互換モードにしたとき、個々のサービスのサポート レベルがどうなるかを表に示します。

アプリケーション全体の互換モード設定 AspNetCompatibilityRequirementsMode

設定
実際の動作
aspNetCompatibilityEnabled = "true" Required サービスは正常に動作します。
aspNetCompatibilityEnabled = "true" Allowed サービスは正常に動作します。
aspNetCompatibilityEnabled = "true" NotAllowed サービスがメッセージを受信した時点でアクティベーション エラーが発生します。
aspNetCompatibilityEnabled = "false" Required サービスがメッセージを受信した時点でアクティベーション エラーが発生します。
aspNetCompatibilityEnabled = "false" Allowed サービスは正常に動作します。
aspNetCompatibilityEnabled = "false" NotAllowed サービスは正常に動作します。

Note

IIS 7.0 や WAS 上で稼働する WCF サービスは、HTTP 以外のプロトコルでも通信できます。 しかし WCF サービスが ASP.NET 互換モードのアプリケーション上で動作している場合、HTTP 以外のエンドポイントと通信することはできません。 最初のメッセージを受信した時点で、アクティベーション例外が発生します。

WCF サービスの ASP.NET 互換モードの有効化の詳細については、「AspNetCompatibilityRequirementsMode」と「ASP.NET 互換性」のサンプルを参照してください。

関連項目