jQuery GETs以及与IE的POST

时间:2012-01-13 16:31:28

标签: jquery ajax asp.net-mvc-3 post

我们正在使用jQuery.ajax()方法在我们的MVC 3网站上的许多页面上请求服务器数据。这些请求始终标有'POST'ajax参数类型,通常在页面加载时或可能在计时器上调用,也就是说,它们不是用户操作的结果(例如鼠标单击)。

当我们查看(Elmah)错误日志时,我们会看到许多条目如下:

  

在控制器'Inbox.WebUI.Areas.Application.Controllers.StatusController'上找不到公共操作方法'GetMessageStats'。

控制器动作标有[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();

});

在调查中看来,除了所需的POST请求之外,某些浏览器(IE7 / IE8,但可能还有其他浏览器)似乎发出了GET请求。请注意,用户界面在这些浏览器下响应并正常运行,因此正在为POST请求提供服务。

Elmah将用户代理报告为:

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

有没有人见过这个问题?如果是这样,你找到了避免它的方法吗?

感谢。

4 个答案:

答案 0 :(得分:3)

对于它的价值,重新:多余的GET,我发现有一些工具栏/安全服务可以“检查”网址以确保它们有效。我相信是TrendMicro有一个Web of Trust类型插件,可以重新轮询网站以检查它们是否存在恶意软件。

您是否尝试使用简写ajax方法,例如$ .post()?此外,如果您正在获取数据,是否有特定原因需要POST?

如果您通过Fiddler或您选择的工具生成请求,您在响应中是否会收到相同的错误?

答案 1 :(得分: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/

答案 2 :(得分:0)

您在javascript代码中使用的方法是GET方法。所以尝试从控制器操作方法中删除[HttpPost]。

或者将其作为post方法,传递这样的帖子数据。

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

试试这个。未经测试..

答案 3 :(得分:0)

我曾遇到过类似的问题。我的解决方案是添加另一个设置值:

processData: false

到jQuery ajax调用。