2009-11-10 6 views
0

서버에서 호스팅되는 WCF 서비스를 호출하는 코드 조각이 있습니다.WCF : 시간 초과 오류

코드는 반복적으로이 메서드를 호출 할 때마다 계속 순환합니다. (그것은 '상태'를 요구하는 것이므로 어떤 일도하지 않습니다.)

잠시 후 오류가 발생하는 경우를 제외하고는 괜찮습니다.
이 요청 작업은 net.tcp : // serverName : 9001/service1에 전송되어 구성된 시간 제한 (00:00) 내에 응답을받지 못했습니다. : 09.9843754)

갑자기 서버에 연결할 수 없습니다. 타임 아웃을 1 분으로 늘렸지 만 여전히 같은 문제입니다. 서비스를 호스팅하는 프로그램은 아무것도하지 않고 '상태'만 제공한다는 점에 유의하십시오. 따라서 WCF 서비스 앱이 사용 중이므로 문제가되지 않습니다.

서비스를 호출하는 코드에 문제가 있다고 생각합니다. 서비스를 다시 시작할 때 서비스가 정상적으로 연결될 수 있기 때문입니다 ... 또 다른 짧은 시간이 지나면 다시 시간 초과 오류가 발생합니다. 이런 이유로 나는 그것이 네트워크 오류 중 하나를 thnk하지 않는다. 나는 앱을 재시작 할 때 일정 시간 동안 괜찮을 것이다.

다음은 서비스를 호출하는 데 사용하는 코드입니다. 내가 그것을 정리하거나 각하 worng 뭐하는거야 각 호출 후 ChannelFactory 처분해야합니까?

 NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

       EndpointAddress endPoint = new EndpointAddress(new Uri(clientPath)); 

       ChannelFactory<IClient> channel = new ChannelFactory<IClient>(binding, endPoint); 
       channel.Faulted += new EventHandler(channel_Faulted); 
       IClient client = channel.CreateChannel(); 

       ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 0, 10); 
       ClientStatus clientStatus = client.GetStatus(); 

답변

0

GetStatus 호출을 마친 후에는 클라이언트 연결을 닫아야합니다. 이를 수행하는 가장 좋은 방법은 using 블록을 사용하는 것입니다. 그러나 전화 클라이언트 후에도 이와 같은 작업을 수행 할 수 있습니다 .GetStatus()

ClientStatus clientStatus = client.GetStatus(); 

try 
{ 
    if (client.State != System.ServiceModel.CommunicationState.Faulted) 
    { 
     client.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
} 
+0

상태가 잘못되면 이웃 Close() 또는 About()이 호출되기 때문에 작동하지 않습니다. try 블록 내에서 client.GetState()를 이동하거나 Close()를 호출하기 전에 코드 분할을 제거해야합니다. –