VS2017下.NET Core WebAPI使用UseUrls无法修改端口问题
我完全懂你的困扰——明明代码里用UseUrls指定了端口9874,但VS死活用着Debug面板里设置的56021,连切到Release模式也没变化。这其实是VS的调试配置优先级比代码中的设置更高导致的,下面给你拆解原因和靠谱的解决方案:
问题根源
在VS里创建.NET Core项目时,会自动生成Properties/launchSettings.json文件,你在Project -> Debug -> Web Server Settings里看到的App URL,本质就是这个文件里的配置。VS启动项目时,会把这个URL作为命令行参数传递给你的Web应用,而WebHost.CreateDefaultBuilder(args)会优先读取这些命令行参数,所以你代码里的UseUrls直接被覆盖了。
解决方案
方法1:修改launchSettings.json(最推荐)
直接调整项目的配置文件,让VS调试时默认用你想要的端口:
- 在解决方案资源管理器里,找到项目下的
Properties文件夹,打开launchSettings.json - 找到对应的配置节点(比如
IIS Express或者你的项目名称节点),把applicationUrl的值改成http://localhost:9874"profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "http://localhost:9874" // 修改这里 }, "YourProjectName": { "commandName": "Project", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "http://localhost:9874" // 用Kestrel直接启动的话也要改这里 } } - 保存文件后重启VS调试,端口就会变成9874了。Release模式下只要对应配置也改了,同样会生效。
方法2:代码中强制指定端口(绕过VS配置)
如果你不想改launchSettings,可以通过配置Kestrel的方式强制锁定端口,这种方式会直接覆盖命令行参数:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureKestrel(options => { // 直接让Kestrel监听9874端口 options.ListenLocalhost(9874); }) .Build();
这样不管VS传递什么参数,Kestrel都会老老实实监听你指定的端口。
方法3:取消VS的命令行参数传递
在项目属性的Debug选项卡中,找到Application arguments,清空里面的内容(如果有的话),或者取消勾选Launch URL。不过这种方法不如前两种直接,不推荐作为首选。
为什么Release模式也有同样问题?
因为launchSettings.json里也包含了Release模式的配置(如果你的项目配置过的话),VS启动Release模式时同样会读取这个文件里的参数,所以端口还是被覆盖了。只要修改对应模式的applicationUrl就能解决。
内容的提问来源于stack exchange,提问作者superhuman1314

