Ant*_*yan 6 c# httpclient xamarin
我正在开发一个以将多张照片上传到网络API为中心的移动应用.我正在使用Xamarin.Forms和System.Net.Http.HttpClient,以及Clumsy来模拟糟糕的网络状况(滞后,丢包,无序数据包).该应用程序最初是用Titanium编写的,并且对大多数用户来说都很好,但是一些移动网络不佳的用户却经常出错.展望未来,我们正在移植到Xamarin并尝试适应连接不良的用户.
using (var httpClient = CreateClient())
{
httpClient.Timeout = TimeSpan.FromMinutes(5);
using (var formData = new MultipartFormDataContent())
{
// add required fields via formData.Add() ...
var httpContent = new ByteArrayContent(imageData);
formData.Add(httpContent, "file", Guid.NewGuid() + ".jpg");
try
{
var response = await httpClient.PostAsync("fileupload", formData).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
responseObject = await ResponseMessageToResponseModel(response).ConfigureAwait(false);
}
}
catch (HttpRequestException ex)
{
Debug.WriteLine("HttpRequestException");
}
catch (TaskCanceledException ex)
{
Debug.WriteLine("TaskCanceledException");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的是,一切都在正常条件下按预期工作; 当使用"滞后,丢弃,无序"启用Clumsy并尝试上载时,PostAsync()永远不会完成,并最终超时与TaskCanceledException.奇怪的是文件最终在服务器上..所以POST数据显然已经通过了.
我猜测从服务器响应中丢弃的数据包意味着HttpClient从未收到正确的响应,并继续等待一个直到它超时.
为了达到这一点,我想知道是否有人对如何使这个过程尽可能防弹有任何想法.如果文件第一次完成,只是捕获超时并再次尝试不能很好地工作.有什么想法吗?
此外,有关HttpClient如何处理丢弃/无序数据包的任何信息,以便我可以更好地了解正在发生的事情也会很棒.
小智 1
不久前我对 HttpClient 的一件事感到很困惑,那就是对 POST 请求的特殊(读起来不常见)处理。发送 POST 请求时,它首先将标头(包括ContentLenght特殊Expect: 100-continue标头)发送到服务器,但不发送正文。如果请求可接受,则等待服务器以状态代码 100 进行响应。之后它开始发送正文。此处的其他信息:
MSDN Page for ServicePointManager.Expect100Continue
MSDN 博客文章,其中包含一些详细信息
就我而言,问题在于,当请求大小太大而无法处理时,我正在与之交谈的后端服务(Play 框架)并没有很好地处理协议的这一部分。它没有返回任何错误。并且请求只是超时了。因此,在向该主机发送任何ServicePointManager.Expect100Continue = false;请求
之前禁用它
解决了我的问题。至少现在它正在返回一些东西。
如果这没有帮助,那么我可以推荐的最好的办法就是使用wireshark或类似的工具来查看线路上发生的情况。前提是它与您正在使用的这个 Clumsy 工具配合得很好。(顺便感谢您提供的链接。我自己也在寻找类似的东西)
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |