.NET 6.0 ServiceStack6.1.1 JsonServiceClient未使用/json/reply路径问题
产生原因
这是ServiceStack v6版本引入的默认路由规则破坏性变更导致的:
- v5.x系列版本中,
/json/reply/{RequestDTO}是无自定义路由DTO的默认最高优先级请求路径,根路径/{RequestDTO}属于低优先级 fallback 路由,默认不会被客户端优先选中。 - v6版本重构了默认API端点逻辑,默认启用精简根路由,将
/{RequestDTO}设为无自定义路由DTO的默认首选路径,原/json/reply/{RequestDTO}路径虽然仍在服务端保留可用,但不再作为客户端路由匹配的首选项。 - 升级v6.1.1后,ServiceStackVS生成的*.dto元数据文件会同步携带v6版本的默认路由标记,JsonServiceClient读取元数据时会优先匹配根路径规则,因此所有未配置自定义路由的DTO都会直接请求
/{RequestDTO}路径。
简便配置方案
不需要修改自动生成的*.dto文件,直接在初始化JsonServiceClient时添加一行配置即可实现需求:
var client = new JsonServiceClient("你的API服务基地址") { UseBasePath = "/json/reply/" };
配置后客户端的路由匹配逻辑会和v5.x版本保持一致:
- 标注了自定义路由的DTO,仍然会请求配置的自定义路由路径
- 未标注自定义路由的DTO,会默认走
/json/reply/{RequestDTO}路径
如果需要做更灵活的路由定制,可以通过OnResolvePath委托自定义路由解析规则:
client.OnResolvePath = (routeMeta, requestDto) => { // 存在自定义路由时优先使用自定义路由 if (routeMeta.Route != null) return routeMeta.Route.Path; // 无自定义路由时返回/json/reply前缀路径 return $"/json/reply/{requestDto.GetType().Name}"; };
补充校验项:如果配置后出现404,需要确认v6.1.1服务端没有开启
Config.DisableJsonReplyPath配置,该配置会直接禁用/json/reply前缀的所有端点。
内容的提问来源于stack exchange,提问作者Niko Yakimov
相关产品推荐
相关产品推荐

