Azure DevOps Server 2019 Artifacts NuGet还原报NU1301错误
NU1301错误:Azure DevOps Server 2019 NuGet包还原失败
问题场景
在Azure DevOps Server 2019环境中从Azure Artifacts还原NuGet包时,触发错误提示:NU1301: Unable to load the service index for source http://xxxxx:8080/tfs/xxxxx/_packaging/xxxxx/nuget/v3/index.json
已验证的现象:
- 浏览器可正常访问上述私有NuGet源地址,以及目标包
xxxxx.Database.Net60的索引地址 - 相同Nuget.config配置下,引用同私有源的其他内部包(如
xxxxx.Core 0.1.0)时,dotnet restore可正常执行,仅引用xxxxx.Database.Net60 0.1.1时还原失败
现有配置
Nuget.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="xxxxx" value="http://xxxxx:8080/tfs/xxxxx/_packaging/xxxxx/nuget/v3/index.json" /> </packageSources> <activePackageSource> <add key="All" value="(Aggregate source)" /> </activePackageSource> </configuration>
报错项目包引用
<ItemGroup> <PackageReference Include="xxxxx.Database.Net60" Version="0.1.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.6" /> </ItemGroup>
正常还原项目包引用
<ItemGroup> <PackageReference Include="xxxxx.Core" Version="0.1.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.6" /> </ItemGroup>
问题根因
该问题由两个因素共同触发:
- .NET 6及以上版本的NuGet客户端默认启用非HTTPS源拦截机制:对于使用HTTP协议的NuGet源,只有被明确加入信任列表的源才会被用于完整的依赖链解析。未被信任的HTTP源仅能拉取无额外传递依赖的包,一旦目标包存在同私有源下的传递依赖,客户端会直接中断源加载,抛出NU1301错误。
- 当前配置的私有Azure Artifacts源存在两个配置缺失:一是使用HTTP协议但未加入NuGet客户端的信任列表,二是未显式声明NuGet协议版本。引用无额外私有依赖的
xxxxx.Core时不会触发完整的依赖链源校验,所以可以正常还原;而xxxxx.Database.Net60存在同私有源下的传递依赖,直接触发了安全拦截。
浏览器可正常访问源地址是因为浏览器不存在NuGet客户端的这套源安全校验逻辑,不能作为CLI访问权限的判断依据。
修复方案
按优先级依次操作:
- 最优方案:为Azure DevOps Server 2019配置HTTPS绑定,将Nuget.config中私有源的地址从HTTP替换为HTTPS协议,这是最符合安全规范的永久解决方式。
- 临时兼容方案:如果暂时无法部署HTTPS,修改Nuget.config,显式声明NuGet协议版本,同时将当前HTTP私有源加入信任列表,修改后的完整配置如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="xxxxx" value="http://xxxxx:8080/tfs/xxxxx/_packaging/xxxxx/nuget/v3/index.json" protocolVersion="3" /> </packageSources> <config> <add key="allowInsecureConnections" value="true" /> </config> <activePackageSource> <add key="All" value="(Aggregate source)" /> </activePackageSource> </configuration>
- 还原操作前先清除本地NuGet缓存,避免旧的错误元数据干扰还原流程:
dotnet nuget locals all --clear
清除缓存后重新执行dotnet restore即可正常完成包还原。
内容的提问来源于stack exchange,提问作者Kelvin Go
相关产品推荐
相关产品推荐

