Как получить доступ к свойствам Uri, определенным с помощью UriKind.Relative - PullRequest
0 голосов
/ 19 сентября 2018

Мой метод получает URI в виде строки и пытается проанализировать его в предсказуемом и согласованном формате.Входящий URL может быть абсолютным (http://www.test.com/myFolder) или относительным (/ myFolder). Абсолютные URI достаточно просты для работы, но я столкнулся с некоторыми камнями преткновения, работая с относительными. Наиболее примечательным является тот факт, что хотяконструктор для Uri позволяет вам назначить относительный URI, используя UriKind.Relative (или UriKind.RelativeOrAbsolute), при этом у него нет доступных свойств.

В частности, он выбрасывает этоисключение: System.InvalidOperationException : This operation is not supported for a relative URI.

Имеет смысл, что вы не сможете получить доступ, скажем, к свойствам Scheme или Authority - хотя кажется странным, что они фактически выдают недопустимые исключения операций вместопросто возвращает пустые строки - но даже такие свойства, как PathAndQuery или Fragment демонстрируют то же поведение. Фактически, практически единственными свойствами, которые не выдают исключения для относительных URI, являются флаги IsX и OriginalString,которая в первую очередь показывает строку, которую вы передали объекту.

Учитывая, что этот конструктор явно позволяет вамявляются относительными URI, все это выглядит как недоразумение.Есть что-то, чего я здесь не хватает? Есть ли способ обрабатывать относительные URI как их составные части, или мне просто нужно рассматривать его как строку? Я полностью не понимаю, что означает в этом случае «относительный URI»?

Для репликации:

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

Visual Studio Pro 2015, .NET 4.5.2 (если что-то из этого имеет значение)

1 Ответ

0 голосов
/ 19 сентября 2018

По замыслу, исключение выдается при доступе, например.PathAndQuery для относительного URI, см. исходный код URI .

В качестве довольно быстрого и грязного обходного пути для анализа некоторых сегментов, вы можете создать временный абсолютный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...