다음을 통해 공유


방법: IIS에서의 WCF 서비스 호스팅

이 항목에서는 IIS(인터넷 정보 서비스)에서 호스팅되는 WCF(Windows Communication Foundation) 서비스를 만드는 데 필요한 기본 단계에 대해 간략하게 설명합니다. 이 항목에서는 사용자가 IIS에 대해 잘 알고 있으며 IIS 관리 도구를 사용해 IIS 응용 프로그램을 만들고 관리하는 방법을 이해하고 있다고 가정합니다. IIS에 대한 자세한 내용은 Internet Information Services를 참조하십시오. IIS 환경에서 실행되는 WCF 서비스는 프로세스 재활용, 유휴 상태이면 종료, 프로세스 상태 모니터링 및 메시지 기반 활성화 같은 모든 IIS 기능을 사용합니다. 이 호스팅 옵션을 사용하려면 IIS를 적절히 구성해야 하지만 호스팅 코드를 응용 프로그램의 일부로 작성하지 않아도 됩니다. HTTP 전송을 사용하는 경우에만 IIS 호스팅을 사용할 수 있습니다.

WCF 및 ASP.NET의 상호 작용 방식에 대한 자세한 내용은 WCF 서비스 및 ASP.NET을 참조하십시오. 보안 구성에 대한 자세한 내용은 Windows Communication Foundation 보안을 참조하십시오.

이 예제의 소스 복사에 대해서는 IIS Hosting Using Inline Code를 참조하십시오.

IIS에 의해 호스팅되는 서비스를 만들려면

  1. IIS가 컴퓨터에 설치되어 실행되고 있는지 확인합니다. IIS 설치 및 구성에 대한 자세한 내용은 Installing and Configuring IIS 7.0을 참조하십시오.

  2. 응용 프로그램 파일의 새 폴더("IISHostedCalcService")를 만들고, ASP.NET이 폴더 내용에 대한 액세스 권한을 가지고 있는지 확인하고, IIS 관리 도구를 사용하여 실제로 이 응용 프로그램 디렉터리에 있는 새 IIS 응용 프로그램을 만듭니다. 응용 프로그램 디렉터리의 별칭을 만들 때는 “IISHostedCalc”를 사용합니다.

  3. 응용 프로그램 디렉터리에 “service.svc”라는 새 파일을 만든 다음 다음 @ServiceHost 요소를 추가해 이 파일을 편집합니다.

    <%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
    
  4. 응용 프로그램 디렉터리 내에 App_Code 하위 디렉터리를 만듭니다.

  5. App_Code subdirectory에 Service.cs라는 코드 파일을 만듭니다.

  6. Service.cs 파일의 맨 위에 다음의 using 문을 추가합니다.

    using System;
    using System.ServiceModel;
    
  7. using 문 뒤에 다음 네임스페이스 선언을 추가합니다.

    namespace Microsoft.ServiceModel.Samples
    {
    }
    
  8. 다음 코드와 같이 네임스페이스 선언 내에 서비스 계약을 정의합니다.

    <ServiceContract()> _
    Public Interface ICalculator
    
        <OperationContract()> _
          Function Add(ByVal n1 As Double, _
                       ByVal n2 As Double) As Double
    
        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, _
                          ByVal n2 As Double) As Double
    
        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, _
                          ByVal n2 As Double) As Double
    
        <OperationContract()> _
        Function Divide(ByVal n1 As Double, _
                        ByVal n2 As Double) As Double
    End Interface
    
    [ServiceContract]
    public interface ICalculator
    {
       [OperationContract]
       double Add(double n1, double n2);
       [OperationContract]
       double Subtract(double n1, double n2);
       [OperationContract]
       double Multiply(double n1, double n2);
       [OperationContract]
       double Divide(double n1, double n2);
    }
    
  9. 다음 코드와 같이 서비스 계약 정의 뒤에서 서비스 계약을 구현합니다.

    Public Class CalculatorService
        Implements ICalculator
        Public Function Add(ByVal n1 As Double, _
                            ByVal n2 As Double) As Double Implements ICalculator.Add
            Return n1 + n2
        End Function
    
        Public Function Subtract(ByVal n1 As Double, _
                                 ByVal n2 As Double) As Double Implements ICalculator.Subtract
            Return n1 - n2
        End Function
    
        Public Function Multiply(ByVal n1 As Double, _
                                 ByVal n2 As Double) As Double Implements ICalculator.Multiply
            Return n1 * n2
        End Function
    
        Public Function Divide(ByVal n1 As Double, _
                               ByVal n2 As Double) As Double Implements ICalculator.Divide
            Return n1 / n2
        End Function
    End Class
    
    public class CalculatorService : ICalculator
    {
       public double Add(double n1, double n2)
       {
          return n1 + n2;
       }
       public double Subtract(double n1, double n2)
       {
          return n1 - n2;
       }
       public double Multiply(double n1, double n2)
       {
          return n1 * n2;
       }
       public double Divide(double n1, double n2)
       {
          return n1 / n2;
       }
    } 
    
  10. 응용 프로그램 디렉터리에 “Web.config”라는 파일을 만들고 다음 구성 코드를 파일에 추가합니다. 런타임에 WCF 인프라에서는 이 정보를 사용하여 클라이언트 응용 프로그램이 통신할 수 있는 끝점을 생성합니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <!-- This section is optional with the default configuration
            model introduced in .NET Framework 4 -->
          <service name="Microsoft.ServiceModel.Samples.CalculatorService">
    
            <!-- This endpoint is exposed at the base address provided by host:                                        https://localhost/servicemodelsamples/service.svc  -->
            <endpoint address=""
                      binding="wsHttpBinding"
                      contract="Microsoft.ServiceModel.Samples.ICalculator" />
    
            <!-- The mex endpoint is exposed at https://localhost/servicemodelsamples/service.svc/mex -->
            <endpoint address="mex"
                      binding="mexHttpBinding"
                      contract="IMetadataExchange" />
          </service>
        </services>
      </system.serviceModel>
    
    </configuration>
    

    다음 예제에서는 구성 파일의 끝점을 명시적으로 지정합니다. 서비스에 끝점을 추가하지 않으면 런타임에서 기본 끝점을 자동으로 추가합니다. 기본 끝점, 바인딩 및 동작에 대한 자세한 내용은 단순화된 구성Simplified Configuration for WCF Services을 참조하십시오.

  11. 서비스가 올바르게 호스팅되는지 확인하려면 Internet Explorer 인스턴스를 열고 서비스 URL인 https://localhost/IISHostedCalc/Service.svc로 이동합니다.

예제

다음은 IIS에서 호스팅되는 계산기 서비스에 해당되는 전체 코드 목록입니다.

Imports System
Imports System.ServiceModel

Namespace Microsoft.ServiceModel.Samples

    <ServiceContract()> _
    Public Interface ICalculator

        <OperationContract()> _
          Function Add(ByVal n1 As Double, _
                       ByVal n2 As Double) As Double

        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, _
                          ByVal n2 As Double) As Double

        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, _
                          ByVal n2 As Double) As Double

        <OperationContract()> _
        Function Divide(ByVal n1 As Double, _
                        ByVal n2 As Double) As Double
    End Interface


    Public Class CalculatorService
        Implements ICalculator
        Public Function Add(ByVal n1 As Double, _
                            ByVal n2 As Double) As Double Implements ICalculator.Add
            Return n1 + n2
        End Function

        Public Function Subtract(ByVal n1 As Double, _
                                 ByVal n2 As Double) As Double Implements ICalculator.Subtract
            Return n1 - n2
        End Function

        Public Function Multiply(ByVal n1 As Double, _
                                 ByVal n2 As Double) As Double Implements ICalculator.Multiply
            Return n1 * n2
        End Function

        Public Function Divide(ByVal n1 As Double, _
                               ByVal n2 As Double) As Double Implements ICalculator.Divide
            Return n1 / n2
        End Function
    End Class
using System;
using System.ServiceModel;

namespace Microsoft.ServiceModel.Samples
{

  [ServiceContract]
  public interface ICalculator
  {
     [OperationContract]
     double Add(double n1, double n2);
     [OperationContract]
     double Subtract(double n1, double n2);
     [OperationContract]
     double Multiply(double n1, double n2);
     [OperationContract]
     double Divide(double n1, double n2);
  }


  public class CalculatorService : ICalculator
  {
     public double Add(double n1, double n2)
     {
        return n1 + n2;
     }
     public double Subtract(double n1, double n2)
     {
        return n1 - n2;
     }
     public double Multiply(double n1, double n2)
     {
        return n1 * n2;
     }
     public double Divide(double n1, double n2)
     {
        return n1 / n2;
     }
  } 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService">

        <!-- This endpoint is exposed at the base address provided by host:                                        https://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />

        <!-- The mex endpoint is explosed at https://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

</configuration>

참고 항목

개념

인터넷 정보 서비스에서의 호스팅
서비스 호스팅
WCF 서비스 및 ASP.NET

기타 리소스

Windows Communication Foundation 보안
Windows Server AppFabric 호스팅 기능