2013-07-02 1 views
2

IDispatchMessageInpector & 구현을 살펴보면서 AfterReceiveRequest 및 BeforeSendRequest 메서드의 메시지 개체를 살펴 봅니다. 내 요구 사항은 WCF 서비스의 코드 수준에서 변경하는 것입니다. 구성 변경이 없습니다. 이 서비스를 호출하고 자체 서비스를 제공하는 모든 엔드 포인트에이 작동 방식을 첨부하는 방법. IContractBehaviour가 나를 도와주고 있습니까?ServiceHostFactory를 사용하여 IIS 호스트 된 WCF 서비스의 클라이언트 끝점에 동작을 추가하는 방법

편집 1 : WCF 서비스는 IIS에서 호스팅됩니다. 코드를 통해 동작을 추가 할 수 있습니까?

편집 2 : 우리는 이것을 달성 할 수있는 ServiceHostFactory를 사용하는 것처럼 보입니다. webconfig에 정의 된 클라이언트 끝점에 동작을 추가하려면 어떻게해야합니까?

+0

Carlos Figueira의 블로그 - 코드 샘플을 사용하여 WCF 확장성에 대한 좋은 시리즈를 제공합니다 - [WCF Extensibility] (http://blogs.msdn.com/b/carlosfigueira/) archive/2011/03/14/wcf-extensibility.aspx) – Tim

+0

WCF의 초보자 인 블로그를보고 있습니다. 정확한 경로를 취하고 있는지 여부를보고 싶습니다. –

답변

3

예, IIS에서 호스팅되는 서비스의 동작을 추가 할 수 있습니다. 비헤이비어는 서비스의 호스팅 환경과 관련이 없습니다. Carlos Figueira의 블로그는 서비스, 엔드 포인트, 계약 및 운영에 적용 할 수있는 모든 유형의 행동의 예를 제공합니다. 내 서비스를 위해 노력 샘플 코드는 IIS에서 호스팅 (web.config 파일에 정의 된 엔드 포인트와 함께) -

- 구성 파일은 여기

public class MyEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior 
{ 
      public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
      { 
       Console.WriteLine("applying dispatch behavior"); 
       endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInspector()); 
       endpointDispatcher.DispatchRuntime.OperationSelector = new MyOperationSelector(); 
      } 

     public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
     { 
     } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
     { 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 
     } 

     public override Type BehaviorType 
     { 
      get { return this.GetType(); } 
     } 

     protected override object CreateBehavior() 
     { 
      return new MyEndpointBehavior(); 
     } 
} 

    public class MyOperationSelector : IDispatchOperationSelector 
    { 
     public string SelectOperation(ref Message message) 
     { 
      Console.WriteLine("good luck"); 
      string action = message.Headers.Action; 
      return action.Substring(action.LastIndexOf('/') + 1); 
     } 
    } 

    public class MyInspector : IDispatchMessageInspector 
    { 

     public object AfterReceiveRequest(ref Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
     { 
      return (Message) request; 
     } 

     public void BeforeSendReply(ref Message reply, object correlationState) 
     { 
     } 
    } 
} 
행동

구성 파일이 확장 요소로 추가 ExtensionElement으로 동작을 추가 할 필요가

<system.serviceModel> 
    <services> 
    <service name="RouteToServiceA.Service1"> 
    <endpoint address="Service1" binding="basicHttpBinding" contract="RouteToServiceA.IService1" behaviorConfiguration="testEndPoint" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true" /> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="testEndPoint"> 
     <testBehavior /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="testBehavior" type="RouteToServiceA.MyEndpointBehavior, RouteToServiceA" /> 
    </behaviorExtensions> 
</extensions> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
+0

마찬가지로 관련 동작을 추가 할 수 있습니다. 클라이언트 요소 (IEndpointBehavior, IContractBehavior, IOperationBehavior)에 추가하고 위에서 언급 한 예제 i와 같이 구성 파일의 behaviorextensions 섹션에 추가합니다. – vibhu

+0

모든 구성 변경없이 접근 방법을 찾고 있습니다. –

0

ServiceHostFactory를 사용하면 구성 할 클라이언트 끝점에 동작 구성을 추가하는 대신 서비스 동작을 추가 할 수 있습니다. 그래서 구성 변경을 수행 할 것입니다.

관련 문제