如何设置 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。
希望有人觉得这有帮助。
我正在尝试使用 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。
希望有人觉得这有帮助。