如果需要,将方案添加到URL

时间:2011-03-13 13:43:56

标签: c# .net uri

要从字符串创建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操作?

优雅而快速的东西?

5 个答案:

答案 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;

更好的方法是使用Uri使用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

答案 2 :(得分:3)

我的解决方案是针对无协议网址,以确保他们的协议是正则表达式:

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

答案 3 :(得分:2)

有趣的是,尽管UriUriBuilder完全不用任何方案就可以处理任何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);
        }