Uri.GetComponents返回查询参数问题:如何提取不含参数的路径?
问题解答
现象是否正常?
这种现象是正常的。原因在于你把包含?和查询参数的完整字符串直接赋值给了UriBuilder.Path属性,而UriBuilder.Path仅用于存储URI的路径部分,它会将?视为路径的一部分进行转义(转为%3F),不会将其识别为查询参数的分隔符。因此当你提取路径组件时,这些原本属于查询参数的内容会被当作路径的一部分返回。
提取纯路径的方法
方法1:直接拆分字符串
通过查找?的位置截取纯路径,简单直接:
var ps = new PathString("/someapi/wayne/insane?param=1234&ups=134"); var questionMarkPos = ps.Value.IndexOf('?'); var purePath = questionMarkPos >= 0 ? ps.Value.Substring(0, questionMarkPos) : ps.Value; // purePath 结果:"/someapi/wayne/insane"
方法2:正确构造Uri解析
将完整的路径+查询字符串拼接成合法Uri,再提取路径部分:
var ps = new PathString("/someapi/wayne/insane?param=1234&ups=134"); if (Uri.TryCreate("http://localhost" + ps, UriKind.Absolute, out var uri)) { var purePath = uri.AbsolutePath; // purePath 结果:"/someapi/wayne/insane" }
方法3:利用AspNetCore的PathString/QueryString拆分
如果使用ASP.NET Core,可以直接用框架提供的方法拆分路径和查询字符串:
var fullString = "/someapi/wayne/insane?param=1234&ups=134"; var path = PathString.FromUriComponent(fullString); var query = QueryString.FromUriComponent(fullString); // path.Value 结果:"/someapi/wayne/insane"
内容的提问来源于stack exchange,提问作者greg-e
相关产品推荐
相关产品推荐

