동작을 사용하면 기본 동작을 수정하고 서비스 구성을 검사 및 유효성을 검사하거나 WCF(Windows Communication Foundation) 클라이언트 및 서비스 애플리케이션에서 런타임 동작을 수정하는 사용자 지정 확장을 추가할 수 있습니다. 이 항목에서는 동작 인터페이스, 동작 인터페이스를 구현하는 방법 및 서비스 설명(서비스 애플리케이션의) 또는 엔드포인트(클라이언트 애플리케이션)에 프로그래밍 방식으로 또는 구성 파일에 추가하는 방법에 대해 설명합니다. 시스템 제공 동작을 사용하는 방법에 대한 자세한 내용은 서비스 Run-Time 동작 지정 및 클라이언트 Run-Time 동작 지정을 참조하세요.
행동
동작 유형은 WCF(Windows Communication Foundation)에서 WCF 서비스 또는 WCF 클라이언트를 실행하는 런타임을 만들기 전에 서비스 또는 서비스 엔드포인트 설명 개체(각각 서비스 또는 클라이언트)에 추가됩니다. 런타임 생성 프로세스 중에 이러한 동작이 호출되면 계약, 바인딩 및 주소로 생성된 런타임을 수정하는 런타임 속성 및 메서드에 액세스할 수 있습니다.
동작 메서드
모든 동작에는 AddBindingParameters
메서드, ApplyDispatchBehavior
메서드, Validate
메서드, 그리고 ApplyClientBehavior
메서드가 있습니다. 단 한 가지 예외가 있습니다: IServiceBehavior는 클라이언트에서 실행할 수 없기 때문에 ApplyClientBehavior
를 구현하지 않습니다.
이 메서드를
AddBindingParameters
사용하여 사용자 지정 바인딩이 런타임이 생성될 때 사용하기 위해 액세스할 수 있는 사용자 지정 개체를 컬렉션에 수정하거나 추가합니다. 예를 들어 채널이 빌드되는 방식에 영향을 주지만 채널 개발자가 알 수 없는 보호 요구 사항을 지정하는 방법이 있습니다.이 메서드를
Validate
사용하여 설명 트리 및 해당 런타임 개체를 검사하여 일부 조건 집합을 준수하는지 확인합니다.ApplyDispatchBehavior
및ApplyClientBehavior
메서드를 사용하여 설명 트리를 검사하고 서비스 또는 클라이언트의 특정 범위에 대한 런타임을 수정합니다. 확장 개체도 삽입할 수 있습니다.비고
설명 트리는 이러한 방법으로 제공되지만 검사 전용입니다. 설명 트리가 수정되면 동작이 정의되지 않습니다.
수정할 수 있는 속성과 구현할 수 있는 사용자 지정 인터페이스는 서비스 및 클라이언트 런타임 클래스를 통해 액세스됩니다. 서비스 유형은 DispatchRuntime 클래스와 DispatchOperation 클래스입니다. 클라이언트 유형은 ClientRuntime 클래스와 ClientOperation 클래스입니다. ClientRuntime 및 DispatchRuntime 클래스는 각각 클라이언트 전체 및 서비스 전체 런타임 속성과 확장 컬렉션에 액세스하기 위한 확장성 진입점입니다. 마찬가지로, ClientOperation 클래스와 DispatchOperation 클래스는 각각 클라이언트 작업 및 서비스 작업 런타임 속성과 확장 컬렉션을 노출합니다. 그러나 작업 런타임 개체에서 더 넓은 범위의 런타임 개체에 액세스할 수 있으며 필요한 경우 그 반대의 경우도 마찬가지입니다.
비고
클라이언트의 실행 동작을 수정하는 데 사용할 수 있는 런타임 속성 및 확장 형식에 대한 설명은 클라이언트 확장을 참조하세요. 서비스 디스패처의 실행 동작을 수정하는 데 사용할 수 있는 런타임 속성 및 확장 형식에 대한 설명은 디스패처 확장을 참조하세요.
대부분의 WCF 사용자는 런타임과 직접 상호 작용하지 않습니다. 대신 구성 파일의 클래스 또는 동작에서 엔드포인트, 계약, 바인딩, 주소 및 동작 특성과 같은 핵심 프로그래밍 모델 구문을 사용합니다. 이러한 구문은 설명 트리에서 설명하는 서비스 또는 클라이언트를 지원하기 위해 런타임을 생성하기 위한 전체 사양인 설명 트리를 구성합니다.
WCF에는 다음과 같은 네 가지 동작이 있습니다.
서비스 동작(IServiceBehavior 형식)을 사용하면 을 포함하여 ServiceHostBase전체 서비스 런타임을 사용자 지정할 수 있습니다.
엔드포인트 동작(IEndpointBehavior 형식)을 사용하면 서비스 엔드포인트 및 관련 EndpointDispatcher 개체를 사용자 지정할 수 있습니다.
계약 동작(IContractBehavior 형식)을 사용하면 클라이언트 응용 프로그램의 ClientRuntime 클래스와 서비스 응용 프로그램의 DispatchRuntime 클래스를 각각 사용자 지정할 수 있습니다.
작업 동작(IOperationBehavior 유형)을 사용하면 클라이언트 및 서비스에서 ClientOperation 클래스와 DispatchOperation 클래스를 사용자 정의할 수 있습니다.
사용자 지정 특성을 구현하거나, 애플리케이션 구성 파일을 사용하거나, 적절한 설명 개체의 동작 컬렉션에 직접 추가하여 이러한 동작을 다양한 설명 개체에 추가할 수 있습니다. 그러나 ICommunicationObject.Open 또는 ServiceHost을 호출하기 전에 ChannelFactory<TChannel>를 서비스 설명 또는 서비스 엔드포인트 설명 개체에 추가해야 합니다.
동작 범위
각각 런타임 액세스의 특정 범위에 해당하는 네 가지 동작 유형이 있습니다.
서비스 동작
구현 IServiceBehavior되는 서비스 동작은 전체 서비스 런타임을 수정하는 기본 메커니즘입니다. 서비스에 서비스 동작을 추가하기 위한 세 가지 메커니즘이 있습니다.
서비스 클래스에서 특성 사용 ServiceHost가 생성되면 ServiceHost 구현은 리플렉션을 통해 서비스 유형에서 특성 집합을 검색합니다. 이러한 특성이 IServiceBehavior의 구현인 경우, ServiceDescription의 동작 컬렉션에 추가됩니다. 이렇게 하면 이러한 동작이 서비스 런타임 생성에 참여할 수 있습니다.
의 동작 컬렉션 ServiceDescription에 동작을 프로그래밍 방식으로 추가합니다. 이 작업은 다음 코드 줄로 수행할 수 있습니다.
ServiceHost host = new ServiceHost(/* Parameters */); host.Description.Behaviors.Add(/* Service Behavior */);
구성을 확장하는 사용자 지정 BehaviorExtensionElement 구현 이렇게 하면 애플리케이션 구성 파일에서 서비스 동작을 사용할 수 있습니다.
WCF의 서비스 동작 예제에는 ServiceBehaviorAttribute 특성, ServiceThrottlingBehavior 그리고 ServiceMetadataBehavior 동작이 포함됩니다.
계약 행동
인터페이스 IContractBehavior를 구현하는 계약의 동작은 계약을 통해 클라이언트와 서비스 실행 시간을 모두 확장하는 데 사용됩니다.
계약에 계약 동작을 추가하는 두 가지 메커니즘이 있습니다. 첫 번째 메커니즘은 계약 인터페이스에서 사용할 사용자 지정 특성을 만드는 것입니다. 계약 인터페이스가 ServiceHost 또는 ChannelFactory<TChannel>에 전달될 때, WCF는 인터페이스의 특성을 검사합니다. IContractBehavior의 구현인 속성이 있다면, 해당 인터페이스를 위해 생성된 System.ServiceModel.Description.ContractDescription의 동작 컬렉션에 추가됩니다.
System.ServiceModel.Description.IContractBehaviorAttribute 사용자 지정 계약 동작 특성에 구현할 수도 있습니다. 이 경우 동작은 다음과 같이 적용됩니다.
•계약 인터페이스입니다. 이 경우 동작은 모든 엔드포인트에서 해당 형식의 모든 계약에 적용되고 WCF는 속성 값을 IContractBehaviorAttribute.TargetContract 무시합니다.
•서비스 클래스입니다. 이 경우 동작은 해당 계약이 속성 값 TargetContract 인 엔드포인트에만 적용됩니다.
•콜백 클래스입니다. 이 경우 동작은 이중 클라이언트의 엔드포인트에 적용되고 WCF는 속성 값을 TargetContract 무시합니다.
두 번째 메커니즘은 ContractDescription의 동작 컬렉션에 동작을 추가하는 것입니다.
WCF의 계약 동작 예제에는 특성이 System.ServiceModel.DeliveryRequirementsAttribute 포함됩니다. 자세한 내용과 예제는 참조 항목을 참조하세요.
엔드포인트 동작
구현 IEndpointBehavior되는 엔드포인트 동작은 특정 엔드포인트에 대한 전체 서비스 또는 클라이언트 런타임을 수정하는 기본 메커니즘입니다.
서비스에 엔드포인트 동작을 추가하기 위한 두 가지 메커니즘이 있습니다.
속성에 동작을 추가합니다 Behaviors .
구성을 확장하는 사용자 지정 BehaviorExtensionElement 을 구현합니다.
자세한 내용과 예제는 참조 항목을 참조하세요.
작업 동작
인터페이스를 구현 IOperationBehavior 하는 작업 동작은 각 작업에 대해 클라이언트 및 서비스 런타임을 모두 확장하는 데 사용됩니다.
작업에 작업 동작을 추가하는 두 가지 메커니즘이 있습니다. 첫 번째 메커니즘은 작업을 모델하는 메서드에서 사용할 사용자 지정 특성을 만드는 것입니다. 작업이 ServiceHost 또는 ChannelFactory 둘 중 하나에 추가되면 WCF는 해당 작업에 대해 생성된 IOperationBehavior의 동작 컬렉션에 모든 OperationDescription 특성을 추가합니다.
두 번째 메커니즘은 생성된 OperationDescription동작 컬렉션에 동작을 직접 추가하는 것입니다.
WCF에서 작업 동작의 예는 다음과 같습니다OperationBehaviorAttribute.TransactionFlowAttribute
자세한 내용과 예제는 참조 항목을 참조하세요.
구성을 사용하여 동작 만들기
서비스 및 엔드포인트 및 계약 동작은 코드에서 지정하거나 특성을 사용하도록 설계할 수 있습니다. 애플리케이션 또는 웹 구성 파일을 사용하여 서비스 및 엔드포인트 동작만 구성할 수 있습니다. 특성을 사용하여 동작을 노출하면 개발자가 런타임에 추가, 제거 또는 수정할 수 없는 동작을 컴파일 시간에 지정할 수 있습니다. 이것은 서비스가 제대로 작동하기 위해 항상 필요한 행동에 적합합니다(예를 들어, System.ServiceModel.ServiceBehaviorAttribute 특성에 대한 트랜잭션 관련 매개 변수). 구성을 사용하여 동작을 노출하면 개발자가 해당 동작의 사양과 구성을 서비스를 배포하는 사용자에게 맡기도록 할 수 있습니다. 이는 서비스에 대해 메타데이터가 노출되는지 또는 서비스에 대한 특정 권한 부여 구성에 노출되는지 여부와 같은 선택적 구성 요소 또는 기타 배포별 구성인 동작에 적합합니다.
비고
구성을 지원하는 동작을 사용하여 machine.config 구성 파일에 삽입하고 해당 항목을 잠가 회사 애플리케이션 정책을 적용할 수도 있습니다. 설명 및 예제는 방법: 엔터프라이즈에서 엔드포인트 잠금을 참조하세요.
구성을 사용하여 동작을 노출하려면 개발자가 파생 클래스를 BehaviorExtensionElement 만든 다음 해당 확장을 구성에 등록해야 합니다.
다음 코드 예제는 IEndpointBehavior이 BehaviorExtensionElement을 구현하는 방법을 보여줍니다.
// BehaviorExtensionElement members
public override Type BehaviorType
{
get { return typeof(EndpointBehaviorMessageInspector); }
}
protected override object CreateBehavior()
{
return new EndpointBehaviorMessageInspector();
}
구성 시스템에서 사용자 지정 BehaviorExtensionElement을 로드하려면 확장으로 등록해야 합니다. 다음 코드 예제에서는 이전 엔드포인트 동작에 대한 구성 파일을 보여줍니다.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/ServiceMetadata" />
</baseAddresses>
</host>
<endpoint
address="/SampleService"
binding="wsHttpBinding"
behaviorConfiguration="withMessageInspector"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="withMessageInspector">
<endpointMessageInspector />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="endpointMessageInspector"
type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector
는 동작 확장 형식이며, HostApplication
은 해당 클래스가 컴파일된 어셈블리의 이름입니다.
평가 순서
System.ServiceModel.ChannelFactory<TChannel> 및 System.ServiceModel.ServiceHost은 프로그래밍 모델과 설명에서 런타임을 빌드하는 데 책임이 있습니다. 앞에서 설명한 대로 동작은 서비스, 엔드포인트, 계약 및 작업에서 해당 빌드 프로세스에 기여합니다.
동작 ServiceHost 은 다음 순서대로 적용됩니다.
서비스
계약서
엔드포인트
수술
동작 컬렉션 내에서는 순서가 보장되지 않습니다.
동작 ChannelFactory<TChannel> 은 다음 순서대로 적용됩니다.
계약서
엔드포인트
수술
동작 컬렉션 내에서 다시 순서가 보장되지 않습니다.
프로그래밍 방식으로 동작 추가
서비스 애플리케이션의 System.ServiceModel.Description.ServiceDescription 속성은 CommunicationObject.OnOpening의 System.ServiceModel.ServiceHostBase 메서드를 호출한 이후에 수정하면 안 됩니다.
ServiceHostBase.Credentials 속성 및 AddServiceEndpoint
메서드와 같이 ServiceHostBase 및 System.ServiceModel.ServiceHost의 일부 멤버는 그 지점을 넘어 수정될 경우 예외를 발생시킵니다. 다른 것들은 수정이 가능하지만 결과는 불확실합니다.
마찬가지로 클라이언트에서 System.ServiceModel.Description.ServiceEndpoint 값을 OnOpening를 System.ServiceModel.ChannelFactory에 호출한 후에는 변경해서는 안 됩니다. 해당 지점을 지나서 수정된 경우 속성이 ChannelFactory.Credentials 예외를 throw하지만 다른 클라이언트 설명 값은 오류 없이 수정할 수 있습니다. 그러나 결과는 정의되지 않습니다.
서비스 또는 클라이언트에 대해 호출 CommunicationObject.Open하기 전에 설명을 수정하는 것이 좋습니다.
동작 특성에 대한 상속 규칙
서비스 동작 및 계약 동작과 같은 네 가지 유형의 동작을 모두 특성을 사용하여 채울 수 있습니다. 특성은 관리되는 개체 및 멤버에 정의되고 관리되는 개체와 멤버는 상속을 지원하므로 상속 컨텍스트에서 동작 특성이 작동하는 방식을 정의해야 합니다.
높은 수준에서 규칙은 특정 범위(예: 서비스, 계약 또는 작업)에 대해 해당 범위에 대한 상속 계층 구조의 모든 동작 특성이 적용된다는 것입니다. 동일한 형식의 두 동작 특성이 있는 경우 가장 많이 파생된 형식만 사용됩니다.
서비스 동작
지정된 서비스 클래스의 경우 해당 클래스의 모든 서비스 동작 특성과 해당 클래스의 부모에 적용됩니다. 동일한 유형의 특성이 상속 계층 구조의 여러 위치에 적용되는 경우 가장 많이 파생된 형식이 사용됩니다.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}
예를 들어 앞의 경우, 서비스 B는 InstanceContextMode의 Single, AspNetCompatibilityRequirementsMode 모드의 Allowed, 그리고 ConcurrencyMode의 Single로 끝납니다. ConcurrencyMode는 Single입니다. 왜냐하면 서비스 B의 ServiceBehaviorAttribute 특성이 서비스 A의 특성보다 "더 많이 파생"되었기 때문입니다.
계약 행동
지정된 계약의 경우 해당 인터페이스 및 해당 인터페이스의 부모에 대한 모든 계약 동작 특성이 적용됩니다. 동일한 유형의 특성이 상속 계층 구조의 여러 위치에 적용되는 경우 가장 많이 파생된 형식이 사용됩니다.
작업 동작
지정된 작업이 기존 추상 또는 가상 작업을 재정의하지 않으면 상속 규칙이 적용되지 않습니다.
작업이 기존 작업을 재정의하는 경우 해당 작업 및 해당 작업의 부모에 대한 모든 작업 동작 특성이 적용됩니다. 동일한 유형의 특성이 상속 계층 구조의 여러 위치에 적용되는 경우 가장 많이 파생된 형식이 사용됩니다.