2017-09-21 35 views
0

我有一個古老的asp.net網站我一直在慢慢地重構使用angularjs。我的一個頁面調用了一個長時間運行的過程,我想讓用戶瞭解進度,並保持活動狀態。在asp.net/angularjs中長時間運行進程的輪詢進度

我想我可以通過使用一些angularjs比如下面的實現:

$scope.setupLongRunningProcess= function() { 
     $scope.progress = {}; 
     $scope.result = null; 

     startLongRunningProcess(); 

     $timeout(function() { 
      pollProgress(); 
     }, 5000); 
    } 

    function pollProgress() { 
     if (!$scope.result) { 
      $http({ 
       method: "POST", 
       url: "MyPage.aspx/PollProgressJson", 
       data: {} 
      }).then(function successCallback(response) { 
       $scope.progress.Count = response.data.d; 

       $timeout(function() { 
         pollProgress(); 
       }, 5000); 
      }); 
     } 
    } 

    function startLongRunningProcess() { 
     $http({ 
      method: "POST", 
      url: "MyPage.aspx/LongRunningProcessJson", 
      data: {} 
     }).then(function successCallback(response) { 
      $scope.result = response.data.d; 
     }); 
    } 

它開始了OK,調用startLongRunningProcess()這就要求MyPage.aspx/LongRunningProcessJson,然後調用pollProgress()作爲預期。但是,它永遠不會到達服務器上的MyPage.aspx/PollProgressJson。在服務器上長時間運行PROCESSS只是一個平常的WebMethod:

<WebMethod> 
Public Shared Function LongRunningProcessJson(...) As Result(Of String) 
    Dim service As LongRunningProcessService = GetService... 
    Return service.LongRunningProcess(..., HttpContext.Current.Session) 
End Function 

在這裏,我用的是HTTP會話投放進度計數,所有PollProgressJson正在做的是查詢該。

我不希望我到LongRunningProcessJson原來的呼叫完成,直到它完成,所以我應該做在那裏的異步調用來完成所有的工作(和等待,直到它返回之前完成)?

或者,我採取了完全錯誤的方法? (是的,我知道,我不喜歡傳遞一個會話對象到我的業務層,它確實感到非常噁心)

我也試過使LongRunningProcessJson WebMethod異步,但PollProgressJson不會被調用:

<WebMethod> 
Public Shared Async Function LongRunningProcessJson(...) As Threading.Tasks.Task(Of Result(Of String)) 
    Dim service As LongRunningProcessService = GetService... 
    Return Await Task.Run(Function() service.LongRunningProcess(..., HttpContext.Current.Session)) 
End Function 

回答

0

所以,事實證明,Asp.Net頁面請求排隊(通過召開會議鎖定),其可能是寫入同一會話,這隻能在頁面級別被關閉(當然,除非你的整個Web應用程序不需要它),而不是WebMethod級別。所以解決方案是加入:

<%@ Page .... EnableSessionState="ReadOnly" ...." %> 

我的頁面指令,並刪除使用Session寫進度(我不喜歡這樣做)。相反,您可以使用數據庫,全局變量(yuk)或文件來存儲&查詢您的臨時進度。

注:我相信在MVC您可以通過添加屬性做在控制器級別同樣的事情:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
相關問題