C# 如何在恶劣的网络条件下处理文件HttpClient.PostAsync文件上载?
我正在开发一个移动应用程序,它以将多张照片上传到web api为中心。我正在使用Xamarin.Forms和System.Net.Http.HttpClient来模拟糟糕的网络条件(延迟、丢包、无序数据包)。该应用程序最初是用钛合金编写的,对大多数用户来说运行良好,但一些在糟糕的移动网络上的用户经常出错。接下来,我们将移植到Xamarin,并尝试适应连接不良的用户C# 如何在恶劣的网络条件下处理文件HttpClient.PostAsync文件上载?,c#,xamarin,httpclient,C#,Xamarin,Httpclient,我正在开发一个移动应用程序,它以将多张照片上传到web api为中心。我正在使用Xamarin.Forms和System.Net.Http.HttpClient来模拟糟糕的网络条件(延迟、丢包、无序数据包)。该应用程序最初是用钛合金编写的,对大多数用户来说运行良好,但一些在糟糕的移动网络上的用户经常出错。接下来,我们将移植到Xamarin,并尝试适应连接不良的用户 using (var httpClient = CreateClient()) { http
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");
}
}
}
然而,我发现,在正常条件下,一切都能正常工作;当使用“滞后、下降、无序”启用笨拙并尝试上载时,PostAsync()永远不会完成,最终会使用TaskCanceledException超时。奇怪的是,该文件最终出现在服务器上。。所以POST的数据显然通过了
我猜想,服务器响应中丢弃的数据包意味着HttpClient从未收到正确的响应,而是继续等待响应,直到超时
说到这里,我想知道是否有人对如何使这个过程尽可能防弹有任何想法。如果文件第一次通过,那么仅仅捕获超时并重试并不能很好地工作。有什么想法吗
此外,任何关于HttpClient如何处理丢失/无序数据包的信息,以便我更好地了解发生了什么,都将是非常好的。不久前,我在HttpClient上碰到的一件事是对POST请求的特殊(读起来不常见)处理。 发送POST请求时,它首先将头(包括
ContentLenght
和specialExpect:100 continue
头)发送到服务器,但不发送正文。若请求可接受,则等待服务器以状态代码100响应。之后,它开始发送身体。
其他信息如下:
在我的例子中,问题是当请求太大而无法处理时,我所说的后端服务(Play framework)并没有很好地处理协议的这一部分。它没有返回任何错误。请求只是超时了。因此,使用
ServicePointManager.Expect100Continue=false代码>
在向这位主人发送任何请求之前,我就解决了这个问题。至少现在它正在返回一些东西
如果这没有帮助的话,我可以推荐的最好的方法就是用wireshark或类似的工具来观察电线上发生的事情。如果你用这个笨拙的工具玩的很好。(顺便说一句,谢谢你的链接。我自己也在找类似的东西)我做了一些额外的测试,发现了一些有趣的东西。启用笨拙(传入和传出)时,如果保持启用状态,则会出现最初描述的情况(文件成功上载,但PostAsync超时并抛出TaskCanceledException)。然而,如果我在几分钟后关闭笨拙,那么一切都会成功。这是否意味着来自web api服务器的响应会反复发送,直到确认收到为止?