インターネット インフォメーション サービス (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
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: 基になる接続が閉じられました。リモート サーバーとの信頼関係を確立できませんでした。" という例外がスローされます。証明書の共通名を使用するようにリモート クライアントを構成できない場合は、クライアント アプリケーションの構成ファイルで次の設定を使用して、不一致を無効にすることができます。
<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 認証] をクリックし、[匿名アクセス] をオフにします。 クライアント上で、CredentialCache.DefaultCredentials を使用するように credentials を設定します。 |
これは、.NET Framework Version 1.0 で useDefaultCredentials が true に設定されているときの既定の動作です。 この動作は、.NET Framework Version 1.1 で、useAuthenticatedConnectionSharing も false に設定されている場合にサポートされます。 |
クライアントの既定の資格情報を使用して、サーバーが 1 度だけクライアントを認証する。このクライアントからの以降の呼び出しは、前に認証された接続を使用する。 |
サーバー上で、IIS の [統合 Windows 認証] をクリックし、[匿名アクセス] をオフにします。 クライアント上で、useDefaultCredentials を true に設定します。 |
この動作は、.NET Framework Version 1.1 以降だけでサポートされます。 |
カスタムまたは明示的に指定されたクライアントの資格情報を使用して、サーバーが 1 度だけクライアントを認証する。このクライアントからの以降の呼び出しは、前に認証された接続を使用する。 |
サーバー上で、IIS の [統合 Windows 認証] をクリックし、[匿名アクセス] をオフにします。 クライアント上で、credentials を ICredentials の実装に設定するか、username、password、および domain に明示的に値を設定します。いずれの場合でも、unsafeAuthenticatedConnectionSharing を true に設定し、connectionGroupName の値は 1 人の認証ユーザーだけにマップされるように指定します。 |
この動作は、.NET Framework Version 1.1 以降だけでサポートされます。 |
参照
関連項目
概念
アクティベーション URL
リモート アプリケーションの構成
リモート処理の例 : インターネット インフォメーション サービス (IIS) でのホスト