如何在YARP请求完成前获取代理请求的目标地址?
解决YARP网关在请求发送前获取最终目标路径的问题
要在调用next()前拿到YARP选择的目标服务及转换后的完整路径,核心是调整中间件在代理管道中的执行顺序,确保逻辑在目的地选择完成、请求转换完毕后执行,此时YARP已经确定了最终目标并处理了路径重写。
调整后的示例代码
private void SetProxyPipeline(IReverseProxyApplicationBuilder proxyPipeline) { // 先执行YARP内置核心流程:路由匹配 → 目的地选择 → 请求转换 proxyPipeline.UseRouting(); proxyPipeline.UseDestinationSelector(); proxyPipeline.UseTransforms(); // 插入自定义逻辑,此时已能获取最终目标信息 proxyPipeline.Use(async (context, next) => { var proxyFeature = context.GetReverseProxyFeature(); // 获取目标服务的基础地址(如 localhost:3100) var destinationBaseAddress = proxyFeature.ProxiedDestination?.Destination?.Address; // 获取转换后的目标路径(如 /api/example1) var transformedPath = proxyFeature.ProxyRequest?.Path; if (!string.IsNullOrEmpty(destinationBaseAddress) && transformedPath.HasValue) { // 拼接完整的目标URL var fullTargetUrl = $"{destinationBaseAddress}{transformedPath.Value}"; // 这里可添加授权头逻辑,或基于目标路径做自定义处理 context.Request.Headers.Authorization = "Bearer your-token-here"; // 示例:打印目标路径 Console.WriteLine($"即将转发请求到:{fullTargetUrl}"); } await next(); }); // 执行最终的请求转发逻辑 proxyPipeline.UseProxyRequest(); }
关键说明
- 中间件顺序:必须将自定义逻辑放在
UseDestinationSelector()和UseTransforms()之后,这两个步骤分别完成了目标服务的选择和请求路径的转换(比如把/service/example1重写为/api/example1) - 核心属性:
ProxiedDestination.Destination.Address:目标服务的基础地址,由YARP路由规则匹配后选中ProxyRequest.Path:经过转换处理后的最终请求路径,即实际发送给目标服务的路径
- 兼容性:这种方式不需要依赖
AvailableDestinations(仅包含候选目标),能准确获取最终选中的目标及转换后的路径,支持多目标路由、路径重写等场景
内容的提问来源于stack exchange,提问作者Damien
相关产品推荐
相关产品推荐

