You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:17:32