2011-08-03 5 views
2

WCF 연결이 열려 있는지 확인하는 데 문제가 있습니다. 내 WCF 연결은 양방향입니다. State 속성을 사용하여 클라이언트에서 연결의 상태를 확인합니다. 내 기능 :WCF 연결 확인 문제가 발생했습니다.

10 초마다 실행되는 스레드 인 서비스를 만들어 연결 상태를 확인합니다. 확인을 위해 ConnectionIsOpen() 메서드를 사용합니다. Windows XP에서 모든 것이 잘 실행됩니다. 그러나 Windows 7에서 실행할 때 문제가 있습니다.

연결을 끊으려면 네트워크 케이블을 분리 할 때 Windows XP에서 응용 프로그램을 실행하는 경우 연결 상태를 확인하는 것이 잘못되었지만 Windows 7에서 실행중인 경우 연결 상태를 확인하는 것이 좋습니다. 여전히 열렸습니다.

누구나 연결이 열린 상태인지 확인하는 방법을 알려줄 수 있습니다. 감사.

+0

명세서 재미 보인다면 ... 왜 그냥 :

세부 사항에 대한 링크를 참조하십시오! (m_Service = 널 (null) && m_Service.State == CommunicationState 경우. Open 문) – c0deNinja

+0

if 문이 수행하는 작업을 잘 모르는 경우 다른 도장에서 연습 할 수 있습니다. (하하 내가 꼬마 꼬마 야) "State"변수는 서로 다른 통신 상태를 적용 할 수 있습니다. Lu Lu가 관심을 갖는 것은 "Opened"(생성 될 수도 있음)입니다. – feathj

+0

'Connection_sOpen()'은'm_Service! = null' 인 경우 항상 true를 반환하고, m_Service instant not 생성시 문제가 될 수 있습니다 in connection state – Damith

답변

0

Windows 7에서 완전히 다른 결과를 얻고 있다는 사실은 놀라운 것이 아닙니다. Microsoft는 Windows Vista로 TCP 스택을 완전히 다시 설계했기 때문에 핵심 네트워킹 기능의 XP와 기능이 상당히 다릅니다.

내가해야 할 첫 번째 일은 wireshark를 사용하여 실제 무엇이 와이어를 통과하는지 확인하는 것입니다. 플러그를 당길 때 TCP 연결이 실제로 종료되는지 확인하십시오. 연결이 빨리 다시 발생하는 경우 Windows에서 일종의 연결 유지/버퍼링을 수행 중일 수 있습니다.

2

우리 시스템에서 비슷한 문제가 발생했습니다. 네트워크 케이블을 연결 해제하거나 클라이언트 시스템 또는 서버를 절전 모드로 설정해도 채널 오류가 생성되지 않습니다.

내가 알 수있는 바로는 연결 상태는 현재 연결 상태가 아닌 마지막 호출 이후의 연결 상태 만 나타내는 것 같습니다. 현재 상태를 알 수있는 유일한 방법은 실제로 서비스를 호출하는 것입니다.

자주 발생하지만 반응이 없어야하는 서비스를 클라이언트가 호출 할 필요가없는 경우 클라이언트 측에서 주기적으로 서비스를 폴링하는 더미 호출을 구현하는 것이 해결책입니다. 모호한 호출이있을 때 연결을 사용할 수없는 경우 처리 할 수있는 채널 오류가 발생합니다.

잡기는 단순히 서비스에 대한 다음 호출이 작동을 보장하기 위해 더미 전화를 사용할 수있다 :

public void SomeMethode() 
{ 
    if (ConnectionIsOpen()) 
    { 
     m_Service.Dummy(); 
     // Connection is lost here 
     m_Service.SomeMethode(); 
    } 
} 

이 문제를 해결하기 위해, 우리는 시스템을 구현하는 자동으로 다시 실행하는 연결이 복원 된 후 채널 오류를 생성하는 실패한 서비스 호출.

4

이 항상 true 될 것입니다 :

(m_Service.State | CommunicationState.Opened) == CommunicationState.Opened

예를 m_Service.State = 0 :

0 | CommuncationState.Opened ==는 CommuncationState.Opened

대신 & (AND)를 사용하고 싶습니다.

proxyInstance.InnerChannel.Faulted -= new EventHandler(ProxyChannelFaulted); 

하지만이 WsHttpBinding과 같은 ReliableMessaging을 지원하는 바인딩에서만 작동 :

관련 문제