解析c#中没有协议的URL而不是端口号

时间:2015-12-17 09:02:59

标签: c# asp.net .net

当我使用Uri类来解析网址时,例如client-lb.dropbox.com:443,Uri class无法解析该值并获得正确的结果,例如url.Port:443,url.Host = client-lb.dropbox.com。

 var urlValue = "client-lb.dropbox.com:443";
 var url = new Uri(urlValue);
 Console.WriteLine("Host : {0}, Port {1} ", url.Host, url.Port);

结果:

Host : , Port -1

如何使用Uri类修复此问题?任何建议都表示赞赏..

3 个答案:

答案 0 :(得分:3)

var urlValue = "http://client-lb.dropbox.com:443";
var url = new Uri(urlValue);
Console.WriteLine("Host : {0}, Port {1} ", url.Host, url.Port);

响应:

Host : client-lb.dropbox.com, Port 443 

答案 1 :(得分:0)

网址应该类似于[协议]://主机名:[端口],默认情况下 https 端口为443, http 端口为80。

协议包含有关其默认端口的信息。但是端口无法将它们与协议相关联。

答案 2 :(得分:0)

我已经重新编写了这个解析器,并感谢基础实现的Trotinet项目。

private static void ParseUrl(string url)
        {
            string host = null;
            var port = 123;
            var prefix = 0; 
            if (url.Contains("://"))
            {
                if (url.StartsWith("http://"))
                    prefix = 7; // length of "http://"
                else if (url.StartsWith("https://"))
                {
                    prefix = 8; // length of "https://"
                    port = 443;
                }
                else
                {
                    throw new Exception("Expected scheme missing or unsupported");
                }
            }

            var slash = url.IndexOf('/', prefix);
            string authority = null;
            if (slash == -1)
            {
                // case 1
                authority = url.Substring(prefix);
            }
            else
                if (slash > 0)
                    // case 2
                    authority = url.Substring(prefix, slash - prefix);

            if (authority != null)
            {
                Console.WriteLine("Auth is " + authority);
                // authority is either:
                // a) hostname
                // b) hostname:
                // c) hostname:port

                var c = authority.IndexOf(':');
                if (c < 0)
                    // case a)
                    host = authority;
                else
                    if (c == authority.Length - 1)
                        // case b)
                        host = authority.TrimEnd('/');
                    else
                    {
                        // case c)
                        host = authority.Substring(0, c);
                        port = int.Parse(authority.Substring(c + 1));
                    }
            }
            Console.WriteLine("The Host {0} and Port : {1}", host, port);
        }