URI 문자열이 유효한지 확인하는 방법


82

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를 일치 시키면 예상되는 결과를 얻을 수 있습니다.

답변:


82

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

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

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


질문은 "uri 문자열이 유효한지 (Uri 생성자에 공급할 수 있는지) 어떻게 확인합니까?"입니다.
Manuel

1
TryCreate는 생성자가 문자열을 수락할지 여부를 실제로 알려주지 않습니다. 업데이트를 참조하십시오.
Manuel

@Manuel : 그건 전혀 말이 안 돼요-의 결과 TryCreateUri생성자는 동일해야합니다- UriKind당신이했던 것처럼 전달해보세요 TryCreate.
BrokenGlass 2011 년

1
네가 옳아. 생성자는 기본 종류 Absolute를 사용합니다. 감사.
Manuel

3
.Net 소스에 따르면 IsWellFormedUriString 메서드에는 TryCreate 메서드 호출과 추가 검사가 포함되어 있으므로 이러한 작업에 더 강력한 IsWellFormedUriString 메서드를 사용하는 것을 선호합니다.
Igor Kustov 2015

43

허용되는 답변은 명시적인 예를 제공하지 않으므로 다음은 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...
}

2
Uri.TryCreate 함수를 신뢰하지 마십시오! 이것은 또한 잘못된 URL을 허용합니다. 'http : // http : // google.com/page'(공백 제거)를 시도하십시오. 이 URL은 TryCreate 기능을 전달하지만 잘못되었습니다.
No1Lives4Ever

5
@ No1Lives4Ever 당신이 언급 한 것을 유효한 것으로 해석하는 것이 맞지만 이것은 기술적으로 잘못된 것은 아닙니다. 영어로 된 설명 : http 프로토콜 ( http : // )을 사용하여 명시 적 (그러나 생략 된) 포트 ( http ** : * )를 사용하여 "http"(http : // ** http **)에 대한 DNS 항목에 연결합니다 . *)-프로토콜의 기본값을 가정하겠습니다. 비어있는 첫 번째 수준 폴더 ( http : ** // **)를 제공했지만 의미를 알고 있습니다.;) 경로 세그먼트 "google.com"( http : / ** google.com / **) 다음에 리소스 '페이지'( http://google.com ** 페이지 **)
mlhDev

9

절대 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;
}


1
두 번째 확인은 세 번째 (및 최종) 확인을 가능하게하기 위해 필요합니다. 그것 없이는 tmp. 첫 번째 단계는이 경우 중복 될 수 있습니다 ...
Joe

1

제 경우에는 uri를 테스트하고 싶었고 uri를 테스트하는 응용 프로그램의 속도를 늦추고 싶지 않습니다.

Boolean IsValidUri(String uri){
  return Uri.IsWellFormedUriString(uri, UriKind.Absolute);
}

0

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


UriKind.RelativeOrAbsolute를 사용하고 있으므로 중요하지 않습니다. 어느 쪽이든 UriKind.Relative 또는 UriKind.Absolute에서는 작동하지 않으므로 거기에 운이 없습니다.
Manuel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.