解析相对URI

Tim*_*son 23 .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"
Run Code Online (Sandbox Code Playgroud)

Cod*_*ter 14

虽然您可以创建一个Uri没有主机部分,但是它的大多数属性将抛出InvalidOperationException("相对URI不支持此操作"),因为这些属性依赖于绝对Uri.

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

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

  • @Nomad我恐怕没有.`HttpUtility.ParseQueryString("/ dir1/dir2/file?a = b&c = d #fragie");`产生两个结果:`/ dir1/dir2/file?a = b`和`c = d#fragment`,其中绝对不是你感兴趣的.你真的只需要传递一个查询字符串. (3认同)

wor*_*yte 6

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

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

HttpUtility.ParseQueryString(url.Split('?').Last())
Run Code Online (Sandbox Code Playgroud)