2

我正在使用 MVC 3 并且有一个操作返回一个带有 187 个名称值对(作为 a List<OrientationData>)的 JsonResult,但通常从 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
4

2 回答 2

1

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

<configuration> 
    <system.web.extensions>
        <scripting>
            <webServices>
                <jsonSerialization maxJsonLength="50000000"/>
            </webServices>
        </scripting>
    </system.web.extensions>
</configuration> 
于 2013-03-05T15:02:21.040 回答
0

我无法弄清楚这个问题的解决方案,所以......

我使用 webHttpBinding 添加了 WCF 服务,如WCF 的答案所示:maxStringContentLength 始终设置为 8192我在服务类上设置了以下属性:

[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 也可以通过David Murdoch在另一篇文章中提到的这个答案来解决它。

于 2013-03-05T21:38:08.793 回答