使用asp.net核心

时间:2017-08-12 22:23:48

标签: json asp.net-web-api asp.net-core

我有一个web api,它返回一个json对象供我在我的网站上使用。问题是:

[{"安装":1,"日期":" 03/01/2016""量":&#34 ; 27.28""状态":" \" 01BI000657 \""},{"安装":2,& #34;日期":" 04/01/2016""量":" 49.25""状态":& #34; \" 01BI000699 \""},{"安装":3,"日期":" 05/01/2016& #34;"量":" 56.31""状态":" \" 01BI000745 \"&#34 ;},{"安装&#34:4,"日期":" 06/01/2016""量":" 53.43""状态":" \" 01BI000811 \""},{"安装":5,&# 34;日期":" 07/01/2016""量":" 60.52""状态":&# 34; \" 01EI279932 \""},{"安装":6,"日期":" 08/01/2016&# 34;,"量":" 57.95""状态":" \" 01BI000934 \"" },{"安装":7,"日期":" 09/01/2016""量":" 60.24 #&34;,"状态":" \" 01BI 001015 \""},{"安装":8,"日期":&#34 10/01/2016""量":" 67.36""状态":" \" 01EI298127 \""},{"分期付款":9,"日期":&#34 11/01/2016""量":" 65.30"&# 34;状态":" \" 01BI001185 \""},{"安装":10,"日期":& #34; 12/01/2016""量":" 72.44""状态":" \" 01BI001277 \""},{"安装":11,"日期":" 01/01/2017""量& #34;:" 70.75""状态":" \" 01BI001380 \""},{"安装& #34;:12,"日期":" 02/01/2017""量":" 73.55"&#34 ;状态":" \" 01BI001486 \""},{"安装":13,"日期":&# 34; 03/01/2017""量":" 89.28""状态":" \" 01BI001567 \ ""},{"安装":14,"日期":" 04/01/2017""量&# 34;:" 80.00""&状态#34;:" \" 01BI001691 \""},{"安装":15,"日期":" 5月1日/ 2017""量":" 87.23""状态":" \" 01BI001822 \&# 34;"},{"安装":16,"日期":" 06/01/2017""量" :" 86.63""状态":" \" 01BI002011 \""},{"安装" :17,"日期":" 07/01/2017""量":" 93.89""状态&# 34;:" \" 01BI002172 \""},{"安装":18,"日期":" 08 /01/2017","amount":"93.78","status":"\"01BI002369\" ;"},{"安装":19,"日期":" 09/01/2017""量&#34 ;: " 97.49""状态":" \" \""},{"安装":20 "日期":&#34 10/01/2017""量":" 104.81""状态" :" \" \""},{"安装":21,"日期":&#34 11/01 / 2017""量":" 105.50"" STA土族":" \" \""},{"安装":22,"日期":" 12月1日/ 2017""量":" 112.87""状态":" \" \&#34 ;"},{"安装":23,"日期":" 01/01/2018""量&#34 ;: " 114.15""状态":" \" \""},{"安装":24 "日期":" 02/01/2018""量":" 118.67""状态" :" \" \""},{"安装":25,"日期":" 03/01 / 2018""量":" 131.57""状态":" \" \"&#34 ;},{"插件

你可以看到它被截断,它的权重为20kb,字符串长度是2033,所以我想知道是否有办法以某种方式增加响应的最大大小。我在web.config中尝试了MaxJsonLength,但是它没有用,可能是因为.net核心方面所以我有点迷失,为什么它会被截断。

6 个答案:

答案 0 :(得分:16)

我不知道为什么json响应会在某些时候被截断,但在我的情况下(ASP.NET Core 2.0)我不得不告诉Newtonsoft.Json忽略引用循环,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );
}

答案 1 :(得分:1)

发生这种情况的一个原因是在将对象序列化为JSON时发生错误。例如,数据中不存在标记为必填字段的字段可能会导致这种情况。输出只会停止,在这种情况下不会报告异常。

返回之前,请检查是否可以使用JSonConvert.SerializeObject()序列化json对象并解决所有问题。

答案 2 :(得分:0)

对于在使用空间类型时看到此消息后可能会在此处结束的任何人。 。 。

@IngoB的答案使问题消失了,但是(连同@FailedUnitTest的代码气味评论成真),我没想到我的简单{{{ 3}}。将ReferenceLoopHandling设置为Serialize并进行调试使我能够查看发生了什么的详细信息,最终我得到了Point

简介:

  1. 安装here
  2. 在ConfigureServices()中投掷类似内容:

    services.AddMvc(options =>
        {
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
        })
        .AddJsonOptions(options =>
        {
            foreach (var converter in GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
            {
                options.SerializerSettings.Converters.Add(converter);
            }
        });
    

答案 3 :(得分:0)

我知道这有点晚了,其他人可能已经回答了,但是我通过使用读者序列化sql查询并返回立即转换为JSON的对象而不将查询作为JSON返回的方式来解决开始。

答案 4 :(得分:0)

2033年的截断使我认为您只是在获取SQL Server返回的第一部分。 You need to concatenate all the results together,例如:

var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
    jsonResult.Append("[]");
}
else
{
    while (reader.Read())
    {
        jsonResult.Append(reader.GetValue(0).ToString());
    }
}

答案 5 :(得分:0)

我的场景是

  1. .NET Core 3.1,
  2. 用于序列化的 Newtonsoft JSON,以及
  3. 用于更改响应正文(响应包装)的自定义中间件。

JSON response breaks in ASP.NET Core 3.1 Web API with custom response wrapper 中描述的解决方案对我有用。

另外,https://github.com/dotnet/core/issues/1240 有一些有用的讨论。