2012-08-09 7 views
0

현재 클라이언트가 메시지와 함께 XML 파일을 보내 서버와 통신하는 서비스를 개발 중입니다. 메시징의 신뢰성을 향상시키기 위해 (클라이언트는 저 대역의 제한된 대역 스위치 모바일 인터넷을 사용할 것입니다.)이 메시지를 64KB 또는 128KB 크기의 작은 부분으로 채우고 BasicHttp 바인딩에서 전송 = "스트리밍"으로 전송합니다.WCF : WS- 듀얼 바인딩 또는 basichttp 바인딩을 스트림 파일에 청크로

이제 문제가 생겼습니다 : 서버가 클라이언트에게 청크를 성공적으로보고하면 fe 5 청크가 전송되지 않은 후 전송 프로세스가 취소되고 나중에 시도되도록 연기됩니다. 어떤 청크가 수신되고 어떤 청크가 수신되지 않는지 추적한다.

콜백 메커니즘을 사용하여 클라이언트와 통신 할 생각입니다. 서버가 콜백 메소드 인 ChunkReceived를 호출합니다. 서버 쪽에서 파일에 청크를 저장하면 ChunkReceived가 호출됩니다. 잘못되었지만 콜백은 WS Dual http 바인딩에서만 작동하며 basichttp 바인딩에서는 지원되지 않습니다. 그러나 스트리밍 된 전송은 WS 이중 바인딩에서 지원되지 않습니다.

그럼 WS 이중 바인딩으로 전환하고 transfer = "버퍼링 됨"(청크 크기가 비교적 작다고 가정)을 사용하면 전송 안정성이 떨어지지 않습니까? 아니면 어떻게 든, 어쩌면 응답 메시지의 어떤 종류를 반환하여, 기본 HTTP 바인딩에서 클라이언트와 통신 할 수 있습니다 즉 ServerResponse가 SendChunk 작업을 확인하는 경우 클라이언트에게 몇 가지 열거 나 부울 플래그를 개최한다

[OperationContract] 
    ServerResponse SendChunk (Chunk chunk); 

. 그런 다음 모든 청크 상태를 추적하기 위해 클라이언트 및 서버 측에서 일종의 배열을 유지해야합니다. 나는 거기에 사용할 수있는 가장 좋은 패턴이 무엇인지 모르겠습니다. 모든 조언을 높이 평가 될 것입니다.

답변

1

낮은 대역폭과 많은 연결 해제/시간 초과 같은 우리의 응용 프로그램에서도 비슷한 문제가있었습니다. 우리는 더 작은 메시지를 가지고 있기 때문에 우리는 그들을 분할하지 않았지만 해결책은 청크에도 적용됩니다. 고객에게 Repeater를 생성했습니다. 이것은 안정적인 솔루션으로 입증되었습니다. GPRS와 같이 느리고 연결 상태가 좋지 않은 클라이언트의 경우 잘 작동합니다 (이동이 자주 끊기는 경우). 또한 서버가 높은로드로 인해 속도가 느려지면 클라이언트에서 시간 초과 오류가 발생하지 않습니다. 여기 덩어리 버전을 수정

클라이언트 :

1. Client sends Chunk#1, with pretty short timeout time 

2. Is there OK response: 

    2A. Yes - proceed to next chunk 

     3. Was that last chunk? 

      3A. Yes - process reponse 

      3B. No - send next chunk 

    2B. No - repeat current chunk 

서버 :

  1. 승인 요청

  2. 덩어리가

    반복

    2A. 예 :

    3A :

    1. 최종 덩어리입니다. 예 - 응답이 준비되어 있는지 확인하고, 그렇지 않으면 기다립니다 (이럴 경우 클라이언트가 반복됩니다)

      3B. 아니오 - 응답 응답을 보내십시오.

    2B.번호 :

    5A : 어딘가에

    1. 저장 요청 (목록, 사전 등)

    2. 이 마지막 덩어리입니다. 예 - 메시지를 처리하고 응답을 저장하여 클라이언트에 보냅니다.

      5B. 아니오 - 질문/전송 부분을 바인딩에 대해 확인 메시지

+0

알고리즘을 주셔서 감사합니다,하지만 보내기? –