在Xamarin.Forms应用程序中,我尝试连接到Exosites 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(ms)),我也没有得到任何答案。如果我对Exosites上另一个端点的请求设置超时,而该端点没有检查它,它可以正常工作。在没有“Request-Timeout”标头的情况下发送完全相同的请求也可以正常工作。
是否有人使用HttpClient在Xamarin中进行长轮询调用?
非常感谢!
tschuege
答案 0 :(得分:4)
实际上,它比那更容易。
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(_timeoutSeconds);
}
PS:请务必始终将new HttpClient()
包裹在using
块中。
答案 1 :(得分:2)
我终于发现“Request-Timeout”不是标准标题。这是一个自定义标题,Exosite用于区分长轮询和普通调用。
我遇到的问题与此无关。我使用小提琴手来捕捉使用邮递员制作的Exosite api的长期民意调查。在返回的响应传递“Request-Timeout”定义的时间之后,Fiddler显示以下协议违规:
内容长度不匹配:响应标头指示27个字节,但服务器发送0个字节。
所以问题是HttpClient无法处理响应。幸运的是,SendAsync
有一个重载接受HttpCompletionOption
类型的附加参数,该参数在msdn上有以下描述:
指示是否应在响应可用时或在读取包含内容的整个响应消息后立即认为HttpClient操作已完成。
使用HttpCompletionOption.ResponseHeadersRead
调用会在读取响应之前返回,这在我的案例中就像魅力一样。