2009-10-29 6 views
3

많은 스마트 클라이언트에 대해 단방향 파일 동기화를 수행하는 매우 간단한 WCF 서비스가 있습니다. 나는 통화 도중 네트워크 또는 서비스 중단이있을 때 클라이언트가 전체 응용 프로그램이 다시 시작될 때까지 서버와 통신 할 수 없게된다는 것을 알고 있습니다.WCF 클라이언트가 서비스 중단시 중단됨

서비스는 BasicHttpBinding으로 실행되며 transferMode="Streamed"messageEncoding="Mtom"을 사용하여 IIS6 (.svc 페이지)에서 호스팅됩니다. 이 서비스는 기본 InstanceContextMode (필자는 Per Per Call?) 및 ConcurrencyMode = Single을 사용하도록 구성되어 있습니다. 기본 스로틀 링 동작을 사용하고 있지만 다른 어느 누구도 공격하지 않는 격리 된 테스트 환경에 있습니다.

클라이언트는 Windows 서비스입니다. 이 ServiceProxyHelper을 사용하여 연결이 Close() '또는 Abort()'d 일 때 올바르게 표시합니다. Dispose() 'd 일 때 세션이 없으므로 문제가 아닌 것으로 생각합니다. 오류가 발생하면 Client 개체가 삭제 된 다음 범위를 벗어납니다. 예외가 감지되면 서비스는 조금 기다린 다음 새 클라이언트 객체를 만들고 다시 시도합니다. 따라서 장애로부터 복구해야하지만 어떤 이유로 서비스에 대한 모든 후속 호출이 실패합니다.

클라이언트를 시작하여 파일을 몇 개 전송 한 다음 서버를 다시 설정하여이 파일을 안정적으로 재현 할 수 있습니다. 먼저 클라이언트는 일반적으로 "서비스가 너무 바쁩니다"라는 오류 (응용 프로그램을 다시 시작하는 동안 발생하는 IIS 503 오류에 매핑 됨)를 표시합니다. 그 후에는 서비스에 대한 이후의 모든 호출이 시간 초과됩니다. 내가 알 수있는 한, 전화가 클라이언트에 의해 시도조차되지 않는다. 추적 기능을 사용할 수 있으며 표시되는 내용은 다음과 같습니다. 시간 초과 오류, "HTTP를 통해 요청 메시지를 보내지 못했습니다."경고, 다른 제한 시간 오류.

미친 문제는 app.config에서 Fiddler (포트 8888)를 프록시로 사용하도록 클라이언트를 구성하면 모든 것이 원하는대로 작동한다는 것입니다. 그래서 Fiddler가 프록시로서 WCF 자체가 아닌 일종의 연결을 닫거나 마무리하는 것입니다.

생각하십니까?

편집 2009-10-30 8:54 PM : 서비스 속성이 다음과 같이 변경되었습니다. InstanceContextMode = Single 및 ConcurrencyMode = Multiple. 차이 없음.

답변

2

글쎄 그건 아팠다. 그것은 나를 영원히 데려 갔지만 마침내 나는 프록시를 사용하지 않고 실행하는 것의 차이점을 <system.net> 설정에두기 시작했다. 이 구성 비트를 클라이언트에 추가하면 문제가 해결됩니다.

<system.net> 
    <settings> 
     <servicePointManager expect100Continue="false" /> 
    </settings> 
    </system.net> 

어떤 일이 벌어지고 있는지 설명 할 수 있습니까? 이 설정으로 인해 WCF 클라이언트가 서비스가 중단 될 때 돌이킬 수 없을 정도로 멈추게되는 이유는 무엇입니까?

+0

100 Continue 기능과 관련된'WebRequest'에 알려진 버그가 있습니다. http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds

0

이 문제는 클라이언트 측 문제가 아닙니다. 귀하의 Windows 서비스가 메인에서 별도의 스레드에서 WCF를 호출하고있는 경우 처리되지 않은 예외가 자식 스레드에서 발생하는 경우 ... 호출 스레드가 여기에 앉아 있거나 대기하지 않을 수도 있습니다. 영원히 기다리고 있습니다. becaues 기다리고 있습니다. 그 스레드가 돌아올 수 있도록.

그 이유는 서비스 내부에 예외가 있으며 서비스가 더 이상 서비스를 호출하지 않는 것처럼 보입니다.

.NET 2.0 Windows 서비스의 프로세스를 생성하기 위해 타이머를 사용할 때 큰 문제가되었습니다.

+0

나는 그것이 클라이언트 측 문제라고 생각 하나, 스레딩이라고 생각하지는 않습니다 만,이 클라이언트가 메인보다 별도의 스레드에서 생성되는 것이 맞습니다. 스레드 대신 BackgroundWorker를 사용 중이며 스레드 오류가 발생하면 다시 시작하도록 RunWorkerCompleted 이벤트에 연결했습니다. 이 논리가 실행되는 것을보고 있으며, 작업자가 다시 시작하여 서비스와 통신하려고 시도하고 있습니다. 이 후속 통화는 실패합니다. – roufamatic

관련 문제