2012-04-12 2 views
3

IIS 7에서 호스트 된 WCF 서비스를 일정 기간 동안 성공적으로 실행 한 다음 다른 네트워크 위치와 통신하지 못합니다 (TCP 외부 세계에 연결 가능한 포트) 응용 프로그램의IIS 호스팅 WCF 서비스가 TCP 포트 "불충분 한 winsock 리소스"

배경 :

내 시스템이 큰 미디어 파일을 (시간이 소요되는) 변환합니다. 나는 중앙 WCF 서비스라고 불리는 서버 A에 위치한 중앙 집중식 WCF 서비스를 가지고 있습니다. 그런 다음 다른 서버 (B, C, D, E, F 등)의 미디어 파일을 실제로 트랜스 코딩하는 많은 클라이언트 서비스를 제공합니다.이 서비스는 '클라이언트 프로세서 서비스'라고합니다. Central WCF Service는 'Transcode Jobs'가 처리되도록 보내지는 클라이언트 프로세서 서비스를 관리합니다. 이러한 각 클라이언트 프로세서 서비스는 자체 호스팅 WCF 서비스이며, 기본적으로 장기 실행 프로세스를 수행하고 중앙 WCF 서비스가 작업 진행률을 확인하여 폴링합니다. 따라서 중앙 WCF 서비스는 이러한 클라이언트에 대한 연결을 열어 작업 진행률을 폴링합니다. 폴링은 각 클라이언트에 약 2-3 초마다 발생합니다.

중앙 WCF 서비스는 클라이언트 프로세서 서비스에 대한 주소의 문자열 목록을 저장합니다. 각 클라이언트를 폴링하는 데 사용되는 코드 (벗었 버전) 아래 descrbied된다

나는 중앙 WCF 서비스 및 여기에 많은 트랜스 코딩 작업을 제출할 수 있습니다 : 그것은 휴식 때 발생하는

public ClientProcessorClient getClientByaddress(string address) 
{ 
    Binding bidning = new NetTcpBinding(SecurityMode.None); 
    return new ClientProcessorClient(bidning, new EndpointAddress(address)); 
} 

public void pollJobs() 
{ 
    foreach (string clientAddress in clients) 
    { 
     ClientProcessorClient client = getClientByaddress(clientAddress); 
     int progress = client.GetProgress(); 
     client.Close(); 
     // Do stuff with progress 
    } 
} 

클라이언트에 작업을 성공적으로 제출하고 진행 상황을 업데이트합니다. 중앙 WCF 서비스가 호스팅되는 서버를 한 시간 정도 처리하면 제대로 작동하지 않습니다. 중앙 WCF 서비스 Insufficient winsock resources available to complete socket connection initiation.에서 클라이언트 WCF 서비스에 연결할 때 오류가 발생합니다. 클라이언트 WCF 서비스는 모두 로컬 컴퓨터에서 실행되는 WCF 테스트 클라이언트에서 ping 할 수 있습니다. 또한이 상태에서 서버가 네트워크 파일 리소스를 볼 수 없다는 것을 알았습니다. 원격으로 로그인하여 네트워크에 연결된 저장소 폴더를 찾으려고 시도했지만 연결에 실패했습니다. 그러나 그 서버에 전화를 걸 수 있습니다. WCF 테스트 클라이언트를 열고 중앙 WCF 서비스에 연결하여 ping 메서드라고 부를 수 있습니다. 통신은 서버에서 IN은 가능하지만 OUT은 허용되지 않습니다. 관심의

몇 가지 포인트 :

서버에 연결이 될 수있는 오류 상태에서

있지만 서버에서.

내 서비스 (중앙 WCF 서비스 및 클라이언트 프로세서 서비스)는 각각 싱글 톤 인스턴스입니다.

중앙 WCF 서비스는 IIS 7에서 호스팅되는 및 응용 프로그램 풀 재활용

불행하게도 명명 된 파이프가 옵션 (클라이언트와 서버가 서로 다른 시스템에있는)

내 생각/질문하지 사용할 수 없습니다

모든 부호는 TCP 소켓이 부족한 서버를 가리 킵니다. WCF ClientProcessorClient을 제대로 설치하고 있습니까? 나는 그들을 제대로 처분하고 있습니까? using 성명서로 포장해야합니까? 문제가 발생하는 곳을 디버깅/진단 할 수있는 방법을 알고있는 사람이 있습니까?

감사

좋거나 병이 들어

답변

1

Microsoft는 예외 닫기() 메소드에 던져 질 수 있도록 WCF 서비스 프록시 로직 (ClientBase 직접 ChannelFactory에에서 하나)를 구현하기로 결정했다. Dispose() 메서드는 Close()를 호출하지만 나는 소스 코드를 보려고 시도한 적이 없다고 생각합니다. 프록시가 오류 상태 인 경우 TCP 세션과 같은 리소스를 해제하려면 Abort()를 호출해야합니다.

결과적으로 WCF 서비스 프록시는 Close() 또는 Abort() 호출이 성공적으로 완료 될 때까지 리소스를 해제하지 않습니다. 이 blog post을 살펴보면 프록시 인스턴스를 제대로 닫을 수 있습니다.

+0

'Close()'가 매번 성공한다는 것을 확신하지만, 곧 테스트 할 것입니다. 따라서 방금 말한 것에 기반하여 열린 소켓이 없어야합니다. – user989056

관련 문제