1

하나 또는 두 개의 장기 실행 요청이있는 MVC4 앱이 있습니다. 이를 위해, 먼저 반복 작업을 동기 작업으로 남겨 둘 것입니다. 그러나 이러한 작업의 추적 출력을 웹 응용 프로그램의 선택적 '진행률'창에 표시하는 것이 좋습니다.웹 페이지에 추적 정보를 표시하기위한 사용자 지정 추적 : 수신기를 어떻게해야합니까?

데이터베이스 추적 수신기 또는 세션에 저장된 '추적 수집'개체에 대한 권한이있는 추적 수신기가 관련된 두 가지 솔루션이 있습니다. 그런 다음 '진행'창에서 setInterval과 Ajax 호출을 사용하여 주기적으로 이러한 추적 저장소를 폴링 할 수 있습니다.

너무 간단하게 들리므로 내가 어떻게해야하는지 묻습니다. 더 나은 방법, 확립 된 패턴 및 기술이 있습니까? 아니면 거의 가치가없는 운동입니까?

답변

1

SignalR을 사용하여 추적 메시지를 서버 측에서 직접 브라우저의 "진행 창"으로 보낼 수 있습니다.

Dino Esposito는 진행 막대와 비슷한 기능을하는 msdn에 article을 작성했습니다.

이렇게하면 진행률 창에서 서버를 폴링 할 필요가 없으며 폴링 요청 사이에 메시지를 저장하기 위해 세션을 사용할 필요가 없습니다.


편집 : 샘플은 그 기사가 작성된 이후

이 SignalR이 조금 변경되었습니다했다.

<script type="text/javascript"> 
    $(document).ready(function() {  

     // Create a proxy for the server endpoint    
     var progressHub = $.connection.progressHub; 
     $.connection.hub.start(); 

     // Add a client-side callback to process any data 
     // received from the server 
     progressHub.client.addProgress = function (message) { 
      $('#progress').append('<li>' + message + '</li>'); 
     }; 

    }); 
</script> 

하자 : 그렇다 Global.asax에있는 경로를 등록하고보기에서 스크립트를 포함에서, 당신은 클라이언트 측 signalR 프록시를 초기화하고 진행 정보를 표시하는 기능을 추가하는 자바 스크립트의 다음 조각이 필요합니다 해당 페이지에 서버에서 장기 실행 프로세스를 트리거하는 버튼이 있다고 가정 해보십시오. 간단하게하기 위해 홈 컨트롤러에서 RunProcess이라는 메서드에 대한 다음 jquery 호출을 사용합니다. 서버가 진행 데이터를 수신 할 필요가있는 알 수 있도록 그것은 SignalR 클라이언트의 ID를 전달합니다 :

$("#runProcess").click(function() {     
    var id = $.connection.hub.id; 
    $.get("/Home/RunProcess/" + id); 
}); 

서버 측에서을의 HomeController의 다음과 같은 방법은 장기 실행 프로세스를 시뮬레이션합니다. SignalR을 사용하여 클라이언트에게 알리려면 GlobalHost.ConnectionManager.GetHubContext<T>()을 사용하여 컨텍스트를 가져와야합니다. 그런 다음 클라이언트 프록시에 정의 된 방법 addProgress(message)를 호출해야하지만 단지 수신 ID를 가진 클라이언트에 대한 것입니다 :

public void RunProcess(string id) 
{ 
    var progressHub = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>(); 

    progressHub.Clients.Client(id).addProgress("25% completed"); 
    Thread.Sleep(2000); 

    progressHub.Clients.Client(id).addProgress("50% completed"); 
    Thread.Sleep(3000); 

    progressHub.Clients.Client(id).addProgress("75% completed"); 
    Thread.Sleep(2000); 

    progressHub.Clients.Client(id).addProgress("Process Finished"); 
} 
+0

그래서 나는'SignalRTraceListener'를 작성합니다? 흥미 롭 군. – ProfK

+0

NuGet에서 최신 버전의 SignalR을 사용하여 샘플 코드를 추가했습니다 (기사에서 사용 된 것과 약간 차이가 있음). 그런 다음 서버 측 코드를'SignalRTraceListener '에 적용 할 수 있습니다. –