次の方法で共有


WCF サービスと ASP.NET

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

ASP.NET を使用して WCF をサイド バイ サイドでホストする

インターネット インフォメーション サービス (IIS) でホストされている WCF サービスは、1 つの共通アプリケーション ドメイン内の ASPX ページと ASMX Web サービス。 ASP.NET は、WCF と ASP.NET HTTP ランタイムの両方に対して、AppDomain 管理や動的コンパイルなどの一般的なインフラストラクチャ サービスを提供します。 WCF の既定の構成は、ASP.NET と並べて表示されます。

WCF サービスと ASP .NET: 共有状態を示すスクリーンショット。

ASP.NET HTTP ランタイムは ASP.NET 要求を処理しますが、WCF サービス宛ての要求の処理には関与しません。ただし、これらのサービスは、ASP.NET コンテンツと同じ AppDomain でホストされています。 代わりに、WCF サービス モデルは、WCF サービスにアドレス指定されたメッセージをインターセプトし、WCF トランスポート/チャネル スタックを介してルーティングします。

サイド バイ サイド モデルの結果は次のとおりです。

  • ASP.NET および WCF サービスは AppDomain 状態を共有できます。 2 つのフレームワークは同じ AppDomain に共存できるため、WCF は AppDomain 状態を ASP.NET (静的変数、イベントなど) と共有することもできます。

  • WCF サービスは、ホスティング環境やトランスポートに関係なく、一貫して動作します。 ASP.NET HTTP ランタイムは、IIS/ASP.NET ホスティング環境と HTTP 通信に意図的に結合されます。 逆に、WCF は、ホスト環境間 (WCF は IIS の内部と外部の両方で一貫して動作します) とトランスポート (IIS 7.0 以降でホストされるサービス) 間で一貫した動作をするように設計されています。これらのエンドポイントの一部が HTTP 以外のプロトコルを使用している場合でも、公開されるすべてのエンドポイントで一貫した動作が行われます。

  • AppDomain 内では、HTTP ランタイムによって実装される機能は ASP.NET コンテンツには適用されますが、WCF には適用されません。 ASP.NET アプリケーション プラットフォームの多くの HTTP 固有の機能は、ASP.NET コンテンツを含む AppDomain 内でホストされている WCF サービスには適用されません。 これらの機能の例を次に示します。

    • HttpContext: は、WCF サービス内からアクセスすると常にされます。 RequestContext を代わりに使用します。

    • ファイルベースの承認: WCF セキュリティ モデルでは、サービス要求が承認されているかどうかを判断するときに、サービスの .svc ファイルに適用されるアクセス制御リスト (ACL) は許可されません。

    • 構成ベースの URL 承認: 同様に、WCF セキュリティ モデルは、System.Web の <authorization> 構成要素で指定された URL ベースの承認規則に準拠していません。 これらの設定は、サービスが ASP.NET の URL 承認規則によって保護された URL 空間に存在する場合、WCF 要求では無視されます。

    • HttpModule 拡張機能: WCF ホスティング インフラストラクチャは、 PostAuthenticateRequest イベントが発生したときに WCF 要求をインターセプトし、ASP.NET HTTP パイプラインに処理を返しません。 パイプラインの後のステージで要求をインターセプトするようにコーディングされたモジュールは、WCF 要求をインターセプトしません。

    • ASP.NET 偽装: 既定では、ASP.NET が System.Web の <identity impersonate="true" /> 構成オプションを使用して偽装を有効にするように設定されている場合でも、WCF 要求は常に IIS プロセス ID として実行されます。

これらの制限は、IIS アプリケーションでホストされている WCF サービスにのみ適用されます。 ASP.NET コンテンツの動作は、WCF の存在の影響を受けません。

従来 HTTP パイプラインによって提供される機能を必要とする WCF アプリケーションでは、ホストとトランスポートに依存しない WCF に相当するものの使用を検討する必要があります。

または、WCF の ASP.NET 互換モードでサービスを実行することを検討できます。

ASP.NET 互換モードでの WCF サービスのホスト

WCF モデルは、ホスティング環境とトランスポート間で一貫して動作するように設計されていますが、多くの場合、アプリケーションでこの程度の柔軟性を必要としないシナリオがあります。 WCF の ASP.NET 互換モードは、IIS の外部でホストしたり、HTTP 以外のプロトコルを介して通信したりする必要はありませんが、ASP.NET Web アプリケーション プラットフォームのすべての機能を使用するシナリオに適しています。

WCF ホスティング インフラストラクチャが WCF メッセージをインターセプトして HTTP パイプラインからルーティングする既定のサイド バイ サイド構成とは異なり、ASP.NET 互換モードで実行されている WCF サービスは、ASP.NET HTTP 要求ライフサイクルに完全に参加します。 互換性モードでは、WCF サービスは、ASPX ページと ASMX Web サービスの要求の処理方法と同様に、 IHttpHandler 実装を介して HTTP パイプラインを使用します。 その結果、WCF は、次の ASP.NET 機能に関して ASMX と同じように動作します。

  • HttpContext: ASP.NET 互換モードで実行されている WCF サービスは、 Current とそれに関連付けられている状態にアクセスできます。

  • ファイル ベースの承認: ASP.NET 互換モードで実行されている WCF サービスは、ファイル システムのアクセス制御リスト (ACL) をサービスの .svc ファイルにアタッチすることでセキュリティで保護できます。

  • 構成可能な URL 承認: WCF サービスが互換性モードで実行されている場合、ASP.NET の URL 承認規則が WCF 要求 ASP.NET 適用されます。

  • HttpModuleCollection 機能拡張: ASP.NET 互換モードで実行されている WCF サービスは、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 互換モードが有効になっているアプリケーション内で実行するかどうかを制御できます。 サービスは、 AspNetCompatibilityRequirementsAttribute を使用して、互換性モード ASP.NET サポートしているかどうかを示すことができます。 この属性の既定値は 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 サービスが正常にアクティブ化されます。

IIS 7.0 と WAS では、WCF サービスが HTTP 以外のプロトコルを介して通信できます。 ただし、互換性モードを有効にしたアプリケーションで実行されている WCF サービス ASP.NET、HTTP 以外のエンドポイントを公開することはできません。 このような構成では、サービスが最初のメッセージを受信すると、アクティブ化例外が生成されます。

WCF サービスの ASP.NET 互換モードを有効にする方法の詳細については、 AspNetCompatibilityRequirementsModeASP.NET 互換性 のサンプルを参照してください。

こちらも参照ください