【问题标题】:JsonResult getting truncated SOME of the timeJsonResult 有时会被截断
【发布时间】:2013-03-05 14:09:26
【问题描述】:

我正在使用 MVC 3 并且有一个操作返回一个具有 187 个名称值对的 JsonResult(作为 List<OrientationData>),但通常从 ajax 调用接收到的数据被截断并且无法解析。

这总是通过 JsonResult 返回相同的 187 个项目,所以如果是长度问题,我认为它每次都会失败。操作如下:

[HttpPost]
    public JsonResult GetAllMetrics()
    {
        var metrics = metric.GetAllMetrics();
        return Json(metrics);
    }

这是 jQuery ajax 调用:

$.ajax({
            url: urlGetAllMetrics,
            type: 'POST',
            data: jsonData,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (ajaxData) {
                if (ajaxData && ajaxData.length > 0) {
                    //populate data here
                }
            },
            error: function (msg) {
                alert(msg);
            }
        });

返回给 ajax 调用的结果有时会被截断,实际上似乎在 2 个不同的地方截断。这可能是什么原因?

我还想指出,当我使用 Fiddler 捕获流量时,它每次都能正常工作而不会截断返回的数据(我还不知道为什么)。当我不使用 Fiddler 时,由于无法将字符串解析为 json,我经常在 ajax 中收到错误。数据是具有值和文本字符串属性的数组。返回的文本只是截断:

...,{"Value":"h12","Text":"h12 name goes here"},{"Val

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 jquery


    【解决方案1】:

    由于maxJsonLength 属性的默认值 (102400 - 100kb),它将被截断。尝试在您的 web.config 中更改它:

    <configuration> 
        <system.web.extensions>
            <scripting>
                <webServices>
                    <jsonSerialization maxJsonLength="50000000"/>
                </webServices>
            </scripting>
        </system.web.extensions>
    </configuration> 
    

    【讨论】:

    • 感谢您的建议,但这对我不起作用。文本仍然被切断。由于它在某些时候确实有效,我认为这不是长度问题。不过,我敢肯定发生了奇怪的事情。
    • 是吗?然后我敢打赌,这是在内部使用的JavaScriptSerializer 上设置的限制。尝试在此答案中实现代码stackoverflow.com/a/7207539/1039608
    【解决方案2】:

    我想不出这个问题的解决方案,所以...

    WCF: maxStringContentLength always set to 8192 的答案所示,我使用 webHttpBinding 在 WCF 服务中添加了我在服务类上设置了以下属性:

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    

    并确保将 DataContract 和 DataMember 属性添加到底层类:

    [DataContract]
    public class OrientationData
    {
        [DataMember]
        public string Value { get; set; }
        [DataMember]
        public string Text { get; set; }
    }
    

    我还将方法(现在在界面上带有 OperationContract)切换为:

    public List<OrientationData> GetAllMetrics()
        {
            var metrics = metric.GetAllMetrics();
            return metrics;
        }
    

    我希望我有一个更好的答案,但如果其他人遇到这个问题,这是解决它的一种方法。当然,我敢打赌切换到 MVC 4 也可以通过 this answer 修复它,正如 David Murdoch 在另一篇文章中提到的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2012-02-04
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多