Xamarin HttpClient:TaskCancelledException

Posted

技术标签:

【中文标题】Xamarin HttpClient:TaskCancelledException【英文标题】:Xamarin HttpClient: TaskCancelledException 【发布时间】:2016-06-16 19:08:17 【问题描述】:

我使用 HttpClient 在本地服务器上发送 post 请求(使用 LAMP 或 MAMP 电源,都尝试了)但无法得到答案,总是得到“任务取消异常”,代码如下

try

    using (HttpClient client = new HttpClient())
    
        client.Timeout = new TimeSpan(0, 0, 10);
        var sendContent = new StringContent(serialized);

        using (HttpResponseMessage response = await client.PostAsync(url.ToString(), sendContent))
        
            if (response.StatusCode != HttpStatusCode.OK)
                return MakeError("Bad status: " + response.StatusCode.ToString());

            using (HttpContent content = response.Content)
            
                string str = await content.ReadAsStringAsync();
                if (str == null)
                    return MakeError("Got null answer");

                App.Log("Response: " + str);
                return str;
            
        
    

catch (Exception e)

    App.Log("There is something bad with request: " + serialized + " the error was " + e.Message + " url = " + url.ToString());

    return MakeError("Timed out");

网址是正确的,如果我尝试在 C# 控制台应用程序上执行此代码,我可以获得答案(但不能使用 Xamarin,androidios,在设备和模拟器上)。

我还尝试嗅探 HTTP 数据包,我看到答案是由我的本地服务器发送的,但 Xamarin 没有以正确的方式处理。但是,如果将 url 替换为域(例如 http://***.com),我可以得到答案。

遵循 HTTP 应答标头:

    连接→关闭(keep-alive 也不起作用) 内容长度 →951 内容类型→应用程序/json 日期 →2016 年 6 月 16 日星期四 18:11:40 GMT 服务器→Apache X-Powered-By →php/5.5.14

有什么建议吗?

【问题讨论】:

您使用的具体网址是什么?请记住,如果您运行的是 Android/iOS 模拟器/模拟器,它与您的本地 PC 具有单独的 IP,并且不能使用 localhost 与服务器通信。它也可能无法解析本地 URL。 【参考方案1】:

一个可能的问题是您的 8 秒超时。

来自HttpClient documentation:

默认值为 100,000 毫秒(100 秒)。

域名系统 (DNS) 查询最多可能需要 15 秒才能返回 或超时。如果您的请求包含需要 分辨率并且您将 Timeout 设置为小于 15 秒的值,它可能 在引发 WebException 之前需要 15 秒或更长时间以指示 您的请求超时。

因此,如果在您的呼叫中进行 DNS 查询,则至少需要 15 秒。删除超时,看看问题是否仍然存在。

【讨论】:

哇,我想知道,但这行得通!奇怪的是我的 url 不包含域,但仍然需要 IP 和 DNS。非常感谢。 @AlexBakanov 没问题。可能是没有使用 DNS,但无论如何请求只花费了超过 8 秒。很高兴我能帮上忙。【参考方案2】:

我有同样的问题。我添加了以下行,我能够得到响应。

httpClient.DefaultRequestHeaders.ConnectionClose = true;

试试吧。

【讨论】:

以上是关于Xamarin HttpClient:TaskCancelledException的主要内容,如果未能解决你的问题,请参考以下文章

C# Xamarin 没有收到来自 HttpClient 的响应

HttpClient 不可用共享库项目 Xamarin

Xamarin 中的 WebException,使用 HttpClient

Xamarin - 在 .Net 标准库中使用 httpClient

Xamarin.Forms 使用HttpClient上传文件

HttpClient 非常慢 - Xamarin Forms