如果需要,请将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://");