如何检查一个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。 参考这个