[c#] URI 문자열이 유효한지 확인하는 방법

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 생성자는 기본적으로 Absolute 종류를 사용합니다. 이로 인해 Uri.TryCreate 및 생성자를 사용하려고 할 때 불일치가 발생했습니다. 생성자와 TryCreate 모두에 대해 UriKind를 일치 시키면 예상되는 결과를 얻을 수 있습니다.



답변

올바른 형식의 URI는 특정 RFC 준수를 의미합니다. 예제의 로컬 경로가 이것과 일치하지 않습니다. IsWellFormedUriString문서 에서 더 많은 것을 읽으십시오 .

해당 메서드의 결과가 거짓이라고해서 Uri클래스가 입력을 구문 분석 할 수 없음을 의미하지는 않습니다. URI 입력이 RFC를 준수하지 않을 수 있지만 여전히 유효한 URI 일 수 있습니다.

업데이트 : 그리고 귀하의 질문에 대답하기 위해-Uri 문서에서 알 수 있듯이 TryCreate정확히 원하는 것을 시도하고 true 또는 false를 반환 하는 정적 메서드 가 있습니다 ( Uritrue 인 경우 실제 인스턴스).


답변

허용되는 답변은 명시적인 예를 제공하지 않으므로 다음은 C #에서 URI의 유효성을 검사하는 몇 가지 코드입니다.

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
    //Do something with your validated Absolute 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);
}


답변

귀하의 경우 uri 인수는 파일 위치를 참조하는 절대 경로이므로 메서드의 문서에 따라 false를 반환합니다. 이것을 참조하십시오


답변