当我使用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类修复此问题?任何建议都表示赞赏..
答案 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);
}