Wie überprüfen Sie, ob eine Uri-Zeichenfolge gültig ist (dass Sie sie dem Uri-Konstruktor zuführen können)?
Bisher habe ich nur Folgendes, aber aus offensichtlichen Gründen würde ich einen weniger brutalen Weg bevorzugen:
Boolean IsValidUri(String uri)
{
try
{
new Uri(uri);
return true;
}
catch
{
return false;
}
}
Ich habe Uri.IsWellFormedUriString ausprobiert, aber es scheint nicht alles zu gefallen, was Sie auf den Konstruktor werfen können. Zum Beispiel:
String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));
Die Ausgabe wird sein:
Uri.IsWellFormedUriString says: False
IsValidUri says: True
Update / Antwort
Der Uri-Konstruktor verwendet standardmäßig die Art Absolute. Dies verursachte eine Diskrepanz, als ich versuchte, Uri.TryCreate und den Konstruktor zu verwenden. Sie erhalten das erwartete Ergebnis, wenn Sie sowohl für den Konstruktor als auch für TryCreate mit UriKind übereinstimmen.
TryCreate
und derUri
Konstruktor sollten identisch sein - versuchen Sie, das zu übergeben, wofürUriKind
Sie es getan habenTryCreate
.Da die akzeptierte Antwort kein explizites Beispiel enthält, finden Sie hier einen Code zum Überprüfen von URIs in C #:
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... }
quelle
Angenommen, wir möchten nur absolute URI- und HTTP-Anforderungen unterstützen, dann ist hier eine Funktion, die das tut, was Sie wollen:
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; }
quelle
tmp
. Der erste Schritt ist in diesem Fall wohl überflüssig ...In meinem Fall wollte ich nur den Uri testen, ich möchte die Anwendung, die den Uri testet, nicht verlangsamen.
Boolean IsValidUri(String uri){ return Uri.IsWellFormedUriString(uri, UriKind.Absolute); }
quelle
In Ihrem Fall ist das uri-Argument ein absoluter Pfad, der sich auf einen Dateispeicherort bezieht, sodass gemäß dem Dokument der Methode false zurückgegeben wird. Beziehen Sie sich darauf
quelle