2011-04-11 3 views
7

WCF 서비스에서 엔티티 목록을 가져 오려고합니다. 문제는 네트워크에 약간의 대기 시간이있어 데이터가 클라이언트에 도착하는 데 상당한 시간이 걸리는 것입니다. 내가 가지고있는 아이디어는 처음 1000 개를 얻는 방법을 찾고 다음에 오는 것들이 도착하기를 기다리는 동안 그것들을 UI로 밀어 넣는 것입니다.큰 목록을 얻으려면 <T>을 WCF에서 청크로 만드시겠습니까?

나는 그것이 페이징 같은 것 생각하지만 난 그냥

건배 DB를에서 한 번에 한 페이지를 얻을 페이지로이 아니라 WCF 층의 전체 세트를 원하는

답변

0

필자는 통신을 위해 tcpTransport를 사용함에 따라 필자는 이중 채널을 사용하여 필자가 원하는대로 작업을 마쳤습니다.

내가 한 것은 큰 목록을 반환하는 현재 SearchMethod를 변경하는 것입니다. 이 방법에서는 DB에서 데이터를 가져 와서 콜백 작업을 통해 클라이언트에 전송합니다.

3

당신은 항상 당신의 서비스를 분할 할 수 있습니다 두 가지 방법으로 인터페이스. 대신 예를 들어

List<T> GetItems() 

당신은 할 수 있습니다 :

int GetItemCount() 

List<T> GetItems(int start, int maxSize) 

을 수동으로 페이징을 구현할 수 있도록.

+0

서비스 측면에서이 목록을 '캐시'하는 가장 좋은 방법은 무엇입니까? –

+0

지속성 계층에 따라 다릅니다. 예를 들어, NHibernate는 요청간에 세션을 공유하는 한 캐싱을 자동으로 수행합니다. (실제로는 2 층 캐시와 많은 옵션이 있습니다.) 다른 프레임 워크를 사용하는 경우 해당 설명서를 살펴 봐야합니다. SQL을 직접 사용하고 있다면 SQL을 살펴 보는 것이 좋습니다. – sukru

+0

우리는 SQL을 직접 사용하고 스위칭은 옵션이 아니라 이미 nhibernate의 장점을 알고 있지만 우리는 고객이 사용하지 않는 제약을 가지고 있습니다 ... –

6

WCF는 메시지를 상위 수준으로 전달하기 전에 메시지 전체를 확인합니다. 따라서 데이터가 완전하게 도착해야하고 일반적인 WCF 계약이 작동하지 않습니다.

그러나 streaming with WCF을 사용할 수 있습니다. 이것은 페이로드가 스트림으로부터 점차적으로 판독되어 상위 레벨로 전달되도록한다. 이 작업을 얻기 위해 다음을 수행해야합니다

  • , 서버 측에서 스트림
  • 를 제공합니다 (link에 내가 제공)
  • 변경 서비스 계약을 스트리밍을 가능하게 개체를 직렬화 및 스트림에 쓰기 시작 , 아마 100 청크. DataContractSerializer를 사용하여 엔티티를 직접 serialize해야합니다. 상자의 내용은 매우 간단합니다.
  • 프로세스가 현재 100이 완료된 곳을 찾을 수 있도록이 100 개의 엔티티 사이에 구분 기호를 제공해야합니다. 한 가지 가능한 옵션은 1KB의 바이트 0입니다.
  • 클라이언트 측에서는 Async로 함수를 구현합니다. 구분 기호를 누를 때까지 버퍼에서 스트림 (예 : 4KB)을 계속 읽습니다. 한번 명중하면 비동기 이벤트를 deserialize하고 발생시킵니다.

더 복잡한 당신이 필요한 모든 것을 WCF 바로 상자 밖으로하지만 달성이.

+0

다시 링크가 없습니다.방금 IE 6 (Work PC)을 확인했고 Chrome을 사용하고 있습니다. 나는 브라우저가 무언가를 깨뜨리는 것이 조금 걱정이지만, 둘 다 똑같습니다. – Ian

+0

고마워요. 이안. 나는 사실 오프 - 아픈 침대에서 그래서 내 문제가되었을 것입니다 :) – Aliostad

+0

나는 이것이 노력 가치가 있다고 생각하고, 나는 조금 놀아 볼게, 이상적으로 내가 어디서 추상화되어 있는지를 알기를 원한다. 내부적으로 어떻게 작동하는지 클라이언트 측에서 걱정할 필요가 없습니다. –

관련 문제