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

能否禁用Yarp转发请求时的查询字符串编码?

如何让Yarp不对查询字符串中的反斜杠()进行编码?

要让Yarp和Kong保持一致,不对查询字符串中的\字符进行编码,可以通过自定义请求转换修改Yarp的默认行为,以下是两种可行方案:

方案一:直接转发原始查询字符串

跳过Yarp对查询字符串的编码处理,直接将客户端请求的原始查询字符串转发到后端:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(context =>
    {
        context.AddRequestTransform(transformContext =>
        {
            // 将原始请求的查询字符串直接赋值给代理请求
            transformContext.ProxyRequest.QueryString = transformContext.HttpContext.Request.QueryString;
            return Task.CompletedTask;
        });
    });

var app = builder.Build();
app.MapReverseProxy();
app.Run();

该方案会完全保留客户端发送的查询字符串格式,所有特殊字符的处理逻辑与Kong一致,适合需要完全对齐Kong行为的场景。

方案二:仅还原反斜杠的编码结果

如果仅需针对\字符取消编码,其他字符仍保留Yarp的默认编码逻辑,可以将Yarp编码后的%5C替换回\:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(context =>
    {
        context.AddRequestTransform(transformContext =>
        {
            var encodedQuery = transformContext.ProxyRequest.QueryString.Value;
            if (!string.IsNullOrEmpty(encodedQuery))
            {
                // 将编码后的反斜杠替换回原始字符
                var modifiedQuery = encodedQuery.Replace("%5C", "\\");
                transformContext.ProxyRequest.QueryString = new QueryString(modifiedQuery);
            }
            return Task.CompletedTask;
        });
    });

var app = builder.Build();
app.MapReverseProxy();
app.Run();

验证效果

配置完成后,发送请求http://localhost:5123/api/sample-controller/v0/sample?filter=smth\.smth,后端ASP.NET Core应用中的HttpContext.Request.QueryString.Value将返回filter=smth\.smth,与Kong的行为一致,无需修改遗留的自定义绑定器代码。

内容的提问来源于stack exchange,提问作者Marek Ott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:18:21