我们正在使用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)
有没有人见过这个问题?如果是这样,你找到了避免它的方法吗?
感谢。
答案 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调用。