Xamarin HttpClient请求超时

本文关键字:超时 请求 HttpClient Xamarin | 更新日期: 2023-09-27 18:29:26

在Xamarin.Forms应用程序中,我尝试连接到Exositesapi(它不是项目的一部分,所以我不能将其更改为SignalR左右)。

这一切都适用于"正常"请求。

api还支持长轮询请求——在手册中,它说客户端必须为请求设置标题"请求超时"。

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上为另一个端点的请求设置了超时,而该端点没有检查它,那么它可以正常工作。发送完全相同的请求而不使用"请求超时"标头也可以正常工作。

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

非常感谢!

tschuege

Xamarin HttpClient请求超时

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

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

PS:请务必始终将您的new HttpClient()封装在using块中。

我终于发现"请求超时"不是一个标准的头。这是Exosite用来区分长轮询和普通呼叫的自定义标头。

我遇到的问题与此无关。我用fiddler捕捉了一个使用poster制作的Exosite api的长轮询。在"请求超时"定义的时间通过后,返回响应,Fiddler显示以下协议违反:

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

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

指示是否应在响应可用时或在读取包括内容在内的整个响应消息后立即将HttpClient操作视为已完成。

使用HttpCompletionOption.ResponseHeadersRead,调用在读取响应之前返回,这在我的情况下就像一个魅力。