如何设置 NuGet 配置以在 IIS App Pool 用户帐户下工作,以便我可以从 ASP.NET MVC 中的自定义 NuGet 源下载文件?

How can I setup the NuGet configuration to work under the IIS App Pool user account so I can download files from a custom NuGet source in ASP.NET MVC?

我正在尝试使用 ASP.NET MVC 网站从自定义 nuget 服务器下载 NuGet 包。我在控制台应用程序下 运行 的代码很好,但是当我在 IIS 下 运行 它时,我收到一个异常:

System.InvalidOperationException: 在“https://mynugetserverurl”找不到 'MyPackage.1.0.0' 的包流。

每个 运行 在不同的凭据下。我的本地用户在控制台应用程序和标准 IIS 用户 (APP POOL\my.domain.name.com) 的情况下。

我的自定义 nuget 包源是为我的本地用户设置的,我已尝试根据此 nuget 文档 (https://docs.nuget.org/consume/nuget-config-file) 在许多不同位置为 IIS 用户设置 nuget.config,但是 none 似乎被识别了。

如何设置 NuGet 配置以在 IIS 应用程序池用户帐户下工作,以便我可以从 ASP.NET MVC 中的自定义 NuGet 源下载文件?

事实证明,访问 nuget.config 根本不是问题所在。我找到了 API 的一个版本,我可以明确地告诉它要使用哪个 nuget.config 文件并验证该用户可以访问该文件,但没有任何改变。我确认 nuget 能够读取设置,但下载仍然无法正常工作。

通过代码追踪我发现 DownloadToMachineCache (https://github.com/NuGet/NuGet.Client/blob/fb6430c6f8c79ec7a28fc2e64e80b89ccb9b1e8b/src/NuGet.Core/NuGet.Protocol.Core.v2/Resources/DownloadResourceV2.cs) was returning null. Code never reached line 301 because MachineCache.InvokeOnPackage was returning false. InvokeOnPackage calls a private method TryAct which reads as follows (https://github.com/ctaggart/nuget/blob/master/src/Core/Repositories/MachineCache.cs):

  try
  {
        // Do stuff...
        return action();
        // Do more stuff...
  }
  catch (IOException ex)
  {
  }
  catch (UnauthorizedAccessException ex)
  {
  }
  return false;

啊——真令人沮丧....它没有在任何级别正确处理问题,让用户知道发生了什么!相反,它吞没了这里的任何有用信息并掩盖了真正发生的事情。如果您优雅地恢复或告诉我如何修复它,我不会抱怨吞下异常,但如果您不这样做,请告诉我信息,以便我自己解决!

无论如何 - action() 回调 InvokeOnPackage 中的委托,它试图在 packagePath 处创建一个文件并在那里写入下载的 .nupkg - 最后!

packagePath 解析为:C:\Windows\System32\config\systemprofile\AppData\Local\NuGet\Cache

除了 nuget.config 的访问权限外,您还需要此路径的写入权限,以便 NuGet 在 IIS 用户下运行。 希望我能找到另一个 NuGet API 允许我告诉它使用更适合它的磁盘缓存的路径!

注:在我的研究中我也遇到了这个:https://github.com/NuGet/Home/issues/2140

也许在即将发布的版本中它们足以让我崩溃!我目前使用的是 v3.3。

希望有人觉得这有帮助。