如果需要,请将scheme添加到URL

要从string创build一个Uri,你可以这样做:

Uri u = new Uri("example.com"); 

但问题是,如果string(如上面的那样)不包含协议,你将得到一个exception:“ Invalid URI: The format of the URI could not be determined.

为了避免这个exception,你应该保证string包含一个协议,如下所示:

 Uri u = new Uri("http://example.com"); 

但是如果你把url作为input,那么如果添加的协议不存在,怎么样?
我的意思是除了一些IndexOf /子string操作?

一些优雅和快速的东西?

你也可以使用UriBuilder

 public static Uri GetUri(this string s) { return new UriBuilder(s).Uri; } 

来自MSDN的评论:

这个构造函数使用uri中指定的Fragment,Host,Path,Port,Query,Scheme和Uri属性来初始化一个UriBuilder类的新实例。

如果uri没有指定scheme,则scheme默认为“http:”。

如果你只是想添加scheme,而不validationurl,最快/最简单的方法是使用string查找,例如:

 string url = "mydomain.com"; if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) url = "http://" + url; 

更好的方法是使用Uri来validationURL使用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指定端口的情况下,validation该Scheme是必要的,以防止无效的scheme,例如mydomain.com:80

我的解决scheme是没有protocall的url,以确保他们有protocal是正则expression式:

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