Я получил сообщение об ошибке «System.Net.Http.WinHttpException: операция приурочена» после перехода на .NET Core 2.2 - PullRequest
1 голос
/ 30 июня 2019

Я перенастроил свой API на .NET Core 2.2 и в моем приложении вызывает другую службу wsdl (WCF).При вызове этой службы я получаю сообщение об ошибке:

System.Net.Http.WinHttpException: операция по времени

Что-то не так в способе миграции?Он отлично работает в моем предыдущем решении, работающем с .net 4.5

Вот полное внутреннее текстовое сообщение.

InnerException: System.Net.Http.HttpRequestException: ошибка произошла во времяотправка запроса.

System.Net.Http.WinHttpException: истекло время ожидания операции

в System.Threading.Tasks.RendezvousAwaitable``1.GetResult ()
в System.Net.Http.WinHttpHandler.StartRequest (состояние WinHttpRequestState)
--- Конец трассировки стека внутренних исключений --->

в System.ServiceModel.Channels.ServiceModelHttpMessageHandler.SendAsync (запрос HttpRequestMessage *, системный запрос CancellationToken.Net.Http.HttpClient.FinishSendAsyncUnbuffered (задача 1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)<br> at System.ServiceModel.Channels.HttpChannelFactory 1.HttpClientRequestChannel.HttpClientChannelAsyncRequest.SendRequestAsync (сообщение-сообщение, TimeoutHelper timeoutHelper)

1 Ответ

1 голос
/ 30 июня 2019

Ваш запрос на мыло занимает больше 30 секунд?Если да, вам нужно знать, что время ожидания по умолчанию в .NET Core для запроса мыла составляет 30 секунд.

Немного сложно изменить время ожидания, но кто-то уже понял, как :

        static void Main(string[] args)
        {
            var client = new SimpleServiceClient();
            client.OpenAsync().GetAwaiter().GetResult();
            client.DelayedResponseAsync(2000).GetAwaiter().GetResult();
            var channel = client.InnerChannel;
            var httpChannelFactory = client.InnerChannel.GetProperty<IChannelFactory>();
            var cacheField = httpChannelFactory.GetType().GetField("_httpClientCache", BindingFlags.NonPublic | BindingFlags.Instance);
            var httpClientCache = cacheField.GetValue(httpChannelFactory);
            var cacheDictionaryField = httpClientCache.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance);

            IDictionary cacheDictionary = (IDictionary)cacheDictionaryField.GetValue(httpClientCache);
            foreach(var cacheKey in cacheDictionary.Keys)
            {
                var cacheEntry = cacheDictionary[cacheKey];
                var valueField = cacheEntry.GetType().GetField("value", BindingFlags.NonPublic | BindingFlags.Instance);
                HttpClient httpClient = (HttpClient)valueField.GetValue(cacheEntry);
                FixHttpClient(httpClient);
            }

            client.DelayedResponseAsync(50000).GetAwaiter().GetResult();
            Console.WriteLine("Done");
            Console.ReadLine();
        }

        private static void FixHttpClient(HttpClient httpClient)
        {
            var handlerField = typeof(HttpMessageInvoker).GetField("_handler", BindingFlags.NonPublic | BindingFlags.Instance);
            DelegatingHandler delegatingHandler = (DelegatingHandler)handlerField.GetValue(httpClient); // Should be of type ServiceModelHttpMessageHandler
            WinHttpHandler winHttpHandler = (WinHttpHandler)delegatingHandler.InnerHandler;
            WinHttpHandler newHandler = new WinHttpHandler();
            newHandler.ServerCredentials = winHttpHandler.ServerCredentials;
            newHandler.CookieUsePolicy = winHttpHandler.CookieUsePolicy;
            newHandler.ClientCertificates.AddRange(winHttpHandler.ClientCertificates);
            newHandler.ServerCertificateValidationCallback = winHttpHandler.ServerCertificateValidationCallback;
            newHandler.Proxy = winHttpHandler.Proxy;
            newHandler.AutomaticDecompression = winHttpHandler.AutomaticDecompression;
            newHandler.PreAuthenticate = winHttpHandler.PreAuthenticate;
            newHandler.CookieContainer = winHttpHandler.CookieContainer;

            // Fix the timeouts
            newHandler.ReceiveHeadersTimeout = Timeout.InfiniteTimeSpan;
            newHandler.ReceiveDataTimeout = Timeout.InfiniteTimeSpan;
            newHandler.SendTimeout = Timeout.InfiniteTimeSpan;

            var servicemodelHttpHandlerInnerHandlerField = delegatingHandler.GetType().GetField("_innerHandler", BindingFlags.NonPublic | BindingFlags.Instance);
            servicemodelHttpHandlerInnerHandlerField.SetValue(delegatingHandler, newHandler);
            var delegatingHandlerInnerHandlerField = typeof(DelegatingHandler).GetField("_innerHandler", BindingFlags.NonPublic | BindingFlags.Instance);
            delegatingHandlerInnerHandlerField.SetValue(delegatingHandler, newHandler);
        }

Так легко, передайте свой HttpClient на

код, скопированный непосредственно из этой сущности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...