Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查uri字符串是否有效_C#_.net_Uri - Fatal编程技术网

C# 如何检查uri字符串是否有效

C# 如何检查uri字符串是否有效,c#,.net,uri,C#,.net,Uri,如何检查uri字符串是否有效(是否可以将其提供给uri构造函数) 到目前为止,我只有以下几点,但出于明显的原因,我更喜欢不那么野蛮的方式: Boolean IsValidUri(String uri) { try { new Uri(uri); return true; } catch { return false;

如何检查uri字符串是否有效(是否可以将其提供给uri构造函数)

到目前为止,我只有以下几点,但出于明显的原因,我更喜欢不那么野蛮的方式:

    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;
    }