2012-11-21 2 views
3

다른 컴퓨터의 다른 플랫폼에서 사용하기 위해 IIS에서 실행되는 WCF 서버를 작성하는 중입니다. 클라이언트 (serialize) 많은 개체를 반환해야합니다. 내 DB에서 모든 데이터를 가져 와서 Cilent의 요구 사항에 따라 정렬 한 이후로 스트리밍해야하므로 매우 긴 프로세스이므로 클라이언트가 스트리밍 할 때 결과를 처리 할 수 ​​있어야합니다.스트리밍 WCF 많은 수의 개체

주제에 대해 읽은 후 transferMode StreamedResponse와 함께 WCF를 사용하면 지연된 실행으로 개체를 반환 할 수 있으며 이는 내 요구에 응답 할 수 있습니다.

나는 다음 문서 읽기 : http://weblogs.asp.net/cibrax/archive/2008/06/10/streaming-large-content-with-wcf-and-deferred-execution.aspx

을 그들이 설명하는 하나의 유사한 WCF를 구현했습니다. 따라서 많은 양의 데이터를 시뮬레이션 할

for(long i = 0; i < 1000000; i++) //All the customers should be read from the database 
{ 
    yield return new Customer { FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" }; 
} 

:

for(long i = 0; i < 1000; i++) //All the customers should be read from the database 
{ 
    yield return new Customer { FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" }; 
} 

에 그러나 나는에서 자신의 코드를 변경했습니다. 이 작업을 수행 할 때 클라이언트 측의 함수가 객체를 반환하기 전에 몇 초 동안 멈춘다는 것을 알게되었습니다.
왜 이런 일이 발생합니까? 데이터가 스트림에서 즉시 흐르기 시작하면 안됩니까? 지연된 실행을 사용하는 스트리밍 WCF의 요점이 아닌가요? 내 문제에 대해 더 좋은 제안이 있으십니까?

+0

기사를 읽은 후 실제로 데이터를 스트리밍하는 것이 가장 좋겠지 만 클라이언트는 파싱/처리를 시작하기 전에 여전히 모든 데이터를 수신해야합니다. 이것의 주된 목적은 서버를 한번에 전체를 보내기 전에 RAM에 전체 응답을 저장하지 않아도되도록하는 것입니다. 4 단계는 (대략) "클라이언트가 응답 메시지에서 한 번에 한 고객을 읽습니다."라고 말하지만 응답 메시지가 이미 그 시점에 완전히 수신 된 것처럼 보입니다. 클라이언트는 한 번에 한 고객을 역 직렬화합니다. – Wutz

+2

고객 코드가 무엇입니까? 당신이하기 전에 모든 물건들이 건너 오기를 기다리고 있습니까? 디버거를 사용하고있는 코드를 고려할 경우, 단계별 실행을 시도하는 동안 모든 데이터를 가져 오는 강제 열거 형이 될 수 있습니다. 특정 보안 설정으로 인해 WCF 연결 속도가 느려질 수도 있습니다 ... – iMortalitySX

+0

그러면 클라이언트가 모든 고객의 도착을 기다리고 있다고 생각합니까? 이것을 막을 수있는 방법이 있습니까? 내 클라이언트 측에서 내가 정적 기능을 IEnumerable GetAllCustomers (메시지 메시지)를 사용 –

답변

1

링크의 코드를 살펴 보았습니다.

서버에서 데이터를 반환하기 전에 CreateMessage가 서버에서 실행되어 전체 결과를 변수 메시지에 배치하는 것처럼 보입니다.

Message message = Message.CreateMessage(MessageVersion.Soap11, "GetAllCustomers", new CustomBodyWriter(GetAllCustomersImpl())); 
    return message; 
+0

인터페이스는 고객을 반복 내 홈페이지에서 전화 : [의 ServiceContract] \t 공용 인터페이스 IService1 \t { \t \t [OperationContract를] \t \t 메시지 GetAllCustomers(); \t}. 클라이언트가 모든 데이터를 기다리는 것을 의미합니까? 그렇다면 스트리밍의 요점은 무엇입니까? –

+2

클라이언트가 기다리지는 않습니다. 서버가 전체 목록을 생성하기 전에 보내기가 시작되지 않습니다. 대기는 스트리밍이 시작되기 전입니다. –

+0

나는 이것을 '리턴 메시지'에 중단 점으로 다시 테스트했다. 라인 및 클라이언트 쪽에서 중단 점을 발견하고 그 시간은 서버 쪽에서 메시지를 작성하는 것이 아니라는 것을 알아 차렸습니다. 실제로 메시지가 반환되었습니다. 이것은 데이터를 전송하는 wcf 구현에 있음을 의미합니다. –