如何检查一个uristring是否有效

你如何检查一个uristring是否有效(你可以将它提供给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构造函数默认使用绝对types。 当我尝试使用Uri.TryCreate和构造函数时,这导致了一个差异。 如果您将UriKind同时用于构造函数和TryCreate,您将获得预期的结果。

谢谢,

格式良好的URI意味着符合某些RFC。 你的例子中的本地path不符合这些。 阅读更多的IsWellFormedUriString文档。

该方法的错误结果并不意味着Uri类将不能parsinginput。 尽pipeURIinput可能不符合RFC,但它仍然可以是有效的URI。

更新 :为了回答你的问题 – 正如Uri文档所显示的那样,有一个名为TryCreate的静态方法,它将尝试你想要的并返回true或false(以及真实的Uri实例)。

由于接受的答案没有提供一个明确的例子,下面是一些validationC#中的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请求,这里是一个你想要的function:

 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参数是一个指向文件位置的绝对path,所以根据方法的文档返回false。 参考这个