使用ConfigurationValidator或其他验证程序验证Uri

时间:2010-01-15 01:23:36

标签: .net validation uri

在配置文件的自定义配置部分中,我希望有属性或元素为服务端点定义新方案,主机和端口,但不定义路径。 因此,应允许这些https://newhost/http://newhost:800,而不是newhost:800http://newhost/path/to/service

实施的最佳选择是什么?

感觉Uri.Parse,UriParser应该有一个很好的超载,这将使它变得容易。我错过了一个UriValidator吗?或者正则表达式是最好的选择(以便它可以轻易地禁止该路径)?

请注意,这不是特定于ConfigurationValidator的,因为可以重用的通用验证器很有用。

1 个答案:

答案 0 :(得分:2)

GetLeftPart类的Uri方法始终可以提供帮助。

GetLeftPart Method

GetLeftPart方法从UriPartial系统枚举中获取枚举,其中一个(UriPartial.Authority)将返回:

  

计划和权威部分   URI。

这有效地删除了原始字符串中可能存在的任何无关路径信息,如果提供的Uri不包含有效scheme(即http或https等部分),通常会返回零长度字符串Uri)和/或权威(即在你的例子中,这是Uri的newhost部分。)

从这里开始,你应该能够将GetLLeftPart的调用的返回值与原始的Uri字符串进行比较,如果它们不同,则Uri是“无效的”。如果它们是相同的,则Uri是“有效的”(为了您的目的)。

这是一个简单的示例类,它将执行此“验证”,为Uri返回True或False(C#和VB.NET版本):

<强> C#

public static class UriValidator
{
    public static bool IsUriValid(string uri)
    {
        try
        {
            string original_uri = uri;
            if (uri.Substring(uri.Length - 1, 1) == "/")
            {
                original_uri = uri.Substring(0, uri.Length - 1);
            }
            Uri myUri = new Uri(original_uri);
            string new_uri = myUri.GetLeftPart(UriPartial.Authority);
            if (original_uri.ToLower() == new_uri.ToLower())
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch
        {
            return false;
        }            
    }
}

<强> VB.NET

Public Class UriValidator
    Public Shared Function IsUriValid(ByVal uri As String) As Boolean
        Try
            Dim original_uri = uri
            If uri.Substring(uri.Length - 1, 1) = "/" Then
                original_uri = uri.Substring(0, uri.Length - 1)
            End If
            Dim myUri As Uri = New Uri(original_uri)
            Dim new_uri As String = myUri.GetLeftPart(UriPartial.Authority)
            If original_uri.ToLower = new_uri.ToLower Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Return False
        End Try
    End Function
End Class

我使用这个类进行了一个简单的测试:

Console.WriteLine("https://newhost/" + "  " + UriValidator.IsUriValid("https://newhost/"));
Console.WriteLine("http://newhost:800" + "  " + UriValidator.IsUriValid("http://newhost:800"));
Console.WriteLine("newhost:800" + "  " + UriValidator.IsUriValid("newhost:800"));
Console.WriteLine("newhost:" + "  " + UriValidator.IsUriValid("newhost:"));
Console.WriteLine("qwerty:newhost" + "  " + UriValidator.IsUriValid("qwerty:newhost"));
Console.WriteLine("qwerty://newhost" + "  " + UriValidator.IsUriValid("qwerty://newhost"));
Console.WriteLine("qwerty://newhost:800" + "  " + UriValidator.IsUriValid("qwerty://newhost:800"));
Console.WriteLine("http://newhost/path/to/service" + "  " + UriValidator.IsUriValid("http://newhost/path/to/service"));

它提供了以下输出:

  

https://newhost/是的   http://newhost:800真的   newhost:800错误
  newhost:假的   qwerty:newhost False
  qwerty:// newhost True
  qwerty:// newhost:800 True
  http://newhost/path/to/service错误

这似乎是你所追求的!

请注意,像qwerty://newhost这样的Uri仍然验证为True,因为qwerty 可能是您系统上注册的有效协议。如果您只想允许http和/或https,则添加此内容应该是微不足道的。