Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net Net上有URL验证程序吗?_.net_Asp.net_Asp.net Mvc_Validation_Url - Fatal编程技术网

.net Net上有URL验证程序吗?

.net Net上有URL验证程序吗?,.net,asp.net,asp.net-mvc,validation,url,.net,Asp.net,Asp.net Mvc,Validation,Url,有没有一种方法可以验证.Net、ASP.Net或ASP.Net MVC中的URL?比使用try/catch功能更快(可能)的方法是使用Regex。如果您必须验证1000个URL,那么多次捕获异常会很慢 static bool IsValidUri(string urlString) { try { new Uri(urlString); return true; } catch { return false; } } 以下是-使用谷歌查找更

有没有一种方法可以验证.Net、ASP.Net或ASP.Net MVC中的URL?

比使用try/catch功能更快(可能)的方法是使用Regex。如果您必须验证1000个URL,那么多次捕获异常会很慢

static bool IsValidUri(string urlString) {
   try {
      new Uri(urlString);
      return true;
   } catch {
      return false;
   }
}
以下是-使用谷歌查找更多信息。

您可以使用验证URL:

public bool IsValidUri(string uri)
{
    Uri validatedUri;
    return Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out validatedUri);
}

注释表明
TryCreate
只是将异常处理向下移动了一级。但是,我检查了源代码,发现情况并非如此。
TryCreate
中没有try/catch,它使用一个不应该抛出的自定义解析器

您可以使用Uri.iswellFormedUrString,无需为此创建自己的函数:

public static bool IsWellFormedUriString(string uriString, uriKind uriKind);
uriKind可以是:

UriKind.RelativeOrAbsolute 
UriKind.Absolute
UriKind.Relative

有关更多信息,请参阅:

提供的答案不检查方案,允许各种不必要的输入,这可能使您容易受到javascript注入的攻击(请参阅Cloudlessky的评论)

URI只是对象的唯一标识。“C:\Test”是有效的URI

在我的项目中,我使用了以下代码:

/// <summary>
/// Validates a URL.
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private bool ValidateUrl(string url)
{
    Uri validatedUri;

    if (Uri.TryCreate(url, UriKind.Absolute, out Uri validatedUri)) //.NET URI validation.
    {
        //If true: validatedUri contains a valid Uri. Check for the scheme in addition.
        return (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps);
    }
    return false;
}
//
///验证URL。
/// 
/// 
/// 
私有bool ValidateUrl(字符串url)
{
urivalidateduri;
if(Uri.TryCreate(url,UriKind.Absolute,out-Uri-validatedUri))//.NET Uri验证。
{
//如果为true:ValidateURI包含有效的Uri。另外,请检查方案。
返回(validatedUri.Scheme==Uri.UriSchemeHttp | | validatedUri.Scheme==Uri.UriSchemeHttps);
}
返回false;
}

定义您将允许的方案并相应地更改代码。

以防您需要Arjan提供的VB.Net中的漂亮代码

    'Validates a URL.
    Function ValidateUrl(url As String) As Boolean
        Dim validatedUri As Uri = Nothing
        If (Uri.TryCreate(url, UriKind.Absolute, validatedUri)) Then
            Return (validatedUri.Scheme = Uri.UriSchemeHttp Or validatedUri.Scheme = Uri.UriSchemeHttps)
        End If
        Return False
    End Function

不知何故,我对此表示怀疑。正则表达式,甚至编译也不是特别快。即使您可以编写一个精确的.Kris-也许您不了解抛出异常的代价有多高-如果在大循环中执行,它们的速度非常慢。RichardOD-您列出的示例正则表达式适用于某些URL,但在以下100%有效URL上失败。就像我说的,很难做到正确。我想如果性能是一个问题,你可以使用正则表达式作为第一个方法。如果正则表达式失败,则切换到Uri.TryCreate。当我使用Regex时,我通常会编写一系列单元测试来检查边缘情况。虽然它只是将try/catch再往下埋一层,你不必看到它。我只是为这个&Mehrdad的方法做了一个简单的性能测试循环1000次,只使用了一个无效的url,发现这一个要快很多(快8000X)。如果有人想更详细(多个URL等),我会对其他一些结果感兴趣。这与使用不同吗?警告:这种类型的验证所考虑的一点是javascript注入:
javascript:alert('hacked')
。因此,检查javascript协议非常重要!这个响应被高估了,你放的任何东西比如“qwerty”都会被验证为Url,因为这个方法实际上不会检查Url。请参见@Arjan answer,搜索真正的url验证的人。+1,这是最好的答案,也是唯一真正回答“如何验证url”(url!)问题的答案!。