У нас были некоторые конкретные случаи, когда существовало допущение для ввода таких вещей, как:
localhost: 8800 или аналогичный. Что означает, что нам нужно было разобрать это. Мы создали немного более сложный метод ParseUri, который разделял возможность очень легко указывать URI, но также учитывал время, когда люди указывали нестандартную схему (а также хост в нотации IP-длины, потому что иногда люди так делают)
Так же, как и UriBuilder, по умолчанию будет использоваться схема http, если ни одна из них не указана. Это будет иметь проблемы, если указана базовая аутентификация и пароль состоит только из цифр. (Не стесняйтесь исправлять это сообщество)
private static Uri ParseUri(string uri)
{
if (uri.StartsWith("//"))
return new Uri("http:" + uri);
if (uri.StartsWith("://"))
return new Uri("http" + uri);
var m = System.Text.RegularExpressions.Regex.Match(uri, @"^([^\/]+):(\d+)(\/*)", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Singleline);
if (m.Success)
{
var port = int.Parse(m.Groups[2].Value);
if (port <= 65535) //part2 is a port (65535 highest port number)
return new Uri("http://" + uri);
else if (port >= 16777217) //part2 is an ip long (16777217 first ip in long notation)
return new UriBuilder(uri).Uri;
else
throw new ArgumentOutOfRangeException("Invalid port or ip long, technically could be local network hostname, but someone needs to be hit on the head for that one");
}
else
return new Uri(uri);
}