Консольное приложение .NET Core 2.1, запущенное через Windows Task Scheduler с вызовами HttpClient, приводит к 401 - PullRequest
0 голосов
/ 13 декабря 2018

У меня возникла проблема при обновлении приложения с .NET Core 1.0.1 до .NET Core 2.1.Это консольное приложение, запускаемое с помощью планировщика задач Windows, которое вызывает набор веб-служб, размещенных в IIS на том же сервере.После обновления при попытке запустить его на хост-компьютере происходит сбой при первом вызове API, который возвращает 401. IIS настроен на прием анонимной проверки подлинности и проверки подлинности Windows с поставщиками согласования и NTLM.Планировщик задач устанавливает пользователя, которого должно использовать консольное приложение.Код, который делает первый вызов API, выглядит следующим образом:

using (var handler = new HttpClientHandler())
{
   handler.UseDefaultCredentials = true;

   var client = new HttpClient(handler);
   client.DefaultRequestHeaders.Accept.Clear();
   var result = await client.GetStringAsync(myUrlString);
   return Newtonsoft.Json.JsonConvert.DeserializeObject<List<MyResponseObject>>(result);
 }

Я также обновил проект API до .NET Core 2.1, но попытался вернуться к версии 1.0.1 при запускеконсольное приложение как 2.1 (и наоборот, работает API на 2.1 и консольное приложение на 1.0.1 также работает), чтобы быть уверенным, что это консольное приложение с проблемой.

Консольное приложение прекрасно работает при запуске с моего локального хоста с API, размещенным локально в IIS Express.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я столкнулся с подобной проблемой несколько недель назад, когда переходил с .NET Framework 4.6.x на .NET Core 2.1.Проблема может быть связана с новым HttpHandler, реализованным в .NET Core 2.1.Этот обработчик сталкивается с различными проблемами (например, this ).Даже если эта конкретная ошибка может быть не полностью связана, описанный здесь обходной путь может помочь:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
0 голосов
/ 14 декабря 2018

Попробуйте это.Это работает для нашего клиентского приложения.

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("application/json"));
...