2012-01-13 90 views
1

我們正在使用jQuery.ajax()方法在我們的MVC 3網站上的許多頁面上請求服務器數據。這些請求總是用'POST'ajax參數類型標記,並且通常在頁面加載或定時器上調用,也就是說,它們不是用戶操作的結果(例如,鼠標點擊)。jQuery GET以及POST與IE

當我們看(ELMAH)錯誤日誌中,我們看到了一些項目如下:

公共行動方法「GetMessageStats」是不是在控制「Inbox.WebUI.Areas.Application找到。 Controllers.StatusController」。

控制器動作用[HttpPost]例如

[HttpPost] 
public JsonResult GetMessageStats() 
{ 
    MessageStatsViewModel model = new MessageStatsViewModel 
    { 
     TotalNoMessages = MailDB.GetMessageCount(), 
     MessagesInQueue = MailDB.GetQueueLength() 
    }; 

    return Json(model); 
} 

,這裏是調用客戶端腳本:

$(function() { 
    var $totalMessages = $("#total-messages"), 
     $queuedMessages = $("#queued-messages"); 

    function getStats() { 
     $.ajax({ 
     type: "POST", 
     url: "/Application/Status/GetMessageStats", 
     dataType: "json", 
     cache: false, 
     success: function (data) { 
      $totalMessages.text(data.TotalNoMessages); 
      $queuedMessages.text(data.MessagesInQueue); 
      setTimeout(function() { 
       getStats(); 
      }, 15000); 
     }, 
     error: function (xmlHttpRequest, errorMessage, exception) { 
      throw errorMessage; 
     } 
     }); 
    } 

    getStats(); 

}); 

在調查似乎有些瀏覽器(IE7/IE8,但也許其他人)似乎問題除了需要POST GET請求請求。請注意,用戶界面在這些瀏覽器下響應並正確運行,以便POST請求得到服務。

ELMAH報告了這個用戶代理:

的Mozilla/4.0(兼容; MSIE 6.0; Windows NT的5.1)

有其他人看到這個問題?如果是這樣,你有沒有找到一種方法來避免它?

謝謝。

+3

請顯示您的客戶代碼,因爲這是發生這種情況。 – 2012-01-13 16:34:17

+0

Diodeus說什麼。這更可能是客戶端代碼問題。 – Etch 2012-01-13 16:41:33

+0

查看您的服務器HTTP日誌以獲取有關這些GET請求的更多信息。它們是在POST之前還是之後完成的,以及使用了哪些UserAgent?等。 – Stefan 2012-01-13 16:42:21

回答

3

對於什麼是值得的,回覆:多餘的東西,我發現有一些工具欄/安全服務,將「檢查」的網址,以確保它們是有效的。我相信TrendMicro擁有一個Web信任類型插件,可以重新輪詢站點以檢查惡意軟件。

你有沒有嘗試過使用速記ajax方法,如$ .post()?另外,如果你正在獲取數據,是否有一個特定的原因,你需要一個POST?

如果您通過Fiddler或您選擇的工具生成請求,您會在響應中看到相同的錯誤嗎?

+0

您好John,我嘗試過使用Fiddler,但儘管嘗試使用IE6,IE7,IE8,IE9,但無法複製問題Firefox和Chrome。正如你所建議的,我懷疑這個問題是由一些額外的瀏覽器插件引起的。 url本身只能從這個腳本引用。無論何時我們想向服務器提交數據,我們都傾向於使用POST - 即使只是簡單的查詢參數。在上面的例子中,我們可以同樣使用GET。我會嘗試$ .post()來查看它是否有任何區別。感謝您的幫助。 – Neilski 2012-01-19 07:56:41

+0

'TrendMicro'與我的一個巨大的愛情故事。 (聽到諷刺?) – 2012-01-25 15:05:23

+0

嗨,約翰,你原來的懷疑是正確的。我們看着另一個「鎖定」網站,看到了同樣的問題。在更受控制的環境中,識別錯誤更爲容易,而且您猜測是由於運行趨勢科技Titanium Internet Security 2012的用戶造成的!感謝您的幫助 - 我已將您的賞金頒發給您,以表示我的讚賞。現在唯一的問題仍然是如何管理這些錯誤 - 我猜想忽略它們? – Neilski 2012-01-26 10:02:57

0

顯然這發生在您有另一個修改URL並附加GET參數的函數時。如果發生這種情況,那麼IE有發送GET和POST請求的傾向。

該函數可能可能是'ajaxSend',它是在發送ajax請求之前調用的jQuery函數。

解決方案是不直接修改URL,而是將任何需要的額外參數傳遞到請求中。

取自信息: http://www.justinball.com/2009/07/08/jquery-ajax-get-in-firefox-post-in-internet-explorer/

+0

我不確定這是同一個問題。我們看到一個多餘的GET請求(儘管指定了一個jax type ='POST')。也不會修改url或傳遞任何數據 - 它只是一個靜態鏈接。 – Neilski 2012-01-14 10:09:41

+0

您應該檢查您的Web服務器日誌以確保請求沒有任何請求參數嗎? – Danack 2012-01-14 13:45:48

+0

我已經檢查了日誌,並且我可以確認它們沒有在額外的GET請求上顯示任何請求參數 – Neilski 2012-01-15 12:35:45

0

您在JavaScript代碼中使用的方法是GET方法。因此,請嘗試從控制器操作方法中刪除[HttpPost]。

或者使它成爲一種後期處理方法,傳遞這樣的後期數據。

url: "/Application/Status/GetMessageStats", 
data: {}, 
dataType: "json", 

試試這個。未經測試..

+0

嗨Sunil,如果您查看原始帖子,您將看到$ .ajax()調用用參數type ='POST'裝飾。遵循jQuery文檔,這應該覆蓋默認的'GET'到'POST'。我明白,我可以通過從控制器中刪除[HttpPost]屬性來消除錯誤,但這不是重點,我試圖建立的是如何在代碼不調用GET時啓動GET。昨天,在250個頁面請求中,虛假的GET僅出現19次。 – Neilski 2012-01-22 10:45:34

0

我曾經有類似的問題。我的解決方案是添加另一個設置值:

processData: false 

給jQuery ajax調用。