Xamarin HttpClient 请求超时

4
在Xamarin.Forms应用程序中,我尝试连接到Exosites API(该API不是项目的一部分,因此我无法更改它,因此不能使用SignalR等)。对于“正常”请求,一切都运行良好。该API还支持长轮询请求-在manual中指出客户端必须将标题“Request-Timeout”设置为请求。
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Request-Timeout", "10000");
var response = await client.SendAsync(request);

但是,这样做我没有得到任何回答,即使我将超时设置为非常小的值,如1(毫秒)。如果在Exosites上对另一个端点的请求设置超时并且不进行检查,则可以正常工作。发送完全相同的请求而不使用“Request-Timeout”标头也可以正常工作。
有没有人在使用HttpClient进行Xamarin中的长轮询调用方面有经验?
非常感谢!
tschuege
2个回答

8
实际上,这比那要简单得多。
using (var client = new HttpClient())
{
    client.Timeout = TimeSpan.FromSeconds(_timeoutSeconds);
}

PS:一定要将new HttpClient()包装在using块中。


谢谢。据我所知,client.Timeout 是不同的东西 - 是 HttpClient 内部的东西。我看到它是一个计时器,在发送请求时启动,如果在请求返回之前计时器超时,则调用方会收到通知。服务器并不参与其中。另一方面,头部 "Request-Timeout" 发送到服务器。在 Exosites 的情况下,服务器不会立即回答,并等待直到有变化或时间耗尽。我尝试使用 client.Timeout,即使没有任何更改,也立即得到了答案 - 所以这不是长轮询。 - tschuege
4
每次都处理 HttpClient 并不是一个好的理由。许多人都会犯这个常见的错误。https://dev59.com/WGUo5IYBdhLWcg3w3ymi - nick shp

2

我终于明白了,“Request-Timeout”不是一个标准的头部信息,而是Exosite用来区分长轮询和普通调用的自定义头部信息。

我遇到的问题与此无关。我使用fiddler捕获了使用postman进行的对Exosite api的长轮询请求。在“Request-Timeout”定义的时间过后,响应返回并且Fiddler显示以下协议违规:

内容长度不匹配:响应头指示27字节,但服务器发送了0字节。

所以问题是HttpClient无法处理响应。幸运的是,SendAsync有一个重载,接受一个额外的参数类型为HttpCompletionOption,在msdn上有以下描述:

指示HttpClient操作是否应该在可用响应后立即完成,或在读取整个响应消息(包括内容)后完成。

使用HttpCompletionOption.ResponseHeadersRead,调用会在读取响应之前返回,在我的情况下非常有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接