【发布时间】: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<List<Person>>?
编辑:尝试使用普通数组:Person[0] 是唯一有效的方法,更大的数组“无法得到响应”,无论其中是否有项目。
【问题讨论】:
-
如果结果是一个集合,你永远不应该返回
null。而是返回一个空列表。然后它不会破坏迭代器等return new List<Person>()或创建静态EmptyPersonList -
与问题无关,但真实 :)
-
@Fildor 是的。如果长轮询没有被中断,则 GET 请求被保留并返回“超时”(在这种情况下为 null,会更改)。
-
@Fildor 是的,他的想法是在超时内收到项目并且可以给出完整响应时取消任务,否则操作超时并且不存在结果。代码不完整,所以不是很清楚。
-
面团,好的。我要喝杯咖啡...
标签: c# asp.net rest long-polling