2010-03-09 4 views
1

jQuery의 .ajax 기능을 사용하여 진행률 표시 줄을 만들려고합니다.jquery .ajax 요청이 장기 실행 .ajax 요청으로 차단되었습니다.

요청이 .ajax를 통해 제출되어 장기 실행 프로세스가 시작됩니다. 제출 된 다른 .ajax 요청은이 프로세스의 진행 상황을 확인하는 간격으로 호출됩니다. 그런 다음이 정보를 사용하여 진행률 측정기가 업데이트됩니다.

그러나 진행중인 .ajax 호출은 장시간 실행되는 프로세스가 완료되면 반환됩니다. 그 같은 초기 요청에 의해 차단되고.

이상한 일은 dev에서 제대로 작동하지만 배포 서버에서 실패하는 것입니다. ASP.Net MVC를 사용하여 IIS에서 실행 중입니다.

업데이트 : 분명히 IE 7에서 작동하지만 IE 8에서는 작동하지 않기 때문에 브라우저와 관련이 있습니다. IE 8은 광대역에서 최대 6 개의 연결을 허용하기 때문에 이상합니다. 도메인.

업데이트 2 : 다른 IE 8 컴퓨터에서 정상적으로 작동하는 것처럼 보이기 때문에 로컬 문제라고 생각합니다.

+0

이 보이는 시각. 일부 서버 로그를 제공 할 수 있습니까 (요청이 언제 서버에 응답합니까, 언제 응답합니까?) 그리고 아마도 서버 구성과 서버 코드가 있습니까? 어떤 이유로 든 진도 점검 (서버 측)이 차단 될 수 있습니다. 또는 브라우저 최대 접속/도메인 제한에 도달 했습니까? – MyGGaN

답변

1

일부 브라우저 (특히 IE)는 동일한 도메인에 동시에 두 번만 요청할 수 있습니다. 다른 요청이 동시에 발생하면이 제한이 적용될 수 있습니다. 한 가지 방법은 도메인에 대해 몇 가지 별칭을 사용하는 것입니다 (일부 사이트는 "www1.example.com"과 "www2.example.com"등을 사용함)

방화범이나 피들러를 사용하여 얼마나 많은 요청이 진행 중인지 확인하십시오.

+0

이것에 더하여, 과거에 사용한 또 다른 방법은 첫 번째 요청이 "백그라운드에서"요청을 처리하는 서버의 완전히 새로운 스레드를 회전시켜 첫 번째 Ajax 요청이 즉시 반환되도록하는 것입니다. 그런 다음 후속 요청을 사용하여 진행률을 반환 할 수 있습니다. 이것은 조금 더 많은 작업이지만 오랜 시간 동안 서버 연결을 묶지는 않습니다. –

2

서버는 각 사용자로부터 한 번에 한 페이지 씩만 실행합니다. 진행 상태를 얻기 위해 요청을 보내면 대기 상태가됩니다.

해결책은 @Page 지시문에 EnableSessionState="false"을 사용하여 세션이없는 상태를 반환하는 페이지를 만드는 것입니다. 그렇게하면 모든 사용자와 연결되지 않으므로 요청이 대기열에 저장되지 않습니다.

물론 이것은 세션 상태를 사용하여 프로세스를 실행하는 스레드에서 상태를 얻는 스레드로 진행 상태를 전달할 수 없음을 의미합니다. 실행중인 프로세스를 추적하는 다른 방법을 사용하고 상태를 가져 오는 요청과 함께 일부 식별자를 보내 사용자의 출처를 알 수 있도록해야합니다.

+0

이 문서는 "동시 요청 및 세션 상태"절의 [here] (http://msdn.microsoft.com/en-us/library/ms178581.aspx)에서 찾을 수 있습니다. –

1

두 번째 ajax 요청에 대한 Asynchronus 처리기 (IHttpAsyncHandler)를 만듭니다.

.ashx 쿼리 문자열을 통해 필요한 매개 변수를 사용하면 HttpContext에 필요한 항목이 없어 원하는 것을 처리 할 수 ​​있습니다. Application 개체에 거의 액세스 할 수 없습니다. 장면 뒤에

ASP.NET은 당신을 위해 CLR 풀 아닌 응용 프로그램 풀에서 스레드를 만들 것이다, 그래서 당신은 IHttpAsyncHandler에 추가 성능 향상이있을 것이다

서버가 만에 하나 개의 요청을 제공 같은
관련 문제