我想从相对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"
答案 0 :(得分:14)
虽然您可以创建没有主机部分的Uri
,但是它的大多数属性都会抛出InvalidOperationException(“相对URI不支持此操作”),因为这些属性依靠绝对的Uri。
HttpUtility.ParseQueryString()
确实不会在这里提供帮助,因为它只对Uri的查询部分进行操作,因为你没有绝对的Uri,所以你无法获得它。
所以虽然它看起来很糟糕,但我认为new Uri(baseUri, relativeUri)
contstructor完全符合你的要求。我似乎找不到更好或更清洁的方法来实现同样的目标。
答案 1 :(得分:3)
自己遇到这个问题我发现HttpUtility.ParseQueryString
实际上只是在寻找字符串以及'?'之后的任何内容
因此,我必须在两种情况下使用它(相对和绝对)我发现以下似乎工作得很好
HttpUtility.ParseQueryString(url.Split('?').Last())