Мой метод получает 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 (если что-то из этого имеет значение)