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,android 和 ios,在设备和模拟器上)。
我还尝试嗅探 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 的响应
Xamarin 中的 WebException,使用 HttpClient
Xamarin - 在 .Net 标准库中使用 httpClient