Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在恶劣的网络条件下处理文件HttpClient.PostAsync文件上载?_C#_Xamarin_Httpclient - Fatal编程技术网

C# 如何在恶劣的网络条件下处理文件HttpClient.PostAsync文件上载?

C# 如何在恶劣的网络条件下处理文件HttpClient.PostAsync文件上载?,c#,xamarin,httpclient,C#,Xamarin,Httpclient,我正在开发一个移动应用程序,它以将多张照片上传到web api为中心。我正在使用Xamarin.Forms和System.Net.Http.HttpClient来模拟糟糕的网络条件(延迟、丢包、无序数据包)。该应用程序最初是用钛合金编写的,对大多数用户来说运行良好,但一些在糟糕的移动网络上的用户经常出错。接下来,我们将移植到Xamarin,并尝试适应连接不良的用户 using (var httpClient = CreateClient()) { http

我正在开发一个移动应用程序,它以将多张照片上传到web api为中心。我正在使用Xamarin.Forms和System.Net.Http.HttpClient来模拟糟糕的网络条件(延迟、丢包、无序数据包)。该应用程序最初是用钛合金编写的,对大多数用户来说运行良好,但一些在糟糕的移动网络上的用户经常出错。接下来,我们将移植到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");
                }
            }
        }
然而,我发现,在正常条件下,一切都能正常工作;当使用“滞后、下降、无序”启用笨拙并尝试上载时,PostAsync()永远不会完成,最终会使用TaskCanceledException超时。奇怪的是,该文件最终出现在服务器上。。所以POST的数据显然通过了

我猜想,服务器响应中丢弃的数据包意味着HttpClient从未收到正确的响应,而是继续等待响应,直到超时

说到这里,我想知道是否有人对如何使这个过程尽可能防弹有任何想法。如果文件第一次通过,那么仅仅捕获超时并重试并不能很好地工作。有什么想法吗


此外,任何关于HttpClient如何处理丢失/无序数据包的信息,以便我更好地了解发生了什么,都将是非常好的。

不久前,我在HttpClient上碰到的一件事是对POST请求的特殊(读起来不常见)处理。 发送POST请求时,它首先将头(包括
ContentLenght
和special
Expect:100 continue
头)发送到服务器,但不发送正文。若请求可接受,则等待服务器以状态代码100响应。之后,它开始发送身体。 其他信息如下:

在我的例子中,问题是当请求太大而无法处理时,我所说的后端服务(Play framework)并没有很好地处理协议的这一部分。它没有返回任何错误。请求只是超时了。因此,使用
ServicePointManager.Expect100Continue=false
在向这位主人发送任何请求之前,我就解决了这个问题。至少现在它正在返回一些东西


如果这没有帮助的话,我可以推荐的最好的方法就是用wireshark或类似的工具来观察电线上发生的事情。如果你用这个笨拙的工具玩的很好。(顺便说一句,谢谢你的链接。我自己也在找类似的东西)

我做了一些额外的测试,发现了一些有趣的东西。启用笨拙(传入和传出)时,如果保持启用状态,则会出现最初描述的情况(文件成功上载,但PostAsync超时并抛出TaskCanceledException)。然而,如果我在几分钟后关闭笨拙,那么一切都会成功。这是否意味着来自web api服务器的响应会反复发送,直到确认收到为止?