解析相对URI

时间:2012-11-26 12:42:01

标签: .net uri

我想从相对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 个答案:

答案 0 :(得分:14)

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

HttpUtility.ParseQueryString()确实不会在这里提供帮助,因为它只对Uri的查询部分进行操作,因为你没有绝对的Uri,所以你无法获得它。

所以虽然它看起来很糟糕,但我认为new Uri(baseUri, relativeUri) contstructor完全符合你的要求。我似乎找不到更好或更清洁的方法来实现同样的目标。

答案 1 :(得分:3)

自己遇到这个问题我发现HttpUtility.ParseQueryString实际上只是在寻找字符串以及'?'之后的任何内容

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

HttpUtility.ParseQueryString(url.Split('?').Last())