如何访问用UriKind.Relative定义的Uri属性

时间:2018-09-19 19:25:29

标签: c# uri

我的方法接收URI作为字符串,并尝试将其解析为可预测且一致的格式。传入URL可以是绝对(http://www.test.com/myFolder)或相对(/ myFolder)。绝对URI很容易使用,但是我遇到了一些使用相对URI的绊脚石。最值得注意的事实是,尽管Uri的构造函数允许您使用UriKind.Relative(或UriKind.RelativeOrAbsolute)来指定相对URI,但当您使用该属性时似乎没有任何可用的属性。做这个。

具体地说,它引发了以下异常:System.InvalidOperationException : This operation is not supported for a relative URI.

有意义的是,您将无法访问SchemeAuthority属性-尽管看起来奇怪的是它们实际上抛出了无效的操作异常,而不是仅仅返回空白字符串-但即使PathAndQueryFragment之类的属性也表现出相同的行为。实际上,几乎不对相对URI引发异常的唯一属性是IsX标志和OriginalString,它们仅显示您最初传递给对象的字符串。 / p>

鉴于该构造函数明确允许您声明一个相对URI,这一切似乎令人困惑。我在这里想念什么吗? 有没有办法将相对URI作为它们的组成部分来处理,或者我只需要将其视为字符串?在这种情况下,我是否完全无法理解“相对URI”的含义?

要复制:

var uri = new Uri("/myFolder");
string foo = uri.PathAndQuery; // throws exception

Visual Studio Pro 2015, .NET 4.5.2(如果有任何不同)

1 个答案:

答案 0 :(得分:0)

根据设计,访问例如时会引发异常。 PathAndQuery以获得相对的uri,请参阅uri source code

作为解析某些段的一种相当快捷和肮脏的解决方法,您可以使用一个忽略的虚拟基本uri(方案和主机),从相对的段中构造一个临时的绝对uri。

String url = "/myFolder?bar=1#baz";
Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);

if (!uri.IsAbsoluteUri)
{
    Uri baseUri = new Uri("http://foo.com");
    uri = new Uri(baseUri, uri);
}

String pathAndQuery = uri.PathAndQuery; // /myFolder?bar=1
String query = uri.Query; // ?bar=1
String fragment = uri.Fragment; // #baz