2009-10-12 4 views
7

wcf 클라이언트에 대한 재 연결 논리를 구현하려고합니다. 현재 채널이 오류 상태가 된 후에 새 채널을 만들어야한다는 것을 알고 있습니다. 내가 채널 오류가 발생한 이벤트 처리기에서 이런 짓을 :WCF 콜백 채널 오류


internal class ServiceClient : DuplexClientBase, IServiceClient 
{ 
    public ServiceClient(ICallback callback, EndpointAddress serviceAddress) 
    : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress) 
    { 
    // Open the connection. 
    Open(); 
    } 

    public void Register(string clientName) 
    { 
    // register to service 
    } 

    public void DoSomething() 
    { 
    // some code 
    } 
} 

public class ClientApp 
{ 
    private IServiceClient mServiceClient; 

    private ICallback mCallback; 

    public ClientApp() 
    { 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    mServiceClient.Register(); 

    // register faulted event for the service client 
    ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted); 
    } 

    void ServiceClient_Faulted(object sender, EventArgs e) 
    { 
    // Create new Service Client. 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    // Register the EI at Cell Controller 
    mServiceClient.Register(); 
    } 

    public void DoSomething() 
    { 
    mServiceClient.DoSomething(); 
    } 
} 

하지만 내 단위 테스트에서 나는 여전히 "통신 개체를 얻을 System.ServiceModel.Channels.ServiceChannel는 통신에 사용할 수 없습니다 그것은 폴트에 있기 때문에 상태 "예외.

콜백 채널이 여전히 오류가 발생할 수 있습니까? 그렇다면 어떻게 콜백 채널을 대체 할 수 있습니까?

+0

예외를 유발할 때 단위 테스트가 수행하는 작업을 지정할 수 있습니까? –

+0

유닛 테스트에서는 서비스 호스트와 클라이언트 인스턴스를 생성합니다. 서비스에 클라이언트를 등록한 다음 참조를 null로 설정하여 서비스를 중지합니다. 그런 다음 20 초 (InactivityTimeoutof 10 초로 신뢰할 수있는 세션을 사용하고 있으므로 20 초 후에 연결이 끊어 졌음) 클라이언트에서 DoSomething() 메서드를 호출합니다. 이제 서비스를 다시 만들고 클라이언트가 다시 연결될 것으로 기대합니다. 그 순간 나는 예외를 얻는다. – phatoni

답변

5

지금까지 WCF 연결을 잘못하여 다시 만들어야한다는 것을 경험했습니다. 그렇지 않으면 복구 할 방법이없는 것처럼 보입니다. 오류가 발생하는 경우 메서드는 정상적으로 실행되는 것처럼 보입니다. 그러나 현재 요청이 진행될 때 WCF 연결을 시작하고 새로 설정하는 경우가 종종 있습니다.

몇 가지 제안 사항 : - 시간 초과 관련 일 경우 통화가 마지막으로 걸린 시간과 시간 초과 값이 포함 된 상수를 추적하십시오. 비활성으로 인해 WCF 연결이 끊어지면 을 다시 작성하고 전에 요청을 보냅니다. - 다른 것은 결함 처리기를 다시 추가하지 않는 것처럼 보입니다. 즉, 첫 번째 오류는 처리되지만 두 번째 오류는 처리기가 없어도 넘어 지므로 새 처리기가 연결되지 않습니다.

희망 하시겠습니까?

0

Faulted 이벤트 처리기에서 mServiceClient.Abort를 호출하여 통신 채널을 재설정하려고 시도 했습니까?

편집 : 난 당신이 복구 코드에서 mCallback 객체를 초기화하지 않는 것을 볼 수

. 새 인스턴스에 할당해야 할 수도 있습니다.

+0

도움 주셔서 감사합니다. 예, 이전에 시도했지만, "통신 객체, System.ServiceModel.Channels.ServiceChannel은 Aborted 상태이기 때문에 통신에 사용할 수 없습니다."예외가 발생했기 때문에 도움이되지 않았습니다. 예외. – phatoni