解决目标计算机主动拒绝本地API POST请求连接的报错问题
问题排查方案
目标计算机主动拒绝连接是TCP握手阶段直接被驳回的典型表现,请求根本没走到API的业务处理层,和你POST传参、接口逻辑没有关系,按以下优先级逐一排查即可:
- 先确认API服务正常运行且监听端口匹配
不要只参考项目里launchSettings.json的配置,启动API项目后直接看控制台打印的实际监听地址:很多场景下5149端口会被其他程序占用,服务会自动切到其他端口启动;也有可能你只启动了控制台项目,根本没跑API程序。
验证方式非常简单:API启动后直接在浏览器访问http://localhost:5149/api/flights,哪怕返回405方法不允许都说明端口连通正常,如果浏览器直接打不开,说明这个端口根本没有服务在监听。 - 检查API的地址绑定配置
如果你用ASP.NET Core搭建API,默认启动配置经常只绑定HTTPS端口(一般是5001/7xxx号段),没有绑定你写的5149 HTTP端口;或是服务只绑定了https协议地址,你用HTTP协议请求HTTPS端口也会被直接拒绝。可以检查Program.cs里的builder.WebHost.UseUrls()配置,或是appsettings.json里的Urls配置项,确认明确绑定了http://localhost:5149。 - 校验端口实际占用状态
打开终端执行命令netstat -ano | findstr :5149,查看返回结果里有没有状态为LISTENING的记录,对应的PID是不是你的API进程。如果没有LISTENING状态的记录,说明没有任何程序在该端口接收请求;如果监听的PID属于其他程序,说明端口被占用,你的请求发到了别的程序上自然会被拒绝。 - 检查多项目启动配置
两个项目在同一个解决方案下时,不要只把控制台项目设为唯一启动项。右键解决方案选择「属性」-「启动项目」,选择「多个启动项目」,把API项目和控制台项目的操作都设为「启动」,保证两个程序同时运行。
额外代码优化提示
虽然不是本次连接错误的诱因,但你的代码存在一个容易引发后续问题的写法:不要在非事件处理器的方法上用async void签名,这种写法的异常无法被正常捕获,很容易导致程序无感知崩溃。建议把方法签名修改为:
private async Task CreateNewArrival(Flight flight) { string url = $"http://localhost:5149/api/flights"; HttpResponseMessage response = await httpClient.PostAsJsonAsync(url, flight); if (!response.IsSuccessStatusCode) response.EnsureSuccessStatusCode(); else Console.WriteLine("Arrival was sent to api"); }
调用该方法时记得加上await关键字即可。
内容的提问来源于stack exchange,提问作者Achiad Hess
相关产品推荐
相关产品推荐

