2012-10-26 2 views
2

IExtension을 사용하여 클라이언트를 사용중인 클라이언트에서 매개 변수를 취하는 클라이언트 측 동작을 만들었습니다. 그리고 내 접근 방식이 작동하는 동안 나는 더 나은 방법을 원합니다.WCF 프록시 비헤이비어 및 매개 변수

지금 내가하려는 일을 명확히하기 위해 현재 진행중인 접근 방식에 대한 세부 사항을 공유 할 것입니다.

프록시를 사용하는 클라이언트는 다음과 같이 매개 변수를 제공 다음 IExtension ParameterHolder는 다음과 같다

var client = new ServiceAlphaClient(); 

client.InnerChannel.Extensions.Add(new ParameterHolder("hello")); 

client.DoSomething("some interesting service invocation"); 

client.Close(); 

:

public class ParameterHolder: IExtension<IContextChannel> 
{ 

    public string someParam; 

    public ParameterHolder(string someParam) 
    { 
     this.someParam = someParam; 
    } 

    #region IExtension required-but-useless stuff 
    public void Attach(IContextChannel owner) 
    { 
    } 

    public void Detach(IContextChannel owner) 
    { 
    } 
    #endregion 
} 
파라미터를 사용하여 클라이언트 측 행동 확장과 같다

:

#region IClientMessageInspector 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     //throw new NotImplementedException(); 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 
     ParameterHolder holder = channel.Extensions.Find<ParameterHolder>(); 

     string param = holder.someParam; 

     request.Headers.Add(MessageHeader.CreateHeader(headerName, headerNamespace, someParam)); 
     return null; 
    } 
    #endregion 

내가 위에 모두에 대해 싫어하는 것 :

  1. ClientMessageInspector 확장은 나가는 요청마다 Extensions.Find를 반복적으로 호출합니다. 그것은 불필요하고 비효율적입니다.
  2. 내 프록시를 사용하는 클라이언트는 생성 된 새로운 프록시마다 매개 변수를 제공해야합니다. 첫 번째 문제에 관해서는

의 관리자 확장에 나는 저장할 수 있고 더 나은 효율성을 위해 값에 대한 테스트,하지만 난 오히려 초기 단계에서 한 번만이 매개 변수를 가져올 수있을 것입니다. 특히 IContractBehavior 자체가 AddBindingParameters (...) 또는 ApplyClientBehavior (...)에서 매개 변수를 가져올 수 있도록하고 싶습니다. 하지만 거기에서 클라이언트 채널에 도달하는 방법을 모르겠습니다.

두 번째 문제에 대해서는 Extensions.Add()를 사용하여 각 프록시 인스턴스에 매개 변수를 설정하지 않는 것이 좋습니다. 매개 변수를 클라이언트에 정적으로 설정할 수 있으면 좋겠다. 여하튼 여전히 동작 확장명을 다시 가져 와서 가져오고 싶습니다. 부분 수업을 활용하는 방법을 잘 모릅니다.

어쨌든 이러한 문제를 해결하려면? "메타 매개 변수"를 WCF 프록시에 전달하는 전반적인 더 나은 방법이 있습니까?

답변

0

내가 문제를 잘못 해석하면 용서해주십시오. 그러나 두 문제를 모두 해결할 수있는 솔루션은 공용 정적 멤버 (속성 또는 필드)를 관리자 클래스에 포함시키는 것입니다. 따라서 클라이언트는 매개 변수를 한 번만 설정하면됩니다. 검사기 메서드는 에도 액세스 할 수 있습니다.

그래서 관리자 클래스는 다음과 같이해야한다 :

Class MyProxyInspector:IClientMessageInspector 
{ 
    public static string MyParam; 

    ... 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 
     request.Headers.Add(MessageHeader.CreateHeader(headerName, headerNamespace, MyParam)); 
     return null; 
    } 

} 

하고 클라이언트를, 당신의 클라이언트 코드에 한 번 편한 곳에 MyproxyInspector.MyParam을 할당해야합니다.