【问题标题】:Xamarin HttpClient Request-TimeoutXamarin HttpClient 请求超时
【发布时间】:2016-01-06 21:41:42
【问题描述】:

在 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”标头的完全相同的请求也可以正常工作。

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

非常感谢!

楚格

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    其实比这简单很多。

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

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

    【讨论】:

    • 谢谢。据我了解,client.Timeout 有所不同- HttpClient 内部的。我看到它是一个在发送请求时启动的计时器,如果它在请求返回之前用完,则通知调用者。服务器确实参与其中。另一方面,标头“Request-Timeout”被发送到服务器。在 Exosites 的情况下,服务器不会立即响应,而是等到某些事情发生变化或时间用完。我使用 client.Timeout 进行了尝试,即使没有任何更改,也立即得到了答案 - 所以它不是长轮询。
    • 不是每次都配置HttpClient的好理由。这是很多人的常见错误stackoverflow.com/questions/15705092/…
    【解决方案2】:

    我终于发现“Request-Timeout”不是标准标头。这是 Exosite 用于区分长轮询和正常调用的自定义标头。

    我遇到的问题与此无关。我使用 fiddler 对使用 postman 制作的 Exosite api 进行了长时间的投票。在返回的响应通过“Request-Timeout”定义的时间后,Fiddler 显示以下协议违规:

    Content-Length 不匹配:响应头指示 27 个字节,但服务器发送了 0 个字节。

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

    表明 HttpClient 操作是否应在响应可用时被视为已完成,或者在读取包括内容在内的整个响应消息之后。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      相关资源
      最近更新 更多