2013-10-21 41 views
2

我目前正在開發一個網站,並無法找到正確的解決方案。檢測服務器是否仍然有使用不同瀏覽器的Ajax請求c#jquery

當我從另一個瀏覽器打開我的網站並嘗試同時進行AJAX調用時,出現錯誤,因爲兩個瀏覽器都在處理請求。

有沒有辦法檢測服務器當前是否正在執行AJAX調用,並等待它在執行第二個請求之前完成第一個請求?

這裏是我的代碼時,我嘗試使用不同的瀏覽器

using (StreamWriter sw = new StreamWriter(hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString() + ".hhp", false)) 
      { 

       sw.WriteLine("[OPTIONS]"); 
       sw.WriteLine("Compatibility=1.1 or later"); 
       sw.WriteLine("Compiled file=" + hhpPath + "\\Unpublished\\"+ Name +".chm"); //the file to be converted 
       sw.WriteLine("Contents file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhc"); //TOC file 
       sw.WriteLine("Default topic=" + "Installing the Prototype Terminal.html"); 
       sw.WriteLine("Display compile progress=no"); 
       sw.WriteLine("Index file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhk"); //index file 
       sw.WriteLine("Title=none"); 
       sw.WriteLine("\r\n[FILES]"); 
       sw.WriteLine("none"); 
      } 

錯誤說,該文件是目前使用,使在同一時間一個Ajax請求。

+0

請問你在哪裏遇到問題?什麼是錯誤?理想情況下,每個請求都有單獨的線程。所以不必擔心通話中的衝突。 –

+0

是的,我知道我只需要在調用下面的請求之前完成ajax調用,因爲我的類正在使用.exe或第三方程序,並且當他們請求運行該.exe文件時,它有一個錯誤,因爲有人正在使用中的另一個人,所以我需要等到ajax調用完成。 – bRaNdOn

+0

完成發佈代碼我將它包含在上面的問題中 – bRaNdOn

回答

2

事實上,它是通過jQuery的AJAX調用是無關緊要的。你的問題是:你的網站試圖在請求上獨佔訪問一個資源(在你的情況下,寫入一個常量文件)。

由於該網站旨在同時爲很多客戶提供服務,因此您將不可避免地遇到訪問問題。

您試圖實現的功能對於網站並不是很典型。你能否描述你想解決什麼問題,以便我們能給你一個更好的建議?

可能的解決方案可能是一個組合:

  • 寫入到不同的文件對每個請求
  • (如在另一個答案建議)妥善地處理文件訪問錯誤:要麼等到它是免費的,或者返回一個錯誤
  • 使用,而不是用於寫入數據的文件系統
  • 限制此功能特定的客戶端數據庫
  • 完全刪除此功能
+0

即時通訊嘗試將HTML文件捆綁到CHM使用HTML幫助WORKSHOP ang im寫入文件需要將cenvert HTML文件CHM我的問題是什麼時候瀏覽器轉換CHM文件在同一時間我有一個錯誤,因爲它發生了他們試圖在同一時間使用一個邏輯上不正確的文件。即時通訊當前正在嘗試您的建議,看看它是否有效當前找到這個問題的答案 – bRaNdOn

+0

這變得更加清晰。我甚至不知道接下來要問什麼問題。 – Zruty

+1

感謝這個想法,我已經想出了一個解決方案 通過爲每個請求分配一個隨機文件名,以便作家不寫入相同的文件名來修復錯誤「正在由不同的用戶使用,」 – bRaNdOn

1

當你發出ajax請求時,它不能直接檢測客戶端是否正在使用文件。您可以在該項目周圍進行嘗試捕獲,並返回-1(文件鎖定)狀態1(成功)或0(某些其他錯誤)。

或者嘗試下面的函數來檢查你的代碼之前,看看文件是否在使用中,並返回相關的狀態到ajax調用。

protected virtual bool IsFileLocked(FileInfo file) 
    { 
     FileStream stream = null; 
     Boolean status = false; 
     try 
     { 
      stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
      status = false ; 
     } 
     catch (IOException) 
     { 
      //the file is unavailable because it is: 
      //still being written to 
      //or being processed by another thread 
      //or does not exist (has already been processed) 
      status = true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 

     //file is not locked 
     return status; 
    } 
+0

在調用IsFileLocked()後,文件可能會被鎖定,因此該函數不能達到預期目的。 – Zruty

+0

@Zuty終於有了stream.Close();將解鎖文件,這將鎖定文件幾微秒。只有在另一個請求在很短的時間內發生衝突。 –

1

你需要鎖定文件,而寫入文件內容,如下面

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write('text'); 
    sw.Flush(); 
    sw.Close(); 
} 

請檢查this鏈接線程同步。

+0

這將工作但是如果寫入時間更長,它會超時瀏覽器中的ajax請求。 –

+0

是的你是對的。我們可以檢查文件是否被鎖定寫入。如果是,則發送確認消息,否則處理該請求。另一種方法是跟蹤數據庫中的文件處理。 –

相關問題