2008-09-30 3 views
1

아마도 간단한 해결책에 대한 긴 질문 일지 모르겠지만 여기에 ...HTTP 처리기가 처리를 완료하면 클라이언트 측에서 어떻게 알 수 있습니까?

나는 여러 파일을 선택하고 서버로 보내는 맞춤형 실버 라이트 컨트롤이 있습니다. WebCLient 컨트롤의 OpenWriteAsync 메서드를 사용하여 파일을 일반 처리기 (FileReciever.ashx)로 보냅니다.

기본적 실버 코드는 각 파일에 대해 같은 것을 수행 :

WebClient client = new WebClient(); 
client.OpenWriteCompleted += (sender, e) => 
    { 
    PushData(data, e.Result); 
    e.Result.Close(); 
    data.Close(); 
    }; 
client.OpenWriteAsync(handlerUri); 

서버 측 핸들러는 단순히 입력 스트림을 판독하고, 그 결과 바이트 어레이 좀 더 처리한다.

문제는 클라이언트 측 OpenWriteCompleted가 모든 데이터가 회선을 통해 전송되는 즉시 완료된다는 것입니다. 그러면 내 코드가 다음 파일과 연결됩니다. 내가 정말로 원하는 것은 ASHX 핸들러가 그 요청을 처리하는 동안 모두 기다릴 때까지 기다리는 것이다. 어떻게해야합니까? WebClient의 대기 메커니즘은 무엇입니까? 핸들러의 HttpContext에서 수행 할 수있는 콜백은 무엇입니까? 다른 종류의 전송 기술을 사용해야합니까? 제발 조언!

답변

0

Hrm, 단순한 solutioin은 URL에 GUID (파일마다 고유 한 GUID 또는 전송)를 태그 할 수 있습니다. 그런 다음 guid를 기반으로 다른 서비스의 상태를 검사 할 수있는 간단한 웹 서비스를 가질 수 있으며 실버 라이트 클라이언트가 처리 상태에 대한 새 서비스를 쿼리하도록 할 수 있습니다 (새 웹 서비스를 과거 전송).

+0

그런 식으로 작동 할 것입니다.하지만 다른 방법이 있기를 바랍니다. 뭔가가 내장되어 있고, 이와 같은 별도의 서비스는 필요하지 않습니다. –

0

처리기에서 반환되는 데이터가 전송하는 데 시간이 오래 걸리며 서버가 그 시간 동안 사용되지 않는다고 생각됩니다. 서버 처리가 완료된 시점을 알 수있는 방법이 없으므로 아키텍처를 변경하지 않고이 작업을 수행 할 수 있다고 생각하지 않습니다.

나는 다른 요청에서 처리기의 결과를 검색하는 데 사용할 수있는 일종의 식별자 (예 : GUID 또는 int) 만 처리기를 갖습니다. 그래서 페이지는 핸들러를 호출하고, 핸들러는 결과를 저장하고 식별자를 리턴하며, 페이지는 핸들러를 두 번째로 호출하고 다른 핸들러를 호출하여 첫 ​​번째 호출의 결과를 가져옵니다. 이렇게하면 데이터를 전송하는 동안 서버를 계속 사용할 수 있습니다.

+0

나는 서버 측 처리가 많은 리소스를 필요로하기 때문에 서버가 완전히 처리 (수신하는 것만)하면 파일 번호 1을 알기 전에 파일 2를 보내지 않기를 바란다. 당신은 대답은 기본적으로 mattlant의 것과 같기 때문에 그렇게해야만합니다. –

0

아니면 자바 스크립트 (jQuery)로 할 수도 있습니다 ... 자바 스크립트를 사용해도 상관이없는 경우.

0

파일이 크지 않고 각각을 메모리에 유지하는 것이 가능하다면 추악하지만 효과적인 솔루션은 파일을 문자열로 변환하고 UploadStringAsync 메서드를 사용하여 전송하는 것입니다.

파일 크기에 제한이없는 경우이 방법을 피하십시오. 그러나 이제는 상대적으로 작을 수 있으므로이 방법을 사용할 수 있습니다.

1

실버 라이트 forums과 같은 질문이 있습니다. Microsoft는 WebClient 및 OpenWriteAsync를 사용하여이를 수행 할 수 없다는 답변을 승인했습니다. 사용자 UploadStringAsync 또는 HttpWebRequest 중 하나가 필요합니다.

관련 문제