2010-11-23 3 views
2

WCF 채널이 오류 상태 일 때 조작을 재 시도하는 우아한 방법을 찾으려고합니다. Policy Injection AB를 사용하여 첫 번째 호출에서 오류 상태 예외가 발생하면 작업을 다시 연결하고 다시 시도했지만 PolicyInjection.Wrap 메서드는 TransparentProxy 개체를 래핑하는 것처럼 보이지 않습니다 (Proxy는 ChannelFactory.CreateChannel에서 반환 됨).WCF 조작 채널에서 재 시도 된 상태의 채널 일 때

시도 할 수있는 다른 메커니즘이 있습니까? 또는 PIAB 솔루션이 올바르게 작동하도록 시도 할 수 있습니까 - 링크, 예제 등을 크게 높이십시오. var proxy = channelFactory.CreateChannel(...);
proxy = PolicyInjection.Wrap<IService>(proxy);


var channelFactory = new ChannelFactory(endpointConfigurationName);
감사합니다 : 여기

내가 그 실패했습니다 사용 된 코드입니다. 내 코드는 프록시를 사용하지만
private SomeServiceClient proxy; 

    //This method invokes a service method and recreates the proxy if it's in a faulted state 
    private void TryInvoke(Action<SomeServiceClient> action) 
    { 
     try 
     { 
      action(this.proxy); 
     } 
     catch (FaultException fe) 
     { 
      if (proxy.State == CommunicationState.Faulted) 
      { 
       this.proxy.Abort(); 
       this.proxy = new SomeServiceClient(); 
       //Probably, there is a better way than recursion 
       TryInvoke(action); 
      } 
     } 
    } 

    //Any real method 
    private void Connect(Action<UserModel> callback) 
    { 
     TryInvoke(sc => callback(sc.Connect())); 
    } 

그리고 코드에서

대신

var user = ServiceProxy.Instance.Connect(); 
MessageBox.Show(user.Name); 

ServiceProxy.Instance.Connect(user => MessageBox.Show(user.Name)); 

를 호출해야합니다 :

답변

0

답장을 보내 주셔서 감사합니다. 필자가 한 일은 내 서비스의 인터페이스를 구현 한 데코레이터 유형 클래스를 작성한 다음 ChannelFactory에 의해 생성 된 투명한 프록시를 래핑했습니다. 그런 다음 Policy Injection Application Block을 사용하여 작업을 시도 할 각 작업 호출에 코드를 삽입하는 레이어를 만들고 CommunicationObjectFaultedException이 발생하면 채널을 중단하고 다시 만들고 작업을 다시 시도 할 수있었습니다. . 이제는 훌륭하게 작동합니다. 단점은 있지만 래퍼 클래스가 모든 서비스 작업을 구현해야한다는 것입니다. 그러나 PIAB를 사용할 수있는 유일한 방법은 이것이 나를위한 감각으로 사용할 수있는 유일한 방법이었습니다. 앞으로 인터페이스를 사용하는 것만으로도 쉽게 변경할 수 있습니다.

3

차라리 콜백 함수,이 같은 것을 사용합니다 클래스를 사용하여 유사한 코드를 작성할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 대단히 감사합니다. 이 솔루션에 대한 한 가지 우려는 100-200 번 이상한 서비스 호출에 대해 서비스 호출의 각 호출이 ServiceProxy.Instance.TryInvoke에 래핑되었는지 확인하고 추가해야한다는 것입니다. 추가 서비스 요청이 모두 감싸는 것을 보장하는 유지 보수의 악몽 - 나는 정책 누출 AppBlock (또는 다른 AOP 유형 프레임 워크)을 사용하는 것 이외의 다른 방법을 볼 수 없다. – CraigM

관련 문제