다음을 통해 공유


IIS의 원격 개체 호스팅

이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.

IIS(인터넷 정보 서비스)에서 원격 개체를 호스팅하려면 원격 개체를 구성해야 합니다. 일반적으로 이 작업은 구성 파일 내에서 또는 호스팅 응용 프로그램 코드 내에서 프로그래밍 방식으로 수행됩니다. 원격 개체가 IIS 내에 호스팅되는 경우 구성 정보를 Web.config 파일에 배치하거나 프로그래밍 방식으로 Global.asax 파일의 Application_Start 메서드에서 원격 개체를 구성할 수 있습니다.

구성 파일을 사용하여 원격 개체를 구성하려면 다음을 수행합니다.

  • 사용하도록 선택한 IIS 가상 디렉터리의 Web.config 파일에 구성 정보를 넣습니다.

  • \bin 디렉터리에 원격으로 사용 가능한 형식 구현을 넣습니다(또는 전역 어셈블리 캐시 도구(Gacutil.exe)를 사용하여 전역 어셈블리 캐시에 배치함).

Web.config 파일을 지정하는 경우 다음은 지원되지 않습니다.

  • 응용 프로그램 이름 지정. 가상 디렉터리의 이름이 응용 프로그램 이름이 됩니다.

  • .NET Remoting 구성에 사용되는 Web.config 파일에 <debug> 요소 사용

  • HttpChannel이 아닌 채널 사용

  • Web.config 파일과 <client> 요소를 사용하여 자동으로 클라이언트 웹 응용 프로그램을 구성합니다. 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(ko-kr,VS.100).gif참고:
여기에 나열된 모든 채널에 대해 포트를 지정하지 마십시오. 응용 프로그램이 포트에서 수신 대기하도록 하려면 인터넷 서비스 관리자를 사용하여 IIS가 해당 포트에서 수신 대기하도록 지정합니다. 구성한 채널이 자동으로 사용되어 해당 포트에서 제출된 원격 요청을 처리합니다.

서버가 활성화한(즉, <wellknown>) 개체를 IIS 내부에 호스팅하려면 .rem 또는 .soap로 끝나는 개체 URI(Uniform Resource Identifier)가 있어야 합니다. 다른 호스트 응용 프로그램 도메인에는 이러한 요구 사항이 없습니다. Soapsuds 도구(Soapsuds.exe)를 사용하여 IIS에 호스팅된 서버가 활성화한 개체에 대한 메타데이터를 생성하려는 경우 인수로 Soapsuds.exe에 전달할 URL은 다음과 같습니다.

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

IIS 또는 다른 응용 프로그램 도메인에 호스팅된 클라이언트가 활성화한 개체의 경우 형식에 관계없이 개체 RUI가 필요하지 않습니다. 인수로 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에서 호스팅을 참조하십시오.

.NET Remoting에서 SSL 인증서 사용

인증서는 특정 컴퓨터를 식별하며 해당 이름이 인증서의 일반 이름에 있습니다. 그러나 쉽게 컴퓨터의 이름을 변경하거나 클라이언트 구성 파일에 "localhost"를 사용할 수 있습니다. 이 경우 클라이언트와 서버 인증서의 일반 이름이 불일치하게 됩니다. .NET Framework 버전 1.0에서는 이 불일치가 무시되며 서버에서 호출됩니다.

.NET Framework 버전 1.1에서 시작하여 이 불일치는 다음 예외를 throw합니다. "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 Remoting에서 특정 유형의 인증 동작을 활성화하는 구성 설정에 대해 설명합니다.

원하는 동작 구성 설정 설명

서버가 클라이언트 기본 자격 증명을 사용하여 각 호출의 클라이언트를 인증합니다.

서버에서 Windows 통합 인증을 선택하고 IIS에서 익명 액세스를 선택 취소합니다.

클라이언트에서 useDefaultCredentialstrue로 설정합니다.

이는 useDefaultCredentialstrue인 경우 .NET Framework 버전 1.0의 기본 동작입니다.

useAuthenticatedConnectionSharingfalse로 설정된 경우 .NET Framework 버전 1.1에서도 이 동작이 지원됩니다.

서버가 클라이언트 기본 자격 증명을 사용하여 클라이언트를 한 번 인증합니다. 이 클라이언트의 후속 호출은 이전에 인증된 연결을 사용합니다.

서버에서 Windows 통합 인증을 선택하고 IIS에서 익명 액세스를 선택 취소합니다.

클라이언트에서 useDefaultCredentialstrue로 설정합니다.

이 동작은 .NET Framework 버전 1.1 이상에서만 지원됩니다.

서버가 사용자 지정 또는 명시적 클라이언트 자격 증명을 사용하여 클라이언트를 한 번 인증합니다. 이 클라이언트의 후속 호출은 이전에 인증된 연결을 사용합니다.

서버에서 Windows 통합 인증을 선택하고 IIS에서 익명 액세스를 선택 취소합니다.

클라이언트에서 credentialsICredentials 구현으로 설정하거나 username, passworddomain을 명시적 값으로 설정합니다. 어떤 경우에서든 unsafeAuthenticatedConnectionSharingtrue로 설정하고 하나의 인증된 사용자에만 매핑되는 connectionGroupName 값을 제공해야 합니다.

이 동작은 .NET Framework 버전 1.1 이상에서만 지원됩니다.

참고 항목

참조

원격 설정 스키마

개념

활성화 URL
원격 응용 프로그램 구성
원격 서비스 예제: IIS에서 호스팅