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
调用在读取响应之前返回,这对我来说就像一个魅力。
在 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
调用在读取响应之前返回,这对我来说就像一个魅力。