C# 如何检查uri字符串是否有效
如何检查uri字符串是否有效(是否可以将其提供给uri构造函数) 到目前为止,我只有以下几点,但出于明显的原因,我更喜欢不那么野蛮的方式:C# 如何检查uri字符串是否有效,c#,.net,uri,C#,.net,Uri,如何检查uri字符串是否有效(是否可以将其提供给uri构造函数) 到目前为止,我只有以下几点,但出于明显的原因,我更喜欢不那么野蛮的方式: Boolean IsValidUri(String uri) { try { new Uri(uri); return true; } catch { return false;
Boolean IsValidUri(String uri)
{
try
{
new Uri(uri);
return true;
}
catch
{
return false;
}
}
我尝试了Uri.IsWellFormedUriString,但它似乎不喜欢您可以在构造函数中抛出的所有内容。例如:
String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));
输出将是:
Uri.IsWellFormedUriString says: False
IsValidUri says: True
更新/回答
Uri构造函数默认使用绝对类。当我尝试使用Uri.TryCreate和构造函数时,这导致了不一致。如果将构造函数和TryCreate的UriKind都匹配,则会得到预期结果。在您的示例中,uri参数是一个指向文件位置的绝对路径,因此根据方法的文档,它返回false。请参阅格式良好的URI意味着符合某些RFC。示例中的本地路径与这些路径不一致。请阅读文档中的更多内容 该方法的错误结果并不意味着
Uri
类将无法解析输入。虽然URI输入可能不符合RFC,但它仍然可以是有效的URI
更新:为了回答您的问题-正如Uri文档所示,有一个名为的静态方法,它将尝试您想要的内容并返回true或false(如果为true,则返回实际的
Uri
实例)。因为接受的答案没有提供明确的示例,下面是一些验证C#中URI的代码:
假设我们只想支持绝对URI和HTTP请求,下面是一个函数,它可以满足您的需要:
public static bool IsValidURI(string uri)
{
if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
return false;
Uri tmp;
if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
return false;
return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}
在我的例子中,我只是想测试uri,我不想减慢测试uri的应用程序的速度
Boolean IsValidUri(String uri){
return Uri.IsWellFormedUriString(uri, UriKind.Absolute);
}
试试看:
private bool IsValidURI(string uri)
{
string Try = "http://" + uri;
string domain = Try.Split('.').Last();
if (domain == Try)
return false;
return true;
}
我用的是UriKind.RelativeOrAbsolute,所以没关系。无论哪种方式,它都不适用于UriKind.Relative或UriKind.Absolute,因此在这方面没有运气。问题是“如何检查uri字符串是否有效(是否可以将其提供给uri构造函数)?”TryCreate不会真正告诉您构造函数是否接受字符串。请参阅更新。@Manuel:这根本没有意义-TryCreate和
Uri
构造函数的结果应该是相同的-尝试传递UriKind
,就像你对TryCreate
所做的那样。你是对的。构造函数使用默认的绝对类。谢谢。根据.Net消息来源,因此我更喜欢使用IswellFormedUrString方法,因为它对于此类任务更强大。不要信任Uri.TryCreate函数!这也将允许错误的URL。试试这个“http://http://google.com/page”(删除空格)。此URL通过TryCreate函数,但它是错误的。@no1lives4如果您正确地认为它将您提到的内容解析为有效内容,但从技术上讲这是正确的。英文解释:使用http协议(http://),使用显式(但省略的)端口(**:**)连接到“http”(http://**http**)的DNS条目-因此我将假定该协议的默认值;您提供了一个空的第一级文件夹(:***/**),但我知道您的意思;)然后是路径段“google.com”(**google.com/**),然后是资源“页面”(**page**),根据.Net来源,需要进行第二次检查,以使第三次(也是最后一次)检查成为可能。没有它,就没有tmp
。在这种情况下,第一步可能是多余的。。。
private bool IsValidURI(string uri)
{
string Try = "http://" + uri;
string domain = Try.Split('.').Last();
if (domain == Try)
return false;
return true;
}