要从字符串创建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 / Substring操作?
优雅而快速的东西?
答案 0 :(得分:123)
您也可以使用UriBuilder
:
public static Uri GetUri(this string s)
{
return new UriBuilder(s).Uri;
}
来自MSDN的评论:
此构造函数初始化UriBuilder类的新实例,其中包含uri中指定的Fragment,Host,Path,Port,Query,Scheme和Uri属性。
如果uri未指定方案,则方案默认为" http:"。
答案 1 :(得分:7)
如果您只想添加方案而不验证URL,最快/最简单的方法是使用字符串查找,例如:
string url = "mydomain.com";
if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) url = "http://" + url;
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
。
答案 2 :(得分:3)
我的解决方案是针对无协议网址,以确保他们的协议是正则表达式:
Regex.Replace(s, @"^\/\/", "http://");
答案 3 :(得分:2)
有趣的是,尽管Uri
和UriBuilder
完全不用任何方案就可以处理任何url,但是WebProxy
做到了。
因此只需致电:
new WebProxy(proxy.ProxyServer).Address
答案 4 :(得分:0)
在某些特定情况下,有一定的遗留津贴可用于输入内容,例如: 本地主机: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);
}