2009-04-10 7 views
5

처음에는 Response.Close와 Response.End의 차이점을 알아 내려고했지만 더 많은 인터넷 검색 및 연구를 수행 한 결과 일반적인 것을 보지 못했습니다. way Byte [] 클라이언트로 다시 보내집니다. 코드 샘플을 아래에 남겨 두겠다.하지만 업계 표준이 이것을 어떻게하는지 알고 싶다.ASP.NET 사용자에게 파일을 스트리밍하는 방법

Byte[] myBytes = GetReportBytes(); 
HttpContext.Current.Response.ClearContent(); 
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString()); 
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension()); 
HttpContext.Current.Response.ContentType = GetApplicationContentType(); 
HttpContext.Current.Response.BinaryWrite(myBytes); 
HttpContext.Current.Response.Flush(); 
HttpContext.Current.Response.Close(); 
//CERT FIX 
//HttpContext.Current.Response.End(); 

답변

15

나는 Response.Close() 또는 Response.End()으로 전화하지 않을 것입니다.

Response.End() 그 시점에서 페이지 실행/렌더링이 중지됩니다. Response.End() 다음의 코드는 실행되지 않습니다. 스트림에 추가 출력이 추가되지 않으면 응답이 그 시점에서 종료됩니다.

Response.Close()Response.End()과 비슷하지만 호출 후 코드를 실행할 수 있습니다 (그러나 페이지 응답에서 더 이상의 출력을 보낼 수 없음).

Response.Flush()은 나머지 응답 항목을 페이지로 보냅니다. IIS core team member에서

: - 당신이 경우, 예를 들어

Response.Close는 클라이언트에 리셋 패킷을 전송하고 문제의 모든 종류에 을 이끌 것 오류 조건 이외의 에서 사용 클라이언트가 지연 시간이되면 리셋 패킷이 버퍼링 된 다른 응답 데이터가 서버, 클라이언트 또는 어딘가에 누락되어 사이에 누락 될 수 있습니다. 이 특별한 경우

는 압축 는 패턴을 더 이상 발견 반복의 기회 증가에 대한 응답과 압축 코드에 의해 버퍼링 될 수있다 응답의 일부 금액 내에서 일반적인 패턴 을 찾고 포함 -이 부분을 그 버퍼링 됨 일단 Response.Close()를 수행하면 클라이언트에 보낼 수 없습니다.

즉, Response.Close()를 사용하지 마십시오.

+0

정보 주셔서 감사합니다 ... – RSolberg

+0

@Mitch - 나는 일반적인 방법으로 스트리밍하는 방법에 대해 조금 더 변하고 있습니다. 나는 이것에 대한 표준을 실제로보고 있지 않으며 거기에서 시작하고 싶습니다. – RSolberg

+3

그래서 파일을 스트리밍 할 때 Response.Close() 또는 Response.End()를 호출하지 않습니까? Response.Flush()를 호출하여 버퍼에서 파일을 보내고 메서드를 끝내시겠습니까? – StuperUser

관련 문제