2008-10-14 6 views

답변

3

당신이 루츠 리플렉터와 HttpResponse.WriteFile의 구현을 보면 알 수 있듯이 그것은 완전히 동기이다. Response.WriteFile을 호출 한 직후 파일을 삭제할 수 있습니다.

응답 스트림이 클라이언트에 완전히 전송되었다고 보장 할 수는 없지만 Response.Flush을 호출해도 보증이 제공되지 않습니다. 따라서 파일을 삭제하기 전에 Response.Flush 번으로 전화 할 필요가 없습니다.

MemoryStream에 파일을로드하는 것을 피하면 아무런 이점이 없으며 특히 메모리 용량이 큰 파일의 경우 비용이 많이 듭니다.

+0

고마워, 이것 역시 나를 도왔다! –

+2

나는 이것을 단지 테스트했고 이론적으로는 동의하지만 실제로는 그렇지 않다. 설명서에 sychronous가 표시되어 있지만 방금 확인한 환경 (VS 2010, dev server, .Net 4)에서 ** Response.Flush **를 호출해야합니다. 그렇지 않으면 파일이 반환되어 반환 될 수 있습니다. –

0

메모리가 작동하는 경우 나머지 RESPONSE 명령과 마찬가지로 동기식입니다.

9

Response.WriteFile()으로 클라이언트에 파일을 쓰는 경우 Response.Flush()을 호출하면 해당 파일이 클라이언트에 완전히 출력되었는지 확인할 수 있습니다. 완료되면 웹 서버에서 삭제할 수 있습니다.

파일이 미션 크리티컬 한 경우 더욱 강력한 시스템을 구축하는 것이 좋습니다. 클라이언트 측 스크립트가 파일 수신 확인을 확인한 다음 웹 서버에 파일을 삭제할 수 있음을 알립니다.

+0

나를 위해 다음 접근 방식이 효과적이었습니다 :'Response.Flush(); Response.Close(); File.Delete (path); ' – Cosmin

0

전송 작업

또한 IIS하자 알아서하는 전송 작업을 호출 할 수 있습니다. 실제로 IIS에서 작업자 프로세스 외부로 전송됩니다. 당신이 정말 편집증 경우

메모리 스트림

파일을 전송하지 않습니다. 크기가 적당한 경우 메모리 스트림에로드하고 전송하십시오. 그런 다음 언제든지 파일을 삭제할 수 있습니다. 디스크의 파일은 IIS에서 절대로 건드리지 않습니다. 솔루션입니다

5

는 사용 후 구문 Response.WriteFile(fileName);, 다음 코드 줄을 입력 :

Response.Flush(); 
System.IO.File.Delete(fullPathFileName); 
Response.End(); 
+2

가능하면 Response.End()를 사용하지 마십시오. 그것은 잡히지 않는 예외를 던지고 스레드를 중단합니다. Response.SuppressContent = true를 사용하는 것이 더 좋습니다. HttpContext.Current.ApplicationInstance.CompleteRequest(); return; 대신. – pawrog

관련 문제