문제

ASP.NET 웹 서비스가 있으며, 일부 파일 작업과 같은 무거운 리프팅을 수행하거나 많은 Crystal 보고서에서 Excel 시트를 생성합니다. 이 웹 서비스에 전화하여 차단되고 싶지 않으므로 웹 서비스를 비동기로 만들고 싶습니다. 또한 웹 페이지 에서이 웹 서비스를 호출하고 싶습니다. 서버를 계속 폴링하여 화면에 진행 상황을 표시 할 수있는 메커니즘을 원합니다. 처리되었습니다. 웹 메소드 호출이 완료된 경우 알림을 원하지 않고 실시간 진행 상태를 원합니다. 어떻게해야합니까?

도움이 되었습니까?

해결책

서버에 예약 된 작업의 ID를 전달하여 쿼리 할 수있는 별도의 메소드를 작성하여 0-100 (또는 0.0 및 1.0 등) 사이의 대략적인 값을 반환합니다.

예를 들어, 휴식 스타일에서는 GET 요청을 할 수 있습니다. http://yourserver.com/app/jobstatus/4133/ 간단한 '52'를 다시 반환합니다 text/plain. 그러면 당신은 단지 (두 번째? 2 초? 10 초?)를 쿼리해야합니다.

백엔드에서 모니터링을 실제로 달성하는 방법은 프로세스가 무엇인지 및 작동 방식에 크게 달려 있습니다.

다른 팁

XML 웹 서비스가 느리다고 생각하므로 여러 메소드를 생성하고 투표 진행 상황이 될 것입니다 매우 느립니다 서버에서 큰 부하를 생성합니다. 나는 생산 환경에서 그것을하지 않을 것입니다. 데이터베이스 폴링과 동일하지만 더 작은 문제가 있습니다.

노력하다 비누 확장 대신에. 이벤트 중심 모델을 구현합니다. 보다 MSDN의 웹 서비스 클라이언트 응용 프로그램에 진행률 표시 줄 추가.

당신은 또한 수 SoApextensions를 사용하십시오 다운로드/프로세스 진행 상황을 클라이언트에게 알리려면. 서버는 이벤트를 클라이언트에게 보낼 수 있습니다. 사용하지 않으면 클라이언트에서 변경할 필요가 없습니다.

고객에게 이와 같은 것을 허용합니다.

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}

초기 "시작 보고서 생성"웹 서비스 호출이 일부 작업 풀에서 작업을 생성하고 호출자에게 작업의 ID를 반환하도록하십시오.

그런 다음 주어진 태스크 ID에 대해 "수행 된 백분율"을 반환하는 다른 방법을 제공하십시오.

완료된 작업에 대한 실제 결과를 반환하는 세 번째 방법을 제공하십시오.

가장 쉬운 방법은 웹 서비스가 통화 진행 상황으로 데이터베이스의 필드를 업데이트하도록 한 다음 해당 필드를 쿼리하고 값을 반환하는 웹 서비스를 작성하는 것입니다.

웹 서비스를 통해 일종의 작업 ID 또는 세션 ID를 반환하십시오. 해당 ID로 쿼리 할 다른 웹 방법을 작성하여 필요한 정보 (% 완료, 파일 목록 등)를 반환합니다. 이 방법을 클라이언트로부터 어느 정도 간격으로 폴링하십시오.

데이터베이스를 사용하여 프로세스 정보를 저장하십시오. 웹 서비스를 메모리 하여이 작업을 수행하는 경우 웹 팜 환경에서는 폴링중인 작업보다 작업이 다른 서버에서 실행될 수 있으므로 확장되지 않습니다.

편집 : 방금 또 다른 비슷한 대답을보고 그에 대한 의견을 보았습니다. 댓글 작성자가 옳습니다. 디스크 작동을 피하기 위해 메모리 내 테이블을 사용하지만 별도의 DB 서버를 사용할 수 있습니다.

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