2016-09-26 2 views
5

레거시 MVC 5 웹 앱에서 장기 실행 액션에 대한 ajax 호출 버튼을 클릭 한 후 계속 탐색 할 수 있기를 원합니다.ajax 호출 후 다른 페이지를 탐색 할 수없는 이유는 무엇입니까?

(참고 : 조치가 void 반환 - 나는 응답에 관심이 아니다)

내가 작업이 완료 될 때까지 다른 요청을 드릴 수 없습니다 버튼을 클릭합니다. 편집

:

Ajax request

: 여기

[HttpPost] 
public async Task EmailReport() 
{ 
    // for testing - sleep for 10 seconds 
    await Task.Delay(TimeSpan.FromSeconds(10)); 
} 

가 크롬 개발 도구의 스크린 샷이다

$('#EmailReport') // 
    .click(function() { 
     $.ajax({ 
      type: "POST", 
      url: '/Home/EmailReport', 
      complete: function() {console.log("done")}, 
      async: true 
     }); 
    }); 

컨트롤러 : 여기는 아약스 코드

EmailReport 16,는 AJAX 호출이며, 하단에있는 두 개의 요청 나 다른 페이지로 이동하려고 - 당신이 첫 번째 요청을 볼 수 pending되고 이후 요청은 cancelled

사람이 어떤 아이디어가 있습니까 얼마나 I 이 문제를 해결하거나 문제를 해결할 수 있습니까?

+0

클라이언트에 집중하는 대신 서버를 살펴보십시오. 장기 실행 작업은 서버를 처리하는 동안 서버를 완전히 묶어 놓습니까? –

+0

백그라운드에서 실행하고 HTTP 200 응답을 리턴 할 수있는 'EmailReport'조치로 스레드를 작성하십시오. 를 통해 응답을 기다리지 마십시오. AJAX. –

+0

이전에 완료 될 때까지 IIS가 결과 요청을 처리하지 않는 로컬 시스템에서 발생합니다. –

답변

1

가장 간단한 방법은 될 것입니다.

+0

을 참조하십시오 ... –

0

를 사용하여 백그라운드 프로세스

[HttpPost] 
public JsonResult EmailReport() 
{ 
    Thread email= new Thread(delegate() 
    { 
      generatereports(); 
    }); 
    email.IsBackground = true; 
    email.Start(); 
    return null; 
} 
+0

안녕하세요, 귀하의 회신에 감사드립니다. 불행히도이 코드를 사용하여 동일한 문제가 발생했습니다 –

2

문제는 당신의 작업은 작업의 완료를 대기 때문이다. 작업을 시작하자마자 기다려서 돌아 오지 마십시오. 이 페이지 리디렉션 요청 된 페이지이기 때문에 요청이 취소

[HttpPost] 
public void EmailReport() 
{ 
    // for testing - sleep for 10 seconds 
    var myTask = Task.Delay(TimeSpan.FromSeconds(10)); 
    myTask.Start(); 
} 

이 새가 발행 될 때 요청이 취소 리디렉션 (당신이 링크를 두 번 클릭 할 때, 예를 들어, 첫 번째 클릭은 무시됩니다). 브라우저가이를 구현하는 방식입니다. 문제의 근원과 관련이 없습니다.

+0

답변을 주셔서 감사합니다 -이 변경을 만들었지 만 지금은 dev 도구 네트워크 탭에서 아약스 호출을 볼 때 500 오류가 발생합니까? –

+0

예외를 게시 할 수 있습니까? 예외는'Global.asax'의'Application_Error' 메쏘드에서'Server.GetLastError()'로 찾을 수 있습니다. https://forums.asp.net/t/1926670.aspx?How+to+get+last+exception –

0

Navigator.sendBeacon() api가 귀하의 목적을 달성 할 것으로 보입니다. HTTP를 통해 웹 서버에 비동기 적으로 적은 양의 데이터를 전송하는 데 사용됩니다. 실험적인 기술이지만 Chrome 39 이상, Firefox 31 이상, opera 26 이상에서 지원되며 다른 브라우저에서는 polyfill입니다.

Task t = new Task(() => TimeSpan.FromSeconds(10)); 
t.Start(); 

핵심 친 화성이 더 나은 CPU 사용률을 피하기 위해 장기 실행 작업에 대해 스레드에 비해 작업을 사용하는 것이 좋습니다 다음과 같이

관련 문제