При использовании .NET MAUI на Android HTTP-запросы время от времени терпят неудачу (в большинстве случаев один и тот же вызов оказывается успешным), поэтому я не могу понять, почему.
Это происходит в различные конечные точки.
Это исключение:
Я просмотрел следующие сообщения и убедился, что операторы using размещены правильно, и считаю, что возвращаю DTO, как рекомендовано.
System.Net.Http.HttpRequestException Ошибка при копировании содержимого в поток
Запрос Web Api выдает «Ошибка при копировании содержимого в поток».
Я не уверен, что мне здесь не хватает, буду очень признателен за любую помощь/рекомендации!
При использовании .NET MAUI на Android HTTP-запросы время от времени терпят неудачу (в большинстве случаев один и тот же вызов оказывается успешным), поэтому я не могу понять, почему. Это происходит в различные конечные точки. Это исключение: [code]{"HttpRequestError":0, "Message":"net_http_content_stream_copy_error", "Data": null, "InnerException":{ "ClassName":"System.ObjectDisposedException", "Message":"ObjectDisposed_Generic", "Data":null, "InnerException":null, "HelpURL":null, "StackTraceString":" at Java.Interop.JniPeerMembers.AssertSelf(IJavaPeerable )\n at Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualInt32Method(String , IJavaPeerable , JniArgumentValue* )\n at Java.IO.InputStream.Read(Byte[] , Int32 , Int32 )\n at Android.Runtime.InputStreamInvoker.Read(Byte[] , Int32 , Int32 )\n at System.IO.Stream.c.b__38_0(Object )\n at System.Threading.Tasks.Task`1[[System.Int32, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].InnerInvoke()\n at System.Threading.Tasks.Task.c.b__281_0(Object obj)\n at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread , ExecutionContext , ContextCallback , Object )\n--- End of stack trace from previous location ---\n at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread , ExecutionContext , ContextCallback , Object )\n at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& , Thread )\n--- End of stack trace from previous location ---\n at System.IO.Stream.g__Core|27_0(Stream , Stream , Int32 , CancellationToken )\n at System.IO.BufferedStream.CopyToAsyncCore(Stream , Int32 , CancellationToken )\n at System.Net.Http.StreamToStreamCopy.g__DisposeSourceAsync|1_0(Task , Stream )\n at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task , MemoryStream )", "RemoteStackTraceString":null, "RemoteStackIndex":0, "ExceptionMethod":null, "HResult":-2146232798, "Source":"Java.Interop", "WatsonBuckets":null, "ObjectName":"Java.IO.InputStreamInvoker"}, "Source":"System.Net.Http","HResult":-2146232798,"StackTrace":" at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task , MemoryStream )\n at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage , HttpCompletionOption , CancellationTokenSource , Boolean , CancellationTokenSource , CancellationToken )\n at MDC_Room.Services.ApiService.d__5`1[[System.Collections.Generic.List`1[[MDC_Room.Model.DailyReport.ChildDailyReportListItemDto, MDC_Room, Version=6.8.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()"} [/code] Служба, выполняющая вызов API, является одноэлементной (хотя для получения экземпляра IHttpClientFactor она использует IServiceProvider): [code]builder.Services.AddSingleton();[/code] [code]public async Task GetRequestAync(string url) { try { if (Connectivity.NetworkAccess == NetworkAccess.Internet) { var httpClientFactory = _serviceProvider.GetRequiredService();
using var httpClient = httpClientFactory.CreateClient(AppConstants.HttpClient);
using var response = await httpClient.GetAsync(url);
if (response != null && response.IsSuccessStatusCode) { return JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } else await ErrorUtility.HandleErrorAsync(response, url); } else await SnackbarUtility.ShowErrorSnackbarAsync("No Internet Connection", "Ok", null); } catch (Exception ex) { ErrorUtility.LogError(ex, $"{nameof(ApiService)}.{nameof(GetRequestAync)}"); } return default; } [/code] Единственное, что нужно сделать, — это обработчик делегирования для вставки токена в ответ: [code] public class AuthenticationDelegatingHandler(IApiService _dataService) : DelegatingHandler { private const string TokenScheme = "Bearer";
private static TimeSpan GetRetryDelay(int retryAttempt) { return retryAttempt switch { 1 => TimeSpan.FromMilliseconds(50), 2 => TimeSpan.FromMilliseconds(100), _ => TimeSpan.FromMilliseconds(250), }; } [/code] Я просмотрел следующие сообщения и убедился, что операторы using размещены правильно, и считаю, что возвращаю DTO, как рекомендовано. System.Net.Http.HttpRequestException Ошибка при копировании содержимого в поток Запрос Web Api выдает «Ошибка при копировании содержимого в поток». Я не уверен, что мне здесь не хватает, буду очень признателен за любую помощь/рекомендации!
При использовании .NET MAUI на Android HTTP-запросы время от времени терпят неудачу (в большинстве случаев один и тот же вызов оказывается успешным), поэтому я не могу понять, почему.
Это происходит в различные конечные точки.
Это исключение:
{...
Моя проблема заключается в том, что я не могу извлечь объект, отправленный API, несмотря на то, что у меня есть схема объекта либо в API, либо в клиенте. Мой код:
public async Task Index()
{
HttpClient client = new HttpClient();
У меня есть универсальный класс с функцией, которая возвращает модель Pydantic, где одно из полей является универсальным типом. Далее следует фрагмент кода, определяющий два класса: общий GetValue и GetInt. Я не понимаю, почему поведение GetValue...