다른 컴퓨터의 다른 플랫폼에서 사용하기 위해 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의 요점이 아닌가요? 내 문제에 대해 더 좋은 제안이 있으십니까?
기사를 읽은 후 실제로 데이터를 스트리밍하는 것이 가장 좋겠지 만 클라이언트는 파싱/처리를 시작하기 전에 여전히 모든 데이터를 수신해야합니다. 이것의 주된 목적은 서버를 한번에 전체를 보내기 전에 RAM에 전체 응답을 저장하지 않아도되도록하는 것입니다. 4 단계는 (대략) "클라이언트가 응답 메시지에서 한 번에 한 고객을 읽습니다."라고 말하지만 응답 메시지가 이미 그 시점에 완전히 수신 된 것처럼 보입니다. 클라이언트는 한 번에 한 고객을 역 직렬화합니다. – Wutz
고객 코드가 무엇입니까? 당신이하기 전에 모든 물건들이 건너 오기를 기다리고 있습니까? 디버거를 사용하고있는 코드를 고려할 경우, 단계별 실행을 시도하는 동안 모든 데이터를 가져 오는 강제 열거 형이 될 수 있습니다. 특정 보안 설정으로 인해 WCF 연결 속도가 느려질 수도 있습니다 ... – iMortalitySX
그러면 클라이언트가 모든 고객의 도착을 기다리고 있다고 생각합니까? 이것을 막을 수있는 방법이 있습니까? 내 클라이언트 측에서 내가 정적 기능을 IEnumerable GetAllCustomers (메시지 메시지)를 사용 –