VS2017从私有NuGet服务器下载包时端口号被忽略的解决咨询
你遇到的核心问题很明确:VS2017能正常浏览私有NuGet源的包,但执行Install-Package时,服务器返回的下载链接丢失了8082端口,导致请求默认打到80端口连接失败。从你的日志里能清楚看到:查找包的请求是带端口的http://mydomain:8082/nuget/FindPackagesById(),但下载请求却变成了不带端口的http://mydomain/nuget/Packages(Id='MyPackage',Version='1.0.1')/Download,这就是失败的直接原因。
下面是几个可靠的修复方案,按优先级排序:
1. 强制指定NuGet.Server的基础URL(最直接有效)
NuGet.Server默认会根据当前请求的HTTP头动态生成下载URL,如果你的服务器环境(比如IIS站点绑定、反向代理配置)导致Host头不包含端口,就会出现这个问题。我们可以在NuGet.Server的Web.config里硬指定完整的服务器URL,强制生成带端口的下载链接:
打开私有NuGet服务器所在项目的Web.config,在<appSettings>节点里添加以下配置:
<add key="nuget:ServerUrl" value="http://mydomain:8082/nuget" />
保存后重启NuGet服务器站点,再回到VS2017重新执行Install-Package命令,此时服务器返回的下载链接应该会正确带上8082端口。
2. 检查并修正IIS站点绑定配置
如果你是用IIS托管NuGet.Server,确认站点的绑定设置是否正确:
- 打开IIS管理器,找到你的NuGet.Server站点
- 右键选择「编辑绑定」,确保存在一条绑定:类型为HTTP,IP地址选「全部未分配」或你的服务器IP,端口设为8082,主机名留空或填写
mydomain - 避免出现绑定只设置了主机名但没指定端口,或者端口设置错误的情况
3. 验证服务器的Host头传递(针对反向代理场景)
如果你的私有NuGet服务器前面有反向代理(比如Nginx、IIS ARR),需要确保代理服务器正确传递了原始请求的Host头(包含端口),否则NuGet.Server无法正确生成带端口的URL。比如在Nginx里,需要配置proxy_set_header Host $host:$server_port;来保留端口信息。
补充验证步骤
修改配置后,你可以先在浏览器里访问http://mydomain:8082/nuget/Packages(Id='MyPackage',Version='1.0.1')/Download,确认能正常下载包文件,再回到VS里执行安装命令,这样能提前验证下载链接的正确性。
内容的提问来源于stack exchange,提问作者Roo

