IT박스

필요한 경우 URL에 스키마 추가

itboxs 2020. 11. 27. 07:54
반응형

필요한 경우 URL에 스키마 추가


문자열에서 Uri를 만들려면 다음을 수행하십시오.

Uri u = new Uri("example.com");

그러나 문제는 문자열 (위와 같은)에 프로토콜이 포함되어 있지 않으면 예외가 발생합니다. " Invalid URI: The format of the URI could not be determined."

예외를 피하려면 아래와 같은 프로토콜이 포함 된 문자열을 보호해야합니다.

Uri u = new Uri("http://example.com");

그러나 URL을 입력으로 사용하면 프로토콜이없는 경우 어떻게 추가 할 수 있습니까?
일부 IndexOf / Substring 조작과는 별개로 말입니까?

우아하고 빠른 것?


다음을 사용할 수도 있습니다 UriBuilder.

public static Uri GetUri(this string s)
{
    return new UriBuilder(s).Uri;
}

MSDN의 설명 :

이 생성자는 uri에 지정된대로 Fragment, Host, Path, Port, Query, Scheme 및 Uri 속성이 설정된 UriBuilder 클래스의 새 인스턴스를 초기화합니다.

uri가 체계를 지정하지 않으면 체계의 기본값은 "http :"입니다.


URL을 확인하지 않고 스키마 만 추가하려는 경우 가장 빠르고 쉬운 방법은 문자열 조회를 사용하는 것입니다. 예 :

string url = "mydomain.com";
if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) url = "http://" + url;

더 나은 방법은 다음 방법을 사용 Uri하여 URL을 확인하는 데 사용하는 TryCreate것입니다.

string url = "mydomain.com";
Uri uri;
if ((Uri.TryCreate(url, UriKind.Absolute, out uri) || Uri.TryCreate("http://" + url, UriKind.Absolute, out uri)) &&
    (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))
{
    // Use validated URI here
}

@JanDavidNarkiewicz가 주석에서 지적했듯이 Scheme포트가 스키마없이 지정 될 때 유효하지 않은 스키마를 방지하기 위해를 유효성 검사하는 것이 필요합니다 mydomain.com:80.


내 솔루션은 protocall-less URL이 protocal이 정규식인지 확인하는 것입니다.

Regex.Replace(s, @"^\/\/", "http://");

localhost : 8800 또는 이와 유사한 항목을 입력 할 수있는 레거시 허용이있는 특정 사례가있었습니다. 이는 우리가 그것을 파싱해야한다는 것을 의미합니다. 우리는 URI를 매우 느슨하게 지정할 수있는 가능성을 분리하는 좀 더 정교한 ParseUri 메서드를 만들었지 만 사람들이 비표준 체계 (때로는 사람들이 그렇게하기 때문에 IP-long 표기법으로 호스트도 지정)를 지정할 때도 포착했습니다.

UriBuilder와 마찬가지로 아무 것도 지정하지 않으면 기본적으로 http 체계가 사용됩니다. 기본 인증이 지정되고 암호가 숫자로만 구성되면 문제가 발생합니다. (해당 커뮤니티를 자유롭게 수정하십시오)

        private static Uri ParseUri(string uri)
        {

            if (uri.StartsWith("//"))
                return new Uri("http:" + uri);
            if (uri.StartsWith("://"))
                return new Uri("http" + uri);

            var m = System.Text.RegularExpressions.Regex.Match(uri, @"^([^\/]+):(\d+)(\/*)", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Singleline);
            if (m.Success)
            {
                var port = int.Parse(m.Groups[2].Value);
                if (port <= 65535) //part2 is a port (65535 highest port number)
                    return new Uri("http://" + uri);
                else if (port >= 16777217) //part2 is an ip long (16777217 first ip in long notation)
                    return new UriBuilder(uri).Uri;
                else
                    throw new ArgumentOutOfRangeException("Invalid port or ip long, technically could be local network hostname, but someone needs to be hit on the head for that one");
            }
            else
                return new Uri(uri);
        }

참고 URL : https://stackoverflow.com/questions/5289739/add-scheme-to-url-if-needed

반응형