【问题标题】:.NET Core 2.1 console app running via Windows Task Scheduler with HttpClient calls result in 401通过带有 HttpClient 调用的 Windows 任务计划程序运行的 .NET Core 2.1 控制台应用程序导致 401
【发布时间】:2018-12-13 20:38:38
【问题描述】:

我在将应用程序从 .NET Core 1.0.1 升级到 .NET Core 2.1 时遇到了问题。这是一个通过 Windows 任务计划程序运行的控制台应用程序,它调用一组托管在同一服务器上的 IIS 中的 Web 服务。升级后,当尝试在主机上运行它时,它在第一次 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,但我尝试在将控制台应用程序作为 2.1 运行时恢复到 1.0.1 版本(相反,在 2.1 运行 API 并在 1.0 运行控制台应用程序.1 也有效)以确保它是有问题的控制台应用程序。

当使用 IIS Express 本地托管的 API 从我的本地主机运行时,控制台应用程序运行良好。

任何帮助将不胜感激!

【问题讨论】:

  • IIS 日志文件中记录的子状态是什么? support.microsoft.com/en-ca/help/943891/…
  • 我认为在同一个 IIS 站点中同时进行匿名和 Windows 身份验证是无效的。
  • 子状态码为 1 - 登录失败。
  • @mason 我们在 IIS 中托管的所有站点目前都已启用(包括托管 .NET Core v1.0.1 版本 API 的站点,控制台应用程序在试图击中它)。无论如何,只是尝试禁用匿名并重新运行控制台应用程序,但仍然没有骰子。
  • 您是否确保用户拥有正确的权限来使用您的应用程序?任务调度器中是否勾选了“以最高权限运行”?

标签: asp.net iis asp.net-core .net-core asp.net-core-2.1


【解决方案1】:

试试这个。它适用于我们的客户端应用程序。

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

【讨论】:

  • 不幸的是,这似乎不起作用。谢谢你的建议!
【解决方案2】:

几周前,当我从 .NET Framework 4.6.x 迁移到 .NET Core 2.1 时,我遇到了类似的问题。该问题可能与 .NET Core 2.1 中实现的新 HttpHandler 有关。此处理程序存在各种问题(例如,this)。尽管此特定错误可能不完全相关,但此处描述的解决方法可能会有所帮助:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多