Xamarin HttpClient Request-Timeout

Xamarin HttpClient Request-Timeout

在 Xamarin.Forms 应用程序中,我尝试连接到 Exosites api(这不是项目的一部分,因此我无法更改 SignalR 等)。

对于 "normal" 请求,一切正常。

api 也支持长轮询请求 - 在 manual 中表示客户端必须将 header "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 (ms)。如果我在对 Exosites 上的另一个端点的请求上设置超时,而该端点不检查它,它就可以正常工作。发送没有 "Request-Timeout" header 的完全相同的请求也可以正常工作。

有没有人有在 Xamarin 中使用 HttpClient 进行长轮询调用的经验?

非常感谢!

楚格

实际上,它比那容易得多。

using (var client = new HttpClient())
{
    client.Timeout = TimeSpan.FromSeconds(_timeoutSeconds);
}

PS:务必始终将 new HttpClient() 包裹在 using 块中。

我终于明白"Request-Timeout"不是标准的header。这是一个自定义 header Exosite 用来区分长轮询和正常调用的方法。

我遇到的问题与此无关。我使用 fiddler 捕获了对使用邮递员制作的 Exosite api 的长轮询。在用 "Request-Timeout" 定义的时间过去后返回的响应和 Fiddler 显示以下协议违规:

Content-Length mismatch: Response Header indicated 27 bytes, but server sent 0 bytes.

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

Indicates if HttpClient operations should be considered completed either as soon as a response is available, or after reading the entire response message including the content.

使用 HttpCompletionOption.ResponseHeadersRead 调用在读取响应之前返回,这对我来说就像一个魅力。