ServiceStack路由仅主机名后带//时可正常解析的问题咨询
问题根因
该问题和Kestrel、Visual Studio配置无关,是ServiceStack 5.14与.NET 5 Endpoint路由集成时的路径拼接逻辑冲突导致:
- 你通过重写
GetRouteAttributes手动为路由拼接带前导斜杠的/api前缀时,绕开了ServiceStack官方的统一路由前缀配置,ServiceStack内部的路由注册逻辑无法感知到自定义前缀,仍然按照根路径挂载的规则处理路由模板 - ServiceStack 5.x在.NET Core 3.0+环境下默认启用Endpoint路由注册,内部会为路由模板自动拼接路径分隔符,最终注册到ASP.NET Core路由表的实际模板为
//api/things,这就是为什么带双斜杠的请求可以正常命中路由返回200,单斜杠的/api/things请求无法匹配到ServiceStack的处理程序,落到其他默认Handler上返回405状态码与NotImplementedException - 未使用ServiceStack的.NET Core应用直接走原生路由系统,不存在这层额外的路径拼接逻辑,因此路由表现正常
修复方案
方案一:官方推荐方案(最稳定,无兼容问题)
删除你重写的GetRouteAttributes方法,直接通过ServiceStack内置的配置项设置统一路由前缀,框架会自动处理所有路径拼接、路由匹配、链接生成的适配逻辑,不会出现斜杠重复问题:
在AppHost.Configure方法中添加如下配置:
SetConfig(new HostConfig { HandlerFactoryPath = "api" });
方案二:保留GetRouteAttributes重写逻辑(适合需要做复杂路由规则定制的场景)
如果你需要通过重写GetRouteAttributes实现比固定前缀更复杂的路由逻辑,按如下方式调整代码,避免框架自动拼接产生多余斜杠:
- 首先在AppHost配置中关闭自动前缀拼接:
SetConfig(new HostConfig { HandlerFactoryPath = string.Empty });
- 调整
GetRouteAttributes的前缀拼接逻辑,处理原路径的前导斜杠,避免多余斜杠产生:
public override RouteAttribute[] GetRouteAttributes(Type requestType) { var routes = base.GetRouteAttributes(requestType); routes.Each(x => { var trimmedOriginalPath = x.Path.TrimStart('/'); x.Path = $"api/{trimmedOriginalPath}"; }); return routes; }
调整完成后重启服务,请求http://localhost:64200/api/things即可正常返回200响应,双斜杠请求会被框架的路径规范化逻辑自动匹配到同一处理程序,不会影响客户端调用。
内容的提问来源于stack exchange,提问作者alfredo_sprout
相关产品推荐
相关产品推荐

