При необходимости добавьте схему в URL
чтобы создать Uri из строки, вы можете сделать это:
Uri u = new Uri("example.com");
но проблема в том, что если строка (как и выше) не содержит протокол, вы получите исключение:"Invalid URI: The format of the URI could not be determined.
"
чтобы избежать исключения, вы должны защитить строку включает в себя протокол, как показано ниже:
Uri u = new Uri("http://example.com");
но если вы берете url в качестве входных данных, как вы можете добавить протокол, если он отсутствует?
я имею в виду, кроме некоторых IndexOf / подстроки манипуляции?
что-то элегантное и быстро?
3 ответа:
вы также можете использовать
UriBuilder
:public static Uri GetUri(this string s) { return new UriBuilder(s).Uri; }
замечания от MSDN:
этот конструктор инициализирует новый экземпляр класса UriBuilder с фрагментом, хостом, путем, портом, запросом, схемой и свойствами Uri, заданными в uri.
если uri не указывает схему, Схема по умолчанию имеет значение " http:".
если вы просто хотите добавить схему, не проверяя URL, самый быстрый / простой способ-использовать поиск строк, например:
string url = "mydomain.com"; if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) url = "http://" + url;
лучше использовать
Uri
чтобы также проверить URL с помощьюTryCreate
способ:string url = "mydomain.com"; Uri uri; if ((Uri.TryCreate(url, UriKind.Absolute, out uri) || Uri.TryCreate("http://" + url, UriKind.Absolute, out uri)) && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)) { // Use validated URI here }
как указал @JanDavidNarkiewicz в комментариях, проверяя
Scheme
необходимо защищать от недопустимых схем, когда порт указан без схемы, напримерmydomain.com:80
.