1

我有一个具有以下签名的 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] 属性。

如果有人可以提供帮助,将不胜感激。

4

2 回答 2

1

请尝试您的代码,如下所示

[HttpPost]
public JsonResult SubmitPage(PageSubmissionModel model)
{
   ...
   return Json(result,JsonRequestBehavior.AllowGet);
}
于 2013-05-03T11:00:05.447 回答
0

感谢 Bardo 之前的评论,我已经找到了这里发生的事情。

在某些情况下,客户端脚本构建的数据模型为模型分配了错误的数据值。这可能会导致服务器上出现未捕获的异常,其错误消息(我认为)导致 GET 异常。

通过加强初始模型验证并在控制器中添加一些更强大的错误管理,我能够识别提交模型中的错误,从而将其追溯到其 (JavaScript) 构造函数。

最终,这个问题表明需要能够在开发中准确地复制生产环境,在这种情况下我做得不够好。一旦我可以在调试器下复制问题,就很容易识别。

于 2013-05-03T13:36:19.120 回答