在Xamarin.Forms iOS项目中使用ModernHttpClient出现“The network connection was lost”错误如何解决?

问题描述 投票:0回答:0

我有一个使用 Xamarin Forms 开发的移动应用程序。我还有一个内部 Web 应用程序,它为我的移动应用程序请求托管 API 方法。

我想通过我的移动应用程序请求这些 API 方法。但是,由于我的 Web 应用程序是内部的,因此我需要通过隧道访问 Web 应用程序中的 API 方法。

为此,我应客户要求将 Airwatch SDK 集成到我的移动应用程序中。 (我只在我的 Xamarin.Forms 项目的 iOS 部分执行此操作。)当我查看 Airwatch SDK AppTunnel 文档时,我发现我需要在 AppTunnel 的所有 HttpClient 请求中使用 ModernHttpClient 并且我进行了这些更改。我目前正在使用 Airwatch SDK 的 AppTunnel 功能访问内部 API 方法。 (带有 Airwatch SDK 的 AppTunnel:https://developer.vmware.com/web/workspace-one/tutorials/Xamarin-iOS/App-Tunneling/Airwatch-SDK

我还有一个“Multipart/Form-Data POST”api 方法,用于在应用程序中上传文件。我已将其更改为也可以与 ModernHttpClient 一起使用。上传小文件也没有问题。但是,上传大文件时出现以下错误。

System.AggregateException:发生一个或多个错误。 (网络连接丢失。) ---> System.Net.WebException:网络连接丢失。 ---> Foundation.NSErrorException: Error Domain=NSURLErrorDomain Code=-1005 “网络连接丢失。” UserInfo={_kCFStreamErrorCodeKey=54, NSUnderlyingError=0x28370d980 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={_kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<1>, _NSURLTaskErrorreselation( “本地数据任务 .<1>” ), NSLocalizedDescription=网络连接丢失。, NSErrorFailingURLStringKey=https://base-url.com/api/v2/filesystem/upload, NSErrorFailingURLKey=https://base-url.com.com/api/v2/filesystem /上传,_kCFStreamErrorDomainKey=1} --- 内部异常堆栈跟踪结束 --- 在 ModernHttpClient.NativeMessageHandler.SendAsync(System.Net.Http.HttpRequestMessage 请求,System.Threading.CancellationToken cancellationToken)<0x1088d8130 + 0x01143> 在<67401bece23c4316a0cb1acd7b396157#0821ad7e7f240e13aa5b8f0971c62be4>:0 在 System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task

1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) <0x1073d7a80 + 0x005f4> in <992c809de76342e0b46dc1b912da2d7b#0821ad7e7f240e13aa5b8f0971c62be4>:0 \n   --- End of inner exception stack trace ---\n  at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) <0x10490f1a0 + 0x00048> in <aae03b95719e488f8a163bae4d2b5dcb#0821ad7e7f240e13aa5b8f0971c62be4>:0 \n  at System.Threading.Tasks.Task
1[TResult].GetResultCore (System.Boolean waitCompletionNotification) <0x10490a080 + 0x00097> 在 :0 在 System.Threading.Tasks.Task
1[TResult].get_Result () <0x104909fe0 + 0x00067> in <aae03b95719e488f8a163bae4d2b5dcb#0821ad7e7f240e13aa5b8f0971c62be4>:0 \n  at AppSDK.V2.Service.Uploader.SendStreamToServer (System.String fileName, System.IO.Stream stream, System.Collections.Specialized.NameValueCollection nvc) <0x107cd73b0 + 0x00633> in <d8bc2b7aa0fc423f94af434e3edd0df7#0821ad7e7f240e13aa5b8f0971c62be4>:0 \n---> (Inner Exception #0) System.Net.WebException: The network connection was lost. ---> Foundation.NSErrorException: Error Domain=NSURLErrorDomain Code=-1005 \"The network connection was lost.\" UserInfo={_kCFStreamErrorCodeKey=54, NSUnderlyingError=0x28370d980 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 \"(null)\" UserInfo={_kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <F5B801BE-A8A1-4EBC-89D2-EA1D79B4C72B>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(\n    \"LocalDataTask <F5B801BE-A8A1-4EBC-89D2-EA1D79B4C72B>.<1>\"\n), NSLocalizedDescription=The network connection was lost., NSErrorFailingURLStringKey=https://base-url.com.com/api/v2/filesystem/upload, NSErrorFailingURLKey=https://base-url.com.com/api/v2/filesystem/upload, _kCFStreamErrorDomainKey=1}\n   --- End of inner exception stack trace ---\n  at ModernHttpClient.NativeMessageHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) <0x1088d8130 + 0x01143> in <67401bece23c4316a0cb1acd7b396157#0821ad7e7f240e13aa5b8f0971c62be4>:0 \n  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task
1[TResult] sendTask, System.Net.Http.HttpRequestMessage 请求, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) <0x1073d7a80 + 0x005f4> 在 <992c809de76342e0b46dc1b912da2d7b#0821ad7e7f240e13aa5b8f0971c62be4>:0 <---\n

我尝试了以下方法来解决这个错误。

  1. 通过将大文件分成较小的部分来上传一个大文件(例如,尝试以 500 kb 的块上传一个 850 MB 的文件。在这种情况下,例如,上传了 60-70 MB 的文件,然后突然我得到上面的错误。)
  2. 我增加了 HttpClient 对象的超时时间。
_client.Timeout = TimeSpan.FromMinutes(20);
  1. 我增加了 ModernHttpClient 的超时时间。
NativeMessageHandler handler = new NativeMessageHandler() 
{ 
    Timeout = TimeSpan.FromMinutes(20) 
};
HttpClient _client = new HttpClient(handler);
  1. 我在 http 请求的标头中添加了“连接:关闭”。
httpClient.DefaultRequestHeaders.Add("Connection", "Close");

httpClient.DefaultRequestHeaders.ConnectionClose = true;

httpClient.DefaultRequestHeaders.ConnectionClose = false;
  1. 我在http请求的header中添加了“Connection: Keep-Aline”并增加了Keep-Alive超时时间(例如:“Keep-Alive: 180000”)
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
httpClient.DefaultRequestHeaders.Add("Keep-Alive", "180000");
  1. 我分别使用 modernHttpClient 和 modernhttpclient-updated 尝试了上述项目。

(ModernHttpClient:https://github.com/anaisbetts/ModernHttpClient

(现代http客户端更新:https://github.com/alexrainman/ModernHttpClient

然而,他们都没有工作。

我看到这个问题:https://github.com/anaisbetts/ModernHttpClient/issues/204

说服务器有问题。但我不明白我需要如何在服务器上进行设置来解决这个问题。

我该怎么做才能解决上传大文件时遇到的这个问题?

c# xamarin xamarin.forms xamarin.ios httpclient
© www.soinside.com 2019 - 2024. All rights reserved.