json结果有时会被截断

本文关键字:结果 json | 更新日期: 2023-09-27 18:02:14

我使用MVC 3,并有一个动作,返回一个JsonResult与187名值对(作为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调用的结果有时被切断,看起来实际上在两个不同的地方被切断。可能的原因是什么?

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

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

json结果有时会被截断

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

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

我想不出这个问题的解决办法,所以……

我使用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在另一篇文章中提到的。