다음을 통해 공유


코드로 WCF 서비스 구성

WCF(Windows Communication Foundation)에서는 개발자가 구성 파일 또는 코드를 사용하여 서비스를 구성할 수 있습니다. 구성 파일은 배포 후 서비스를 구성해야 하는 경우에 유용합니다. 구성 파일을 사용할 경우 IT 전문가가 구성 파일을 업데이트하기만 하면 되고 다시 컴파일할 필요가 없습니다. 하지만 구성 파일은 관리하기가 복잡하고 어려울 수 있습니다. 구성 파일 디버깅은 지원되지 않으며 구성 요소는 이름으로 참조되므로 구성 파일을 작성하기가 어렵고 오류가 발생하기 쉽습니다. WCF에서는 서비스를 코드로 구성할 수도 있습니다. 이전 버전 WCF(4.0 이하)의 경우 자체 호스팅 시나리오에서 코드로 서비스를 구성하기가 쉬웠으며 ServiceHost 클래스를 사용하여 ServiceHost.Open을 호출하기 전에 엔드포인트 및 동작을 구성할 수 있었습니다. 그러나 웹 호스팅 시나리오에서는 ServiceHost 클래스에 직접 액세스할 수 없습니다. 웹 호스팅 서비스를 구성하려면 System.ServiceModel.ServiceHostFactory를 만들고 필요한 구성을 수행하는 ServiceHostFactory를 만들어야 했습니다. .NET Framework 4.5부터 WCF는 자체 호스팅 서비스와 웹 호스팅 서비스를 모두 코드로 구성할 수 있는 더욱 손쉬운 방법을 제공합니다.

Configure 메서드

서비스 구현 클래스에서 다음 서명으로 Configure라는 공용 정적 메서드를 정의하기만 하면 됩니다.

public static void Configure(ServiceConfiguration config)

Configure 메서드는 개발자가 엔드포인트 및 동작을 추가할 수 있도록 해 주는 ServiceConfiguration 인스턴스를 사용합니다. 이 메서드는 서비스 호스트가 열리기 전에 WCF에서 호출됩니다. 정의할 때 app.config 또는 web.config 파일에 지정된 서비스 구성 설정이 무시됩니다.

다음 코드 조각은 Configure 메서드를 정의하는 방법과 서비스 엔드포인트, 엔드포인트 동작 및 서비스 동작을 추가하는 방법을 설명합니다.

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

서비스에 https와 같은 프로토콜을 사용하려면 프로토콜을 사용하는 엔드포인트를 명시적으로 추가하거나 프로토콜 및 정의된 각 서비스 계약과 호환되는 각 기본 주소에 엔드포인트를 추가하는 ServiceConfiguration.EnableProtocol(Binding)을 호출하여 엔드포인트를 자동으로 추가할 수 있습니다. 다음 코드에서는 ServiceConfiguration.EnableProtocol 메서드를 사용하는 방법을 보여 줍니다.

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

<protocolMappings> 섹션의 설정은 애플리케이션 엔드포인트가 프로그래밍 방식으로 ServiceConfiguration에 추가되는 경우에만 사용됩니다. LoadFromConfiguration을 호출하여 기본 애플리케이션 구성 파일에서 서비스 구성을 선택적으로 로드한 후에 설정을 변경할 수 있습니다. LoadFromConfiguration() 클래스를 사용하면 중앙 집중식 구성에서 구성을 로드할 수도 있습니다. 다음 코드에서는 이를 구현하는 방법을 보여 줍니다.

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

Important

LoadFromConfiguration은 <system.serviceModel>의 <service> 태그 내 <host> 설정을 무시합니다. 개념상 <host>는 서비스 구성에 대한 것이 아니라 호스트 구성에 대한 것이며 Configuration 메서드가 실행되기 전에 로드됩니다.

참고 항목