我有一个带有以下签名的MVC4控制器:
[HttpPost]
public JsonResult SubmitPage(PageSubmissionModel model)
{
...
return Json(result);
}
其中返回模型是一个简单的模型:
public class Page
{
public Guid PageId { get; set; }
public Guid SurveyId { get; set; }
public int PageNo { get; set; }
public string Title { get; set; }
public string Introduction { get; set; }
}
或JSON编码的url字符串:
return Json(new {
RedirectTo = Url.RouteUrl(route.RouteName, route.RouteValues)
});
使用以下jQuery方法从客户端调用此控制器:
ajaxPost: function (responseData, callback) {
$.ajax({
type: "POST",
url: ""/Surveys/Ajax/SubmitPage",
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json; charset=utf-8",
cache: false,
success: function (data) {
if (typeof callback === 'function') {
callback(data);
}
},
error: function (xmlHttpRequest, errorMessage, exception) {
var msg = "Problem calling " + url + "()\r\n" + errorMessage;
alert(msg);
}
});
}
其中data参数是一个JavaScript对象,构造如下:
responseData = {
SurveyResponseId: 23,
SubscriberResponseId: 47,
PageId: 1,
Responses: [
{id: 24, value: "Tom" },
....
]
};
当我运行此代码时,我收到以下服务器错误:
此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站披露敏感信息
研究这个错误(http://haacked.com/archive/2009/06/25/json-hijacking.aspx)我很困惑,因为据我所知,并且由Fiddler出生,客户端正在发布JavaScript模型,所以我不明白为什么服务器会抛出GET请求错误。此外,Controller标有[HttpPost]属性。
如果有人能提供帮助,我们将不胜感激。
答案 0 :(得分:1)
请尝试使用以下代码
[HttpPost]
public JsonResult SubmitPage(PageSubmissionModel model)
{
...
return Json(result,JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:0)
感谢Bardo先前的评论,我已经找到了这里发生的事情。
在某些情况下,客户端脚本构造的数据模型将错误的数据值分配给模型。这可能导致服务器上的未捕获异常,其错误消息(我认为)导致GET异常。
通过加强初始模型验证并在控制器中添加一些更强大的错误管理,我能够识别提交的模型中的错误,并因此将其追溯到其(JavaScript)构造函数。
最终,这个问题表明需要能够在开发中完全复制生产环境,在这种情况下我没有做到这一点。一旦我可以在调试器下复制问题,就很容易识别。