【问题标题】:Web API - The length of the string exceeds the value set on the maxJsonLength propertyWeb API - 字符串长度超过 maxJsonLength 属性设置的值
【发布时间】:2016-02-11 06:00:26
【问题描述】:

我正在尝试返回一个大集合 o json(大约 2MB),但 web api 返回错误:

使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了 maxJsonLength 属性上设置的值”。我尝试在 web.config 中配置 maxJsonLength 属性,但没有成功。

我在 stackoverflow 中看到了另一个 answers,但都与常规 .NET MVC 控制器相关,而不是 ApiController。

是否可以绕过内部 JavaScriptSerializer maxJsonLenght 或通过执行一些自定义 JsonSerializerType 格式?

【问题讨论】:

  • 嗨@Coastpear 你使用的是什么版本的webapi?根据您使用的版本,覆盖会有所变化。
  • 我使用的是 5.1.0.0 版

标签: json asp.net-web-api


【解决方案1】:

根据 JSON 有效负载的大小,您可能需要流式传输响应。见this blog post。简而言之,这篇博文可以总结为以下代码:

[HttpGet]
public HttpResponseMessage PushStreamContent()
{
    var response = Request.CreateResponse();

    response.Content = 
    new PushStreamContent((stream, content, context) =>
    {
        foreach (var staffMember in _staffMembers)
        {
            var serializer = new JsonSerializer();
            using (var writer = new StreamWriter(stream))
            {
                serializer.Serialize(writer, staffMember);
                stream.Flush();
            }
        }
    });

    return response;
}

【讨论】:

  • 它没有解决我的问题,但引导我找到可能的解决方案,使用 StringContent 代替我可以将内容刷新到浏览器,唯一的问题是它不带有内容类型“应用程序/json ” 但带有“文本/明文”
【解决方案2】:

您是否尝试在 web.config 中设置 MaxJsonDeserializerMembers

<appSettings>
      <add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
    </appSettings>

【讨论】:

  • 是的,它不起作用,因为该配置用于 asp.net 运行时而不是用于内部 javascriptSerializer 使用。此“内部 javascriptSerializer”不会在 web.config 中查找任何配置。不过还是谢谢。 :)
【解决方案3】:

感谢@BMac 的帮助,您引导我找到了一个可行的解决方案。

[HttpGet]
//ResponseType it's for ApiDescription successfully generates the helper page with the right type since i'm returning a plain/text content
[ResponseType(typeof(YourType))]
public async Task<HttpResponseMessage> GetLargeJsonDataWithWebAPI()
{
    String url = "someUrl";
    String jsonData = EnvironmentUrlHelper.GetJsonResourseAsync<YourType>(url);


    var response = Request.CreateResponse();
    response.Content = new StringContent(JsonConvert.SerializeObject(rsp));

    return response;
}

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2018-04-25
    • 2017-08-31
    • 2015-03-27
    • 2013-05-26
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多