【问题标题】:GET request doesn't work when returned List<> contains items返回 List<> 包含项目时 GET 请求不起作用
【发布时间】:2017-10-30 13:38:19
【问题描述】:

我在处理 .NET REST 应用程序时遇到了一个奇怪的问题。我可以很好地发出各种请求,但是这个长轮询 GET 中断请求只有在返回的 List 为空时才会成功。举例说明:

public async Task<List<Person>> UpdateRequest()
{
    try
    {
        await LongPolling(10000);
    }
    catch (TaskCanceledException)
    {
        Console.WriteLine("Long polling GET was cancelled.");
        var fooList = new List<Person>();
        fooList.Add(new Person("tim", "bar")); // <- adding this line breaks the request

        return fooList;
    }

    return null; //Timeout, aka nothing happened
}

.Add() 行不存在时,调用mysite.com/update(以及后续的长 GET 中断)返回

<ArrayOfPerson xmlns="http://schemas.datacontract.org/stuff" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

这是意料之中的,但是当List 包含项目时,我会立即得到“无法得到响应”。 Console.Writeline 被打印出来。我是否误解了 List 在 C# 中的工作方式?或者我的返回类型有问题Task&lt;List&lt;Person&gt;&gt;

编辑:尝试使用普通数组:Person[0] 是唯一有效的方法,更大的数组“无法得到响应”,无论其中是否有项目。

【问题讨论】:

  • 如果结果是一个集合,你永远不应该返回null。而是返回一个空列表。然后它不会破坏迭代器等return new List&lt;Person&gt;() 或创建静态EmptyPersonList
  • 与问题无关,但真实 :)
  • @Fildor 是的。如果长轮询没有被中断,则 GET 请求被保留并返回“超时”(在这种情况下为 null,会更改)。
  • @Fildor 是的,他的想法是在超时内收到项目并且可以给出完整响应时取消任务,否则操作超时并且不存在结果。代码不完整,所以不是很清楚。
  • 面团,好的。我要喝杯咖啡...

标签: c# asp.net rest long-polling


【解决方案1】:

显然罪魁祸首不是Task&lt;&gt;。非异步方法(以List&lt;Person&gt; 作为返回类型)有同样的问题。客户端根本不知道如何将自定义对象的非空列表映射到响应,事后看来这是可以理解的。

我最终在UpdateRequest() 方法中将List 显式映射到XML,导致Task&lt;XElement&gt; 成为新的返回类型。

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多