ASP.NET MVC JsonResult 返回 500

Posted

技术标签:

【中文标题】ASP.NET MVC JsonResult 返回 500【英文标题】:ASP.NET MVC JsonResult return 500 【发布时间】:2011-03-08 00:52:43 【问题描述】:

我有这个控制器方法:

public JsonResult List(int number) 
 var list = new Dictionary <int, string> ();

 list.Add(1, "one");
 list.Add(2, "two");
 list.Add(3, "three");

 var q = (from h in list where h.Key == number select new 
  key = h.Key,
   value = h.Value
 );

 return Json(list);

在客户端,有这个 jQuery 脚本:

$("#radio1").click(function() 
  $.ajax(
    url: "/Home/List",
    dataType: "json",
    data: 
      number: '1'
    ,
    success: function(data) 
      alert(data)
    ,
    error: function(xhr) 
      alert(xhr.status)
    
  );
);

我总是收到错误代码 500。有什么问题?

谢谢

【问题讨论】:

这适用于 ASP.NET MVC 2,对吗? JsonRequestBehavior.AllowGet 要求从版本 2 开始。 【参考方案1】:

如果你看到实际的反应,它可能会说

此请求已被阻止,因为 敏感信息可能是 向第三方网站披露 在 GET 请求中使用它时。到 允许 GET 请求,设置 JsonRequestBehavior 到 AllowGet。

您需要使用重载的Json 构造函数来包含JsonRequestBehaviorJsonRequestBehavior.AllowGet,例如:

return Json(list, JsonRequestBehavior.AllowGet);

这是您的示例代码中的样子(请注意,这也会将您的 ints 更改为 strings,否则您会收到另一个错误)。

public JsonResult List(int number) 
  var list = new Dictionary<string, string>();

  list.Add("1", "one");
  list.Add("2", "two");
  list.Add("3", "three");

  var q = (from h in list
           where h.Key == number.ToString()
           select new 
             key = h.Key,
             value = h.Value
           );

  return Json(list, JsonRequestBehavior.AllowGet);

【讨论】:

另外提到你可以覆盖 jQuery 中的 JSON 行为来使用 POST。 对,特别是如果您要返回任何可能被视为敏感的内容,请使用[HttpPost] 装饰您的控制器方法并改用jQuery $.post() 函数(请参阅api.jquery.com/jQuery.post) 或者在你的ajax函数中指定type: "POST"【参考方案2】:

虽然 JustinStolle 的回答解决了您的问题,但我会注意框架提供的错误。除非您有充分的理由希望使用 GET 方法发送数据,否则您应该使用 POST 方法发送数据。

问题是,当您使用 GET 方法时,您的参数会添加到您的请求 url,而不是添加到请求的标头/正文中。这似乎是一个微小的差异,但错误暗示了为什么它很重要。发送方和接收方之间的代理服务器和其他潜在服务器倾向于记录请求 url,并且经常忽略请求的标头和/或正文。此信息通常也被视为不重要/秘密,因此默认情况下,url 中公开的任何数据都不太安全。

最好的做法是使用POST 方法发送您的数据,以便将您的数据添加到正文而不是url。幸运的是,这很容易改变,尤其是因为您使用的是 jquery。您可以使用 $.post 包装器或将 type: "POST" 添加到您的参数中:

$.ajax(
            url: "/Home/List",
            type: "POST",
            dataType: "json",
            data:  number: '1' ,
            success: function (data)  alert(data) ,
            error: function (xhr)  alert(xhr.status) 
        );

【讨论】:

以上是关于ASP.NET MVC JsonResult 返回 500的主要内容,如果未能解决你的问题,请参考以下文章

加载 ASP.Net MVC JSONResult jQuery DataTables

ASP.Net MVC:如何基于原始Json数据创建JsonResult

asp.net mvc自定义JsonResult类来防止MaxJsonLength超过限制

csharp C#:JsonResult替代ASP.NET MVC。

ASP.NET MVC前台解析JSON时,类型错误

ASP.NET MVC 下自定义 JsonResult,使用 Json.NET 序列化 JSON