IIS에서 원격 개체 호스팅
IIS(인터넷 정보 서비스)를 사용하여 원격 형식을 호스팅하는 경우, 호스트 응용 프로그램 도메인은 IIS와 ASP.NET에서 만들어지므로 원격화할 수 있는 형식에 대한 원격 시스템을 호스트 프로세스에서 직접 프로그래밍 방식으로 구성할 수 없습니다. 그러나 Global.asax 파일을 사용하면 다른 형식의 응용 프로그램 도메인에서 수행할 수 있는 프로그래밍 구성의 대부분을 수행할 수 있습니다. IIS가 호스트 프로세스인 경우 구성 파일을 사용하여 원격 서비스를 구성하려면 다음을 수행해야 합니다.
사용하려고 선택한 IIS 가상 디렉터리의 Web.config 파일에 구성 정보를 포함합니다.
원격화할 수 있는 형식 구현을 \bin 디렉터리에 포함하거나, 전역 어셈블리 캐시 도구(Gacutil.exe)를 사용하여 전역 어셈블리 캐시에 포함합니다.
또한 다음 작업은 수행할 수 없습니다.
IIS에서 호스팅할 때는 응용 프로그램 이름을 지정할 수 없습니다. 가상 디렉터리의 이름이 응용 프로그램 이름이 됩니다.
.NET Remoting 구성에 사용되는 Web.config 파일에서 <debug> 요소를 사용할 수 없습니다.
HttpChannel 이외의 채널을 사용할 수 없습니다.
Web.config 파일과 <client> 요소를 사용하여 클라이언트 웹 응용 프로그램을 자동으로 구성할 수 없습니다. IIS를 원격 클라이언트로 사용하려면 Global.asax 파일의 Application_Start 메서드에서 RemotingConfiguration.Configure를 호출해야 합니다.
원격 서비스를 위한 구성 파일에는 시스템에서 알아야 하는 해당 형식의 기본 정보가 여전히 포함되지만 일부 선언은 호스팅 환경에 맞게 약간 변경해야 합니다. 예를 들어, 특정 HttpChannel을 사용자 지정하여 구성할 수 있지만 해당 채널에 대한 포트를 지정해서는 안 됩니다. ASP.NET에서 다른 응용 프로그램 도메인을 만들어 로드를 처리하는 경우에는 원격 구성으로 인해 새 응용 프로그램 도메인이 동일한 포트에서 다시 수신하려고 시도하기 때문에 예외가 발생합니다. 예를 들어, IIS에서 호스팅되는 .NET Remoting XML Web service에 대한 간단한 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>
참고
여기에 나열된 채널에 대해서는 포트를 지정하지 마십시오. 응용 프로그램이 특정 포트에서 수신하도록 하려면 인터넷 서비스 관리자를 사용하여 IIS가 해당 포트에서 수신하도록 지정하십시오. 사용자가 구성하는 채널은 자동으로 해당 포트에서 전송된 원격 요청을 처리하는 데 사용됩니다.
IIS 내에서 서버 활성 개체 즉, <wellknown> 개체를 올바르게 호스팅하려면 .rem 또는 .soap로 끝나는 개체 URI(Uniform Resource Identifier)가 있어야 합니다. 다른 호스트 응용 프로그램 도메인에는 이러한 요구 사항이 없습니다. Soapsuds 도구(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 파일을 사용하는 구성을 보여 줍니다.
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에서 호스팅을 참조하십시오.
SSL 인증서를 .NET Remoting과 함께 사용
인증서는 특정 컴퓨터를 식별하며 해당 컴퓨터 이름은 인증서의 일반 이름에 포함되어 있습니다. 그러나 컴퓨터의 이름을 변경하거나 클라이언트 구성 파일에서 **"localhost"**를 사용하기 쉬우며 이런 경우에는 서버 인증서의 일반 이름과 클라이언트가 일치하지 않게 됩니다. .NET Framework 버전 1.0에서는 이러한 불일치가 무시되며 호출이 서버에서 수행됩니다.
그러나 .NET Framework 버전 1.1부터는 이러한 불일치가 발생하면 "System.Net.WebException: 기본 연결이 닫혔습니다. 원격 서버와 트러스트 관계를 설정할 수 없습니다."라는 예외가 throw됩니다. 원격 클라이언트에서 인증서의 일반 이름을 사용하도록 구성할 수 없으면 클라이언트 응용 프로그램의 구성 파일에서 다음 설정을 사용하여 불일치를 재정의할 수 있습니다.
<system.net>
<settings>
<servicePointManager
checkCertificateName="true"
/>
</settings>
</system.net>
프로그래밍 방식으로 클라이언트가 인증서 이름 불일치를 무시하도록 하려면, 클라이언트는 certificateProblem 값이 0x800c010f일 경우 true를 반환하기 위해 ICertificatePolicy 인터페이스를 구현하고 CheckValidationResult를 구현하는 클래스의 인스턴스를 만들어야 합니다. 그런 다음에는 사용자가 개체를 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 Remoting에서 특정 유형의 인증 동작을 활성화하는 구성 설정에 대해 설명합니다.
원하는 동작 | 구성 설정 | 설명 |
---|---|---|
서버가 클라이언트의 기본 자격 증명을 사용하여 각 호출에 대해 클라이언트를 인증합니다. |
서버에서 Windows 통합 인증을 선택하고 IIS의 익명 액세스를 선택 취소합니다. 클라이언트에서 CredentialCache.DefaultCredentials를 사용하도록 자격 증명을 설정합니다. |
이 동작은 useDefaultCredentials가 true일 경우 .NET Framework 버전 1.0에서의 기본 동작입니다. .NET Framework 버전 1.1에서는 useAuthenticatedConnectionSharing이 false로 설정되어 있어도 이 동작이 지원됩니다. |
서버가 클라이언트의 기본 자격 증명을 사용하여 클라이언트를 한 번만 인증합니다. 이 클라이언트의 후속 호출에서는 이전에 인증된 연결을 사용합니다. |
서버에서 Windows 통합 인증을 선택하고 IIS의 익명 액세스를 선택 취소합니다. 클라이언트에서 useDefaultCredentials를 true로 설정합니다. |
이 동작은 .NET Framework 버전 1.1 이상에서만 지원됩니다. |
서버가 사용자 지정 또는 명시적 클라이언트 자격 증명을 사용하여 클라이언트를 한 번만 인증합니다. 이 클라이언트의 후속 호출에서는 이전에 인증된 연결을 사용합니다. |
서버에서 Windows 통합 인증을 선택하고 IIS의 익명 액세스를 선택 취소합니다. 클라이언트에서 자격 증명을 ICredentials 구현으로 설정하거나 사용자 이름, 암호 및 도메인을 명시적인 값으로 설정합니다. 두 경우 모두 unsafeAuthenticatedConnectionSharing도 true로 설정하고 인증된 사용자 한 명에게만 매핑되는 connectionGroupName 값을 제공해야 합니다. |
이 동작은 .NET Framework 버전 1.1 이상에서만 지원됩니다. |