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를 반환 하는 정적 메서드 가 있습니다 ( Uri
true 인 경우 실제 인스턴스).
답변
허용되는 답변은 명시적인 예를 제공하지 않으므로 다음은 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);
}