添加路由前缀时无法连接Web服务器的技术咨询
问题与解决:ASP.NET Core添加路由前缀后连接失败
问题情况
当客户端和服务器都使用http://127.0.0.1:8003时能正常通信,但添加路由前缀/service(目标地址变为http://127.0.0.1:8003/service)后,出现连接错误:
无法建立连接,因为目标计算机主动拒绝了连接。(127.0.0.1:8003)
用户尝试通过UsePathBase配置路由前缀,以下是相关代码示例:
原始正常工作代码
客户端
var restClient = new RestClient("http://127.0.0.1:8003"); var request = new RestRequest("do_stuff"); request.AddJsonBody(JsonConvert.SerializeObject(new MyInfo {})); var res = await restClient.PostAsync(request);
服务器
var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(); var app = builder.Build(); app.MapPost("do_stuff", ([FromBody] MyInfo args) => { return Results.Ok(); }); appTask = app.RunAsync("http://127.0.0.1:8003");
使用UsePathBase后出现问题的代码
客户端
var restClient = new RestClient("http://127.0.0.1:8003/service"); var request = new RestRequest("do_stuff");
服务器
var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(); var app = builder.Build(); app.UsePathBase("/service"); app.UseRouting(); app.MapPost("do_stuff", ([FromBody] MyInfo args) => { return Results.Ok(); }); appTask = app.RunAsync("http://127.0.0.1:8003/service");
错误原因与修正方案
错误出在服务器的RunAsync调用上:RunAsync的参数是服务器监听的网络端点(仅IP+端口),不能包含路径前缀。/service是应用级的路由前缀,应该由UsePathBase处理,而不是加到监听地址里。
修正后的服务器代码
var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(); var app = builder.Build(); // 配置应用的路由前缀 app.UsePathBase("/service"); // 启用路由中间件,确保路径前缀生效 app.UseRouting(); // 接口映射保持不变,请求会自动匹配 /service/do_stuff app.MapPost("do_stuff", ([FromBody] MyInfo args) => { return Results.Ok(); }); // 监听正确的端点,仅指定IP和端口 appTask = app.RunAsync("http://127.0.0.1:8003");
客户端代码无需修改
客户端当前的写法是正确的,请求的完整地址为http://127.0.0.1:8003/service/do_stuff,服务器通过UsePathBase识别前缀后,会正确路由到do_stuff接口。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

