解析相对URI

31

我想从相对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"
2个回答

23

尽管可以创建没有主机部分的Uri,但是它的大多数属性都会抛出InvalidOperationException异常(“此操作不支持相对URI”),因为这些属性依赖于绝对Uri。

HttpUtility.ParseQueryString()在这里确实无法帮助,因为它仅操作Uri的查询部分,你不能获得绝对Uri。

因此,虽然它似乎有些hacky,但我认为new Uri(baseUri, relativeUri)构造函数正是你想要的。我找不到更好或更清晰的方法来实现相同的效果。


实际上,HttpUtility.ParseQueryString() 也适用于相对 URL。可能有点晚了,但我正在检查类似的东西 :) - NomadTraveler
5
很抱歉,它不能。HttpUtility.ParseQueryString("/dir1/dir2/file?a=b&c=d#fragment");返回两个结果:/dir1/dir2/file?a = bc = d#fragment,这绝对不是你想要的。你真正需要传递给它的是一个查询字符串。 - CodeCaster
十年过去了,这仍然是很好的建议。我只是在相对URL前插入了一个假的 https://host ,一切神奇地运作了。 - Emperor Eto

6
我发现在遇到这个问题时,HttpUtility.ParseQueryString只会查找问号后面的字符串。
因此,既要处理相对路径又要处理绝对路径,我认为以下方法可以很好地解决问题。
HttpUtility.ParseQueryString(url.Split('?').Last())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接