我有一个使用 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].GetResultCore (System.Boolean waitCompletionNotification) <0x10490a080 + 0x00097> 在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
:0 在 System.Threading.Tasks.Task 1[TResult] sendTask, System.Net.Http.HttpRequestMessage 请求, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) <0x1073d7a80 + 0x005f4> 在 <992c809de76342e0b46dc1b912da2d7b#0821ad7e7f240e13aa5b8f0971c62be4>:0 <---\n1[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
我尝试了以下方法来解决这个错误。
_client.Timeout = TimeSpan.FromMinutes(20);
NativeMessageHandler handler = new NativeMessageHandler()
{
Timeout = TimeSpan.FromMinutes(20)
};
HttpClient _client = new HttpClient(handler);
httpClient.DefaultRequestHeaders.Add("Connection", "Close");
或
httpClient.DefaultRequestHeaders.ConnectionClose = true;
或
httpClient.DefaultRequestHeaders.ConnectionClose = false;
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
httpClient.DefaultRequestHeaders.Add("Keep-Alive", "180000");
(ModernHttpClient:https://github.com/anaisbetts/ModernHttpClient)
(现代http客户端更新:https://github.com/alexrainman/ModernHttpClient)
然而,他们都没有工作。
我看到这个问题:https://github.com/anaisbetts/ModernHttpClient/issues/204
说服务器有问题。但我不明白我需要如何在服务器上进行设置来解决这个问题。
我该怎么做才能解决上传大文件时遇到的这个问题?