При необходимости добавьте схему в 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 57

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.

мое решение было для protocall-менее url, чтобы убедиться, что у них есть protocal было регулярное выражение:

Regex.Replace(s, @"^\/\/", "http://");