29

我想从相对 URI 中提取查询字符串和片段,即没有任何方案或主机信息的 URI。

有没有比将其转换为带有假主机名的绝对 URI 更优雅的方法呢?

var relativeUri = "/dir1/dir2/file?a=b&c=d#fragment";
var uri = new Uri(new Uri("http://example.com"), relativeUri);
var path = Uri.UnescapeDataString(String.Concat(uri.Segments));
var query = uri.Query;
var fragment = uri.Fragment;
// path = "/dir1/dir2/file", query = "?a=b&c=d", fragment = "#fragment"
4

2 回答 2

19

尽管您可以创建Uri没有主机部分的 a,但它的大多数属性随后将引发 InvalidOperationException(“相对 URI 不支持此操作”),因为这些属性依赖于绝对 Uri。

HttpUtility.ParseQueryString()确实在这里没有帮助,因为它仅对 Uri 的查询部分进行操作,而您无法获得该部分,因为您没有绝对的 Uri。

所以虽然它看起来很老套,但我认为new Uri(baseUri, relativeUri)构造函数正是你想要的。我似乎找不到更好或更清洁的方法来完成同样的任务。

于 2012-11-26T13:40:13.857 回答
4

我自己遇到了这个问题,我发现HttpUtility.ParseQueryString实际上只是在寻找字符串和“?”之后的任何内容。

所以我必须在两种情况下(相对和绝对)都使用它,我发现以下似乎工作得很好

HttpUtility.ParseQueryString(url.Split('?').Last())
于 2018-02-05T20:09:23.010 回答