次の方法で共有


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

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

インターネット インフォメーション サービス (IIS: Internet Information Services) でリモート オブジェクトをホストするには、そのリモート オブジェクトを構成する必要があります。通常、これは、構成ファイル内で行うか、ホスト アプリケーションのコード内でプログラムによって行います。IIS 内でリモート オブジェクトをホストする場合、Web.config ファイルに構成情報を配置するか、Global.asax ファイルの Application_Start メソッドでリモート オブジェクトをプログラムによって構成します。

構成ファイルを使用してリモート オブジェクトを構成するには、次の操作を行います。

  • 使用する IIS 仮想ディレクトリにある Web.config ファイルに構成情報を配置します。

  • リモート処理可能な型の実装を \bin ディレクトリに配置します (または、グローバル アセンブリ キャッシュ ツール (Gacutil.exe) を使用して、グローバル アセンブリ キャッシュに配置します)。

Web.config ファイルを指定する場合、次の操作はサポートされません。

  • アプリケーション名の指定。仮想ディレクトリの名前がアプリケーション名になります。

  • .NET リモート処理構成に使用する Web.config ファイルでの <debug> 要素の使用。

  • HttpChannel 以外のチャネルの使用。

  • Web.config ファイルと <client> 要素を使用した、クライアント Web アプリケーションの自動構成。IIS をリモート処理クライアントとして使用する場合は、Global.asax ファイルの Application_Start メソッドで RemotingConfiguration.Configure を呼び出す必要があります。

Web.config ファイルには、使用する型についてシステムに通知する必要がある基本情報が含まれていますが、ホスト環境に対応するために、一部の宣言を少し変更する必要があります。たとえば、特定の HttpChannel をカスタム構成できますが、チャネルにはポートを指定しないでください。ASP.NET が負荷を処理するために別のアプリケーション ドメインを作成した場合は、リモート処理構成によって新しいアプリケーション ドメインが同じポートで再びリッスンしようとするので、例外が発生します。IIS でホストされる .NET リモート オブジェクトの 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>
y0hedwet.note(ja-jp,VS.100).gif注 :
ここに示されているチャネルには、ポートを指定しないでください。アプリケーションに特定のポートでリッスンさせる場合は、インターネット サービス マネージャーを使用して、そのポートで IIS がリッスンするように指定します。構成したチャネルが、そのポートに対して送信されたリモート要求の処理に自動的に使用されます。

サーバー側でアクティブ化される (つまり <wellknown>) オブジェクトを IIS 内で正常にホストするには、.rem または .soap で終わるオブジェクト URI (Uniform Resource Identifier) が必要です。他のホスト アプリケーション ドメインには、このような要件はありません。Soapsuds tool (Soapsuds.exe) を使用して、IIS でホストされ、サーバー側でアクティブ化されるオブジェクトのメタデータを生成する場合、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 ファイルを使用して行う例を次に示します。

<%@ Application Language="VB" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>

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
<%@ Application Language="C#" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>
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);
} 

必要なアセンブリが参照されるようにするには、次のエントリを Web.config ファイルに配置する必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
      <compilation>
        <assemblies>
          <add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </assemblies>
      </compilation>
  </system.web>
</configuration>

完全な例については、「リモート処理の例 : インターネット インフォメーション サービス (IIS: Internet Information Services) でのホスティング」を参照してください。

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

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

.NET Framework Version 1.1 以降では、この不一致が発生すると、"System.Net.WebException: 基になる接続が閉じられました: リモート サーバーとの信頼関係を確立できませんでした。" という例外がスローされます。証明書の共通名を使用するようにリモート処理クライアントを構成できない場合は、クライアント アプリケーション構成ファイルで次の設定を使用して不一致を無視できます。

<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(srvPoint As ServicePoint, certificate As X509Certificate, request As WebRequest, certificateProblem As Integer) As Boolean
      ' Check for policy common name mismatch. 
       If certificateProblem = 0 Or certificateProblem = &H800b010f Then
         Return True
      Else
         Return False
      EndIf
   End Function
End Class
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 == 0x800b010f)
         return true;
      else
         return false; 
   }
}

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

System.Net.ServicePointManager.CertificatePolicy = New MyPolicy()
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

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

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

目的の動作 構成設定 説明

クライアントの既定の資格情報を使用して、呼び出しごとにサーバーがクライアントを認証する。

サーバーで、IIS の [統合 Windows 認証] チェック ボックスをオンにし、[匿名アクセス] チェック ボックスをオフにします。

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

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

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

クライアントの既定の資格情報を使用して、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: Internet Information Services) でのホスティング