C# 如何在没有uri字符串的情况下从uri字符串获取方案?

C# 如何在没有uri字符串的情况下从uri字符串获取方案?,c#,string,http,https,C#,String,Http,Https,我想从一个简单的DNS字符串中获得正确的方案。我怎样才能在C#中做到这一点 例如: 我有这个:google.com 我想得到这个:https://www.google.com 但是其他一些网站是这样的:msn.com 我想得到这个:http://www.msn.com除非您有一个通用主机名及其协议的数据库,否则您无法执行此操作。URL具有协议、主机和路径。例如,http://google.com/告诉您它的协议是http,它的主机是google.com,路径是/ http有非标准约定,即ww

我想从一个简单的DNS字符串中获得正确的方案。我怎样才能在C#中做到这一点


例如:

我有这个:
google.com

我想得到这个:
https://www.google.com


但是其他一些网站是这样的:
msn.com


我想得到这个:
http://www.msn.com

除非您有一个通用主机名及其协议的数据库,否则您无法执行此操作。URL具有协议、主机和路径。例如,
http://google.com/
告诉您它的协议是
http
,它的主机是
google.com
,路径是
/

http有非标准约定,即www
www.x.com
表示
http://www.x.com/
而1999年起的
x.com
意味着
http://x.com/
(但不是
http://wwww.x.com/
因此它需要一个DNS条目)

有了这个逻辑,
google.com
就变成了
http://google.com/
msn.com
变成
http://msn.com/

通常,主机会将您重定向到它们作为标准使用的内容。例如在挪威
http://google.com/
将我重定向到
https://www.google.no/
但是你不能从
google.com
假设
https://www.google.no/

我不是C程序员,所以这是一个C兼容的Algol,可能需要一些惯用的修饰:

使用System.Text.regular表达式;
使用制度;
类URL测试
{    
//对于以字母数字开头的任何字符串,返回true
//之前的字符://。
//hasProto(“telnet://x.com“”=>正确
//hasProto(“x.com/test”)=>false
静态bool hasProto(字符串url)
{
返回Regex.IsMatch(url,“^\\w+:/”;
}
//对于包含/的任何字符串,如果
//使用/作为上一个或下一个字符。
//hasPath(“http://x.com“”=>错误
//hasPath(“x.com/”)=>true
静态bool hasPath(字符串url)
{
返回Regex.IsMatch(url,“[^/]/(?:[^/]|$)”;
}
//添加http://if-URL缺少协议和/if-URL缺少路径
静态字符串stringToURL(字符串str)
{
返回(hasProto(str)?“”:“http:/”+
str+
(hasPath(str)?“”:“/”;
}
}

非常有趣的问题;什么定义了“正确的方案”?您可以编写一个逻辑,在443上执行端口检查,如果成功-返回“https:”,然后在80上进行检查,如果成功-返回“http://”;但是a)不能保证那里有任何东西。b) 将导致至少n个地址调用n个。你的用例是什么?回答得很好。嗯,我的用例是针对不知道什么是http和https的端点用户。我想让它自动化:有多少用户?有多少个地址?您的应用程序是否可以不受限制地直接访问internet?在某些情况下,它还必须在代理之后工作吗?许多非技术用户。根据其位置,它可能有无限制。是的,他们中的一些人是在代理的背后工作。regex是什么意思?它是干什么的?@Matinlotfalie,它的缩写。regexp是表示搜索模式的字符串(立体体上的通配符)。现在几乎每种语言都有它们,因为它很有表现力,所以节省了时间。例如,
hasProto
将在
://
之前以字母数字字符开头的任何字符串上返回
True
。例如
telnet://
。请添加我对代码所做的编辑之类的注释。@MatinLotfaliee Done。它被拒绝,因为您在问题(第二条评论)中进行了编辑。