System.ObjectDisposedException: невозможно получить доступ к удаленному объекту. Имя объекта: «System.Net.Sockets.NetworkStream». С HttpClient - PullRequest
0 голосов
/ 02 октября 2019

Мне нужно отправить параллельно несколько запросов Post. Для этого я собираюсь использовать следующий код:

        try
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"key={customer.FCMServerKey}");

                var obj = new
                {
                    to = customer.FcmRegistrationId,
                    notification = new
                    {
                        title = push.PushTitle,
                        body = push.PushBody,
                    }
                };

                string json = JsonConvert.SerializeObject(obj);
                var data = new StringContent(json, Encoding.UTF8, "application/json");

                responseTasks.Add( client.PostAsync("https://fcm.googleapis.com/fcm/send", data));
                pushes.Add(push);
            }
        }
        catch (HttpRequestException ex)
        {

            Console.WriteLine("\nException with pushing!");
            Console.WriteLine("Message :{0} ", ex.Message);
        }

    }

    var responses = await Task.WhenAll(responseTasks);

    var count = 0;
    foreach (var response in responses)
    {
        var responseBody = await response.Content.ReadAsStringAsync();

        pushes[count].FCMResponse = responseBody;
        pushes[count].Sent = response.IsSuccessStatusCode;

        Console.WriteLine("FCM response:");
        Console.WriteLine(pushes[count].FCMResponse);

        count++;
    }

    await _pushRepository.SaveAsync(pushes);
}

Как вы можете видеть, я поместил объекты моей задачи в responseTasks. Затем я собираюсь отправить все запросы с помощью этой строки:

var responses = await Task.WhenAll(responseTasks);

I, как результат, у меня есть это исключение:

Необработанное исключение: System.Threading.Tasks.TaskCanceledException: операция была отменена. ---> System.ObjectDisposedException: невозможно получить доступ к удаленному объекту. Имя объекта: «System.Net.Sockets.NetworkStream». в System.Net.Sockets.NetworkStream.WriteAsync (буфер Byte [], смещение Int32, размер Int32, CancellationToken cancellationToken) в System.IO.Stream.WriteAsync (буфер Byte [], смещение Int32, число Int32) в System.Net. Security.SslState.StartSendBlob (Byte [] входящий, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.ForceAuthentication (логический буфер receiveFirst, Byte [], AsyncProtocolRequest asyncRequestSecurity.ProjectSecurity.Secure.Security.Sec. LazyAsyncResult lazyResult) при System.Net.Security.SslStream.BeginAuthenticateAsClient (SslClientAuthenticationOptions sslClientAuthenticationOptions, CancellationToken CancellationToken, AsyncCallback AsyncCallback, Object asyncState) при System.Net.Security.SslStream. <> c.b__47_0 (SslClientAuthenticationOptions arg1, CancellationToken арг2, AsyncCallback обратного вызова,Состояние объекта) в System.Threading.Tasks.TaskFactory 1.FromAsyncImpl[TArg1,TArg2](Func 5 beginMethod, Func 2 endFunction, Action 1 endAction, TArg1 arg1, TArg2 arg2, Состояние объекта, TaskCreationOptионы creationOptions) в System.Threading.Tasks.TaskFactory.FromAsync [TArg1, TArg2] (Func 5 beginMethod, Action 1 endMethod, TArg1 arg1, TArg2 arg2, состояние объекта, TaskCreationOptions creationOptions) в System.Threading.Tasks.Arg.Tasks.Task.Fas, TArg2] (Func 5 beginMethod, Action 1 endMethod, TArg1 arg1, TArg2 arg2, состояние объекта) в System.Net.Security.SslStream.AuthenticateAsClientAsync (SslClientAuthenticationOptions sslClientAuthenticationOptions, Атрибут узла Connect.SentConnection.Exjects.Connect.Conneccess.HecConject.Hecen.Connect.Exject.Secen.Conne.Conne.Conne.Conne.Conne.Conne.Conne.Conne.Conne.SecConnect.SecConnect.Confile.Confile.Confile.Connect.Connect.Connect ).Cф_синтез.оклон.узел_связи.цена. , SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений --- в System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore (Поток потока, SslClientAuthenticationOptions sslOptions, 1010 * * * * * * * * * * * * * * * * * * * * 105 * * * * * * * * * *) *6 * * * * * *6не так?

1 Ответ

3 голосов
/ 02 октября 2019

проверьте, как работает использование: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

В вашем коде client будет удалено, как только закончится блок using, но у вас все еще есть отложенные задачи в списке responseTasks, которые попытаются выполнитьдоступ к нему. Вы должны получить результаты, находясь в client используя block.

...