Проверьте Uri с помощью ConfigurationValidator или другого средства проверки - PullRequest
1 голос
/ 15 января 2010

В пользовательском разделе конфигурации файла конфигурации я хочу, чтобы свойства или элементы определяли новую схему, хост и порт для конечной точки службы, но не определяли путь. Таким образом, они должны быть разрешены https://newhost/ или http://newhost:800, но не newhost:800, http://newhost/path/to/service.

Какой вариант лучше всего реализовать?

Такое чувство, что должна быть хорошая перегрузка Uri.Parse, UriParser, которая облегчила бы это. Есть ли UriValidator, который я пропустил? Или регулярное выражение будет лучшим вариантом (чтобы можно было легко запретить путь)?

Обратите внимание, что это не относится к ConfigurationValidator, так как общий валидатор, который можно использовать повторно, будет полезен.

1 Ответ

2 голосов
/ 15 января 2010

Здесь всегда может помочь метод GetLeftPart класса Uri.

Метод GetLeftPart

Метод GetLeftPart берет перечисление из системного перечисления UriPartial , одно из которых (UriPartial.Authority) вернет:

Схема и полномочия сегментов URI.

Это эффективно удаляет любую постороннюю информацию о пути, которая может быть в исходной строке, и обычно возвращает строку нулевой длины, если предоставленный Uri не содержит действительной схемы (то есть http или https и т. Д. . части Uri) и / или авторитет (т.е. в вашем примере это newhost часть Uri).

Отсюда вы сможете сравнить возвращаемое значение вызова с GetLLeftPart с исходной строкой Uri, и если они различаются, Uri является «недействительным». Если они одинаковые, Uri является «действительным» (для ваших целей).

Вот простой пример класса, который будет выполнять эту «проверку», возвращая True или False для Uri (версии 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/ True
http://newhost:800 True
newhost: 800 False
newhost: False
qwerty: newhost False
qwerty: // newhost True
qwerty: // newhost: 800 True
http://newhost/path/to/service Ложь

что похоже на то, что вы ищете!

Обратите внимание, что Uri, как qwerty://newhost, по-прежнему проверяется как True, так как qwerty может быть действительным протоколом, зарегистрированным в вашей системе. Если вы хотите разрешить http и / или https, добавить это просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...