2011-10-28 77 views
0

我的服務器機器上存在一個文本文件,該文件不斷更新(大約一次大約5秒)。在我的網頁上,我想讓div在MVC中使用jQuery實時顯示此文件。使用jQuery(MVC)異步流式傳輸文件系統文本文件

我已經有jQuery timer工作,但文件沒有顯示。我的計劃是讓jQuery每5秒加載一次Controller Action,並讓該操作返回一個FilePathResult。

腳本:

$(function() { 
     var streamer = $("div.wrapper div.streamer"); 
     //=== 

     var active = false; 
     $(document).ready(function() { 

      $(".uncontrolled-interval p", streamer).everyTime(1000, function() { 
       $(this).load("/Home/Stream"); 
      }); 
     }); 
    }); 

的觀點:

<div class="wrapper"> 
    <div class="streamer"> 
     <div id="uncontrolled-interval" style=" height:420px; width:1200px; background-color:Black; color:White; overflow: auto; " ></div> 
    </div> 
</div> 

控制器:

Public Function Stream() As ActionResult 
    Return File(ConfigurationManager.AppSettings.Item("LiveStreamPath"), "text/plain") 
End Function 

LiveStreamPath包含路徑到文本文件。我正在考慮在Action中創建一個StreamReader。我可以使用什麼樣的實現來獲取這個文件流?

回答

0

有兩種方法:POLL和PUSH。

您採用的方法是讓客戶端通過發送AJAX請求並顯示結果(即使內容未更改)來定期輪詢服務器。在這種情況下你有一個共享資源。這個共享資源是文件。這個資源可以被不同的線程/進程同時訪問。文件的問題在於,當一個線程正在寫入文件(您說文件每5秒更新一次)時,如果另一個線程試圖從中讀取數據,則很可能會失敗或從文件中獲取不一致的數據。因此,如果您決定採用輪詢方式,則必須確保能夠正確同步對該文件的訪問。取決於它是寫入文件還是另一個進程的另一個線程,可能有不同的技術來實現這一點。例如,如果它是另一個線程,則可以使用Monitor.Enter(相當於C#lock)。對於共享資源的跨進程同步,您可以使用Mutex

第二種方法是PUSH方法。在這種模式下,它是在文件更新時向客戶端發送通知的服務器。這是一個更加優化的方式,因爲客戶端並沒有用大量的AJAX請求來維護服務器。有不同的技術來實現這一點。例如在HTML5中,您可以使用WebSockets。微軟正在致力於一個名爲Signalr的優秀平臺,它以非常簡單的方式實現了這種情況。

0

我只是做了這個jQuery的一個小測試應用程序(測試的背景,而不是使前景工作得很漂亮。它通過點擊一個鏈接,它發送1請求來啓動過程並觸發顯示器調用。

function startJob() { 
    $.get('<%=ResolveUrl("~/Background/StartJob.ashx") %>'); 
    setTimeout('updateStatus()', 500); 
} 
function updateStatus() { 
    $("#results").load('<%=ResolveUrl("~/Background/ReadStatus.ashx") %>'); 
    setTimeout('updateStatus()', 500); 
} 

在後臺,你可以使用File.ReadAllText()做這個簡單的,而不是任何打開的鎖。

對於寫,你可以使用File.AppendText()/AppendBytes()等,這將追加到該文件,而不把讀鎖放在它上面,我很少使用streamwriter a找到所有的FileShare參數,這通常足夠用於Web應用程序。

是的,如果您不斷更新,並有大量的數據,您可能會得到不一致的讀取。如果這不是問題(例如,沒有繁重的處理,用戶界面並不太在意),那麼保持原樣。如果UI確實在意,請使用ReaderWriterLockSlim

表示用於管理對資源的訪問的鎖,允許多個線程讀取或獨佔訪問進行寫入。