我的方法接收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.
有意义的是,您将无法访问Scheme
或Authority
属性-尽管看起来奇怪的是它们实际上抛出了无效的操作异常,而不是仅仅返回空白字符串-但即使PathAndQuery
或Fragment
之类的属性也表现出相同的行为。实际上,几乎不对相对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(如果有任何不同)
答案 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