インターネット インフォメーション サービス (IIS) でのリモート オブジェクトの管理

インターネット インフォメーション サービス (IIS: Internet Information Services) を使用してリモート型を管理する場合は、ホスト アプリケーション ドメインが IIS と ASP.NET によって作成されているため、ホスト プロセス内でリモート型のリモート処理システムをプログラムによって直接構成することはできません。ただし、他の種類のアプリケーション ドメインでプログラムによって行うことのできる設定の大部分は、Global.asax ファイルを使用して行うことができます。ホスト プロセスが IIS である場合、構成ファイルを使用してリモート処理を設定するには、次の作業が必要です。

  • 使用する IIS 仮想ディレクトリの Web.config ファイルに構成情報を配置します。
  • リモート処理型の実装を \bin ディレクトリに配置します (または、グローバル アセンブリ キャッシュ ツール (Gacutil.exe) を使用して、リモート処理型の実装をグローバル アセンブリ キャッシュに配置します)。

また、行うことができない作業は次のとおりです。

  • IIS で管理する場合、アプリケーション名は指定できません。仮想ディレクトリの名前がアプリケーション名になります。
  • .NET リモート処理設定に使用する Web.config ファイルでは、<debug> 要素は使用できません。
  • HttpChannel 以外のチャネルは使用できません。
  • クライアント Web アプリケーションを自動的に設定する場合は、Web.config ファイルおよび <client> 要素は使用できません。IIS をリモート クライアントとして使用する場合は、Global.asax ファイルの Application_Start メソッドの中で RemotingConfiguration.Configure を呼び出す必要があります。

リモート処理用の構成ファイルには、使用する型についてシステムに知らせる必要のある基本的情報が含まれますが、管理環境に適応させるために、一部の宣言を若干変更する必要があります。たとえば、特定の HttpChannel をカスタム設定できますが、チャネルに対してポートを指定することは避ける必要があります。これは、ASP.NET が負荷を処理するために別のアプリケーション ドメインを生成した場合、リモート処理設定を行ったことにより新しいアプリケーション ドメインが同じポートで再び待機しようとし、例外を引き起こすためです。たとえば IIS で管理される .NET リモート処理 XML Web サービスの単純な Web.config ファイルは、次に示すコード例のようになります。この場合は、使用するインスタンスにチャネルのプロパティ (この例では priority プロパティ) を追加する以外には、チャネル設定の行を組み込む必要がないことに注意してください。

<configuration>
   <system.runtime.remoting>
      <application>
         <service>
            <wellknown 
               mode="Singleton" 
               type="ServiceClass, ServiceClassAssemblyName"
                objectUri="ServiceClass.rem"
            />
         </service>
         <channels>
            <channel 
               name="MyChannel" 
               priority="100" 
               ref="http"
            />
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>

メモ   ここで示されているどのチャネルにもポートを指定しないでください。アプリケーションを特定のポートで待機させる場合は、Internet Services Manager を使用して、IIS をそのポートで待機させます。設定したチャネルは、そのポートに送信されたリモート要求を処理するために自動的に使用されます。

サーバー側でアクティブ化される (つまり <wellknown>) オブジェクトを IIS 内で正しく管理するには、".rem" または ".soap." で終わるオブジェクト URI (Uniform Resource Identifier) が必要です。他のホスト アプリケーション ドメインには、このような要件はありません。IIS で管理されてサーバー側でアクティブ化されるオブジェクトのメタデータを、Soapsuds ツール (Soapsuds.exe) を使用して作成する場合、Soapsuds.exe に引数として渡す URL は次のようになります。

http://<Computer>:<Port>/<VirtDir>/<ObjectURI>?wsdl

IIS またはその他のアプリケーション ドメインで管理され、クライアントでアクティブ化されるオブジェクトの場合には、オブジェクト URI は必要ありません。Soapsuds.exe に引数として渡す URL は次のようになります。

http://<Computer>:<Port>/<VirtDir>/RemoteApplicationMetadata.rem?wsdl

IIS でプログラムを使用して設定を行うには、Global.asax ページを使用します。上に示した構成ファイルと同じ設定を、Global.asax ファイルを使用して行う例を次に示します。

Sub Application_Start()
   Dim props = New Hashtable() As IDictionary
   props("name") = "MyChannel" 
   props("priority") = "100" 
   ' Nothing entries specify the default formatters.
   Dim channel As New HttpChannel( _
      props, _
      Nothing, _
      Nothing _
   )
   ChannelServices.RegisterChannel(channel)
   Dim WKSTE As New WellKnownServiceTypeEntry( _
      GetType(ServiceClass), _
      "HttpService", _
      WellKnownObjectMode.SingleCall
   )
   RemotingConfiguration.RegisterWellKnownServiceType(WKSTE)
End Sub
[C#]
void Application_Start(){
   IDictionary props = new Hashtable();
   props["name"] = "MyChannel";
   props["priority"] = "100";
   // Null entries specify the default formatters.
   HttpChannel channel = new HttpChannel(
      props, 
      null, 
      null
   );
   ChannelServices.RegisterChannel(channel);
   WellKnownServiceTypeEntry WKSTE = new WellKnownServiceTypeEntry(
      typeof(ServiceClass),
      "HttpService", 
      WellKnownObjectMode.SingleCall
   );
   RemotingConfiguration.RegisterWellKnownServiceType(WKSTE);
} 

つまり、IIS の場合でも、他の種類のホスト アプリケーション ドメインの場合と同様にサービスを管理できます。完全な例については、「リモート処理の例 : インターネット インフォメーション サービス (IIS) での管理」を参照してください。

.NET リモート処理での SSL 証明書の使用

証明書は、特定のコンピュータを識別します。コンピュータの名前は、証明書の共通名に指定されています。しかし、コンピュータの名前を変更したり、クライアント構成ファイルで "localhost" を使用することは簡単にできるため、クライアントとサーバー証明書の共通名との間で不一致が発生します。.NET Framework Version 1.0 では、この不一致は無視され、呼び出しがサーバー上で実行されます。

.NET Framework Version 1.1 以降では、この不一致によって "System.Net.WebException: The underlying connection was closed: Could not establish trust relationship with remote server." という例外がスローされます。証明書の共通名を使用するようにリモート クライアントを構成できない場合は、クライアント アプリケーションの構成ファイルで次の設定を使用して、不一致をオーバーライドできます。

<system.net>
   <settings>
      <servicePointManager
         checkCertificateName="true"
      />
   </settings>
</system.net>

クライアントが証明書名の不一致を無視するようにプログラムで設定するには、クライアント側で、ICertificatePolicy インターフェイスを実装するクラスのインスタンスを作成し、CheckValidationResult メソッドを実装して、certificateProblem 値が 0x800c010f のときに true を返すようにする必要があります。次に、そのオブジェクトを ServicePointManager.CertificatePolicy プロパティに渡すことによって、そのオブジェクトを System.Net.ServicePointManager オブジェクトに登録することが必要です。基本的な実装を次のコードで示します。

Public Class MyPolicy Implements ICertificatePolicy 
   Public Function CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, Integer certificateProblem) As Boolean
      ' Check for policy common name mismatch. 
       If certificationProblem = 0 Or certificateProblem = &H800c010f Then
         Return True
      Else
         Return False
   End Function
End Class
[C#]
public class MyPolicy : ICertificatePolicy {
   public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) {
      // Check for policy common name mismatch. 
      if (certificateProblem == 0 || certificateProblem == 0x800c010f)
         return true;
      else
         return false; 
   }
}

上のクラスのインスタンスを System.Net ServicePointManager に登録するコードを次に示します。

System.Net.ServicePointManager.CertificatePolicy = New MyPolicy()
[C#]
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

IIS がホストするリモート処理アプリケーションでの認証

インターネット インフォメーション サービス (IIS) でサービスをホストするとき、.NET リモート処理の特定の種類の認証動作を有効にする構成設定を次の表に示します。

目的の動作 構成設定 コメント
クライアントの既定の資格情報を使用して、呼び出しのたびにサーバーがクライアントを認証する。 サーバー上で、IIS の [統合 Windows 認証] を選択し、[匿名アクセス] をオフにします。

クライアント上で、CredentialCache.DefaultCredentials を使用するように credentials を設定します。

これは、.NET Framework Version 1.0 で useDefaultCredentialstrue に設定されているときの既定の動作です。

この動作は、.NET Framework Version 1.1 で、useAuthenticatedConnectionSharingfalse に設定されている場合にサポートされます。

クライアントの既定の資格情報を使用して、サーバーが 1 度だけクライアントを認証する。このクライアントからの以降の呼び出しは、前に認証された接続を使用する。 サーバー上で、IIS の [統合 Windows 認証] を選択し、[匿名アクセス] をオフにします。

クライアント上で、useDefaultCredentialstrue に設定します。

この動作は、.NET Framework Version 1.1 以降だけでサポートされます。
カスタムの資格情報または明示的に指定された資格情報を使用して、サーバーが 1 度だけクライアントを認証する。このクライアントからの以降の呼び出しは、前に認証された接続を使用する。 サーバー上で、IIS の [統合 Windows 認証] を選択し、[匿名アクセス] をオフにします。

クライアント上で、credentialsICredentials の実装に設定するか、usernamepassword、および domain に明示的に値を設定します。いずれの場合でも、unsafeAuthenticatedConnectionSharingtrue に設定し、connectionGroupName の値は 1 人の認証ユーザーだけに割り当てられるように指定します。

この動作は、.NET Framework Version 1.1 以降だけでサポートされます。

参照

アクティベーション URL | 構成 | リモート処理設定スキーマ | リモート処理の例 : インターネット インフォメーション サービス (IIS) での管理