문제

긴 작업을 수행하기 전에 고객에게 콘텐츠를 보내려고합니다.

Response.Write("Processing...");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

Firefox에서는 예상대로 작동하지만 IE8, Safari 및 Chrome에서는 모든 코드가 처리 될 때까지 기다린 다음 전체 텍스트를 표시합니다.

아래 샘플과 같이 더 나은 형성 HTML을 보내려고했지만 동일한 결과를 얻었습니다.

Response.Write("<html><head><title>test</title></head><body>Processing...</body></html>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

고맙습니다!

도움이 되었습니까?

해결책

당신이 직면하고있는 문제는 당신이 보내는 응답이 여전히 불완전하다는 것입니다. 버퍼의 브라우저에있는 모든 것을 플러시하더라도 응답 종료를 기다리거나 지금까지 얻은 것을 처리하는 것은 브라우저에 달려 있습니다. 따라서 브라우저 간의 차이입니다.

더 나쁜 것은 서버와 브라우저 사이의 인터넷에있는 일부 중간 노드 농축기, 방화벽 등에서 동일한 동작을 기대할 수 있다는 것입니다.

결론은 브라우저가 데이터 스트림으로 무언가를 수행하도록하려면 resign.end를 사용하여 완료해야한다는 것입니다.

다시 말해서, 응답 데이터 중 일부를 먼저 보내고 나머지를 보내려면 더 나은 옵션은 응답을 둘로 깨고 첫 번째 부분을 완성하고 두 번째 부분을 별도로 다운로드하는 것입니다.

다른 팁

이것을 해결하는 쉬운 방법은 작업을 수행하는 실제 페이지 앞에 "기다려, 처리"페이지를 배치하는 것입니다. "제발 대기"메시지가 표시 된 다음 메타 새로 고침 태그 및/또는 JavaScript를 사용하여 실제 처리 페이지로 리디렉션하여 즉시 처리를 시작합니다.

"기다려주세요"페이지 :

<html>
<head>
  <meta http-equiv="refresh" content="0;url=process.aspx?option1=value&...." />
  <title>Please Wait, Processing</title>
</head>
<body>
  Processing...
</body>
<script type="text/javascript">
  window.location = "process.aspx?option1=value&....";
</script>
</html>

메모:

  1. 브라우저가 하나를 사용할 수없는 경우 처리를 시작하기 위해 두 가지 방법을 사용하여 처리가 수행됩니다. 다른 방법을 사용하기를 바랍니다.
  2. 처리 URL 및 쿼리 스트링을 교체해야합니다.
  3. 이 방법의 단점 중 하나는 사용자가 브라우저 뒤로 버튼을 누르면 "프로세스"페이지에서 "제발 대기"페이지로 돌아갑니다. 즉, 실수로 다시 작업이 시작됩니다. 다른 주제에 대한 그 도전을 남길 게요!

또한 IIS 서버가 GZIP로 출력을 압축하는 경우 모든 것을 무시하는 것 같습니다. Response.Flush 전화.

이것은 IIS7과 Windows 7에서 기본적으로 켜집니다.

또한 Fiddler로 테스트하는 경우 "스트리밍"모드를 켜거나 Fiddler가 플러시 된 HTML을 수집하여 연결이 완료 될 때까지 보관하십시오.

응답이 완료되기 전에 (컨텐츠 길이가 알려지기 전에) asp.net 런타임은 청크 인코딩 부분 응답을 생성합니다. 이를 렌더링하는 방법을 결정하는 것은 브라우저에 달려 있습니다. 테스트에서 브라우저가 이미지를 렌더링하는 경향이 있음을 발견했습니다.<img> 부분 응답에 포함 된 태그). 당신은 그것을 시도 할 수 있습니다.

그러나 보내는 것에주의하십시오 </html> 너무 빨리; 브라우저는 그 시점을 지나서 무시할 수 있습니다. 브라우저는 항상 부분 페이지를 렌더링하므로 평소와 같이 페이지의 시작부터 시작할 수 있습니다.

도움이되는 경우, 나는 내 책 에서이 예를 자세히 살펴 봅니다.이 책에서 와이어에서 무슨 일이 일어나는지 정확히 보여주는 패킷 트레이스를 포함하여. 초고속 ASP.NET.

브라우저는 길이에 따라 컨텐츠를 가져 와서 사용한다고 생각하므로 1000 숯 정도를 패딩 할 수 있습니다. 예를 들어:

문자열 myveryShortMessage = "처리 ...";

Response.write (MyveryShortMessage.Padright (1000)); 응답 .Flush ();

System.threading.thread.sleep (5000);

response.write ( "finish".padright (1000)); 응답 .Flush ();

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top