gpt4 book ai didi

asp.net - ASP.NET Core 中 HttpRequest.Path 的 URL 解码不一致

转载 作者:行者123 更新时间:2023-12-05 03:44:21 25 4
gpt4 key购买 nike

HttpContext.Request.Path 似乎有时会解码百分比编码的 URL,但并非总是如此,我正在努力理解它的行为。 documentation什么都不说编码。我希望它永远不会解码路径,但是在 ASP.NET Core 3.1 上测试我得到这样的结果:

<表类="s-表"><头>请求网址上下文.Request.Path解码百分比?<正文> http://localhost:5000/test%24 /测试$http://localhost:5000/test%24aa /测试$aahttp://localhost:5000/test%25a /test%25a没有 http://localhost:5000/test%25aa /test%aahttp://localhost:5000/test%20aa /test%20aa没有

这是一个错误还是背后有什么原因?

通过在 VS 2019 中创建一个空的 ASP.NET Core 项目并将 Startup 类更改为

    public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
Console.WriteLine("Request path = " + context.Request.Path);
await context.Response.WriteAsync("Request path = " + context.Request.Path);
});
}
}

程序类与模板相同:

    public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}

编辑来自 ASP.NET 贡献者的回答:https://github.com/dotnet/aspnetcore/issues/30655

最佳答案

我遇到了同样的问题(“%2B”对应字面值“+”),我终于明白发生了什么。

  1. 请注意,context.Request.PathPathString 类型,并且具有 Value 属性。

  2. 默认的 Path.ToString() 重载不会返回与 Path.Value 属性相同的值:

    • Path.Value 返回一个部分*(见下面的备注) 似乎可靠的解码 URL(它是真正的底层/包装值).
    • Path.ToString() 使用 Path.Value 属性返回经过编码的 URL。
  3. 另请注意,PathString 可以转换为 string 并在带有 string 参数的方法中按原样使用,所以要小心必要时使用 Value 属性!

总结

  • 要获得解码后的 URL,请使用:
var decodedURL = context.Request.Path.Value;

备注*:注意«decoded»表示所有带有“%”后跟两个十六进制数字的字符将被转换为相应的字符,但特殊字符'+'不会。如果您希望“+”字符也被转换,请考虑使用以下内容:

var decodedURL = System.Net.WebUtility.UrlDecode(context.Request.Path.Value); //Including '+' char to space
  • 要获得编码的 URL,请使用:
var encodedURL = context.Request.Path.ToUriComponent();

注意!

但请注意,由于上面的备注*,仍然存在不一致的用例。

让我们考虑下面的例子:

<表类="s-表"><头>真实资源路径编码的网址context.Request.Path.Value<正文>/my+路径示例/my%2B路径+示例/我的+路径+例子

正如您所注意到的,如果您使用“+”字符编码空格和“%2B”字符字符“+”(这是合法的)对 URL 进行编码,则不可能从 路径.值...

为避免这种情况,我建议将空格编码为“%20”,但再次注意:不要使用 System.Net.WebUtility.HtmlEncodeSystem.Web。 HttpUtility.UrlEncode(会将空格转换为“+”),但System.Web.HttpUtility.UrlPathEncode

作为一个小的个人结论,Path.Value 属性被部分解码可能有一些充分的理由(我不知道),但在这种情况下,框架应该提供获取真实原始/未修改 URL 的另一个属性

希望这会有所帮助!

快乐编码:)

关于asp.net - ASP.NET Core 中 HttpRequest.Path 的 URL 解码不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66471763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com