【问题标题】:ASP.NET web api returning only first object in each object in a arrayASP.NET web api 仅返回数组中每个对象中的第一个对象
【发布时间】:2020-03-30 17:38:36
【问题描述】:

startup.cs

   services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

以下是 web api 应用程序在部署到生产环境时返回的示例响应 json。在本地主机中,我正在获取“lastHourData”、“lastHourBeforeData”的数据,但不是在生产中。

    [{
        "currentData": {
            "id": "213123123esdwq23d",
             "payload": [
                {
                    "key": "sdfsdf",
                    "value": "T"
                }
            ]
        },
        "lastHourData": null,
        "lastHourBeforeData": null
    },
    {
        "currentData": {
            "id": "sdfdsf",
             "payload": [
                {
                    "key": "gf",
                    "value": "T"
                }
            ]
        },
        "lastHourData": null,
        "lastHourBeforeData": null
    }]

下面是方法,CurrentData、LastHourData 和 LastHourBeforeData 各有 250 个属性。

  public async Task<ComepletePanel> GetCompletePanelData(string id)
    {
        var queryRequest = RequstBuilder(id);
        var result = await queryRequest;
        var currentResult = result.Items.Select(Map2).FirstOrDefault();

        var queryRequest2 = getlastHourDataForMasterPanelBuilder(id);
        var result2 = await queryRequest2;
        var currentResult2 = result2.Items.Select(Map2).FirstOrDefault();

        var queryRequest3 = getlastBeforHourDataForMasterPanelBuilder(id);
        var result3 = await queryRequest3;
        var currentResult3 = result3.Items.Select(Map2).FirstOrDefault();

        var completData = new ComepletePanel
        {
            CurrentData = currentResult,
            LastHourData = currentResult2,
            LastHourBeforeData = currentResult3
        };

        return completData;
    }

下面是控制器方法

  public async Task<IEnumerable<ComepletePanel>> GetCustBoilersByCustId2(int id)
    {
        try
        {
            var recordData= await _context.table.ToListAsync();
            List<ComepletePanel> resultData= new List<ComepletePanel>();

            foreach (var b in recordData)
            {
                var CurrentResponse = await _getItem.GetCompletePanelData(b.id);
                resultData.Add(CurrentResponse);
            }

            return resultData;

        }
        catch (Exception ex)
        {
            _logger.LogError($"Failed to get all customers {ex}");
            return null;
        }
    }

【问题讨论】:

  • PROD 中有 LastHourData 和 LastHourBeforeData 的数据吗?
  • 同一张桌子。只需为它们添加不同的日期时间条件。在本地主机中它正在工作,而在生产中它不是。两种环境都使用相同的数据库和相同的表
  • 如果您获取的是数据的第一部分而不是其余部分,并且它在本地主机中工作,那么它与某种服务器设置/截止值有关。我将减少数据的大小和/或控制台写入/如果'null',看看是否有任何东西到达你的方法。

标签: c# asp.net-mvc entity-framework asp.net-core asp.net-web-api


【解决方案1】:

我认为你应该重构你的代码,让它看起来更漂亮,更能吸引你。它可能会解决您的问题。

您不必编写像getLastHourDataForMasterPanelBuilder(string id)getlastHourDataForMasterPanelBuilder(string id) 这样的方法,首先这些名称看起来太长,然后用一种方法总结您的算法,这样您只需将时间或逻辑数据或时间参数传递给它然后它根据您想要的时间获取数据。

public async Task<IEnumerable<CompletePanel>> GetCompleteData(string id params string[] args)
{
    List<QueryRequest> requests = new List<QueryRequest>();

    foreach (string argument in args)
    {
        var queryRequest = RequestBuilder(id);
        var result = await queryRequest;
        var knownResult = result.Items.Select(Map2).FirstOrDefault();
        requests.Add(knownResult);
    }

    return requests;
}

然后在您的控制器中,您只需将 id 和时间参数或逻辑参数作为字符串传递给方法,而不是执行循环。

【讨论】:

    【解决方案2】:

    您可能需要序列化您的对象。请参阅此内容以供参考:https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to

    【讨论】:

    • 好像你已经配置了序列化选项,但是你仍然需要调用序列化器来序列化你的对象,就像这样 return JsonSerializer.Serialize(completData);
    • 这是正确的 JsonSerializer.Serialize(completData); ? JsonSerializer 没有名为 Serialize 的扩展方法
    • 你的 using 语句中有这些吗?使用 System.Text.Json;使用 System.Text.Json.Serialization;
    • 好的,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2021-06-06
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多