Uri文字列が有効であることをどのように確認しますか(それをUriコンストラクタに渡すことができます)?
これまでのところ、私は次のものしか持っていませんが、明白な理由のために、私はそれほど野bruな方法を好まないでしょう:
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コンストラクターは、デフォルトでkind Absoluteを使用します。これは、Uri.TryCreateとコンストラクターを使用しようとしたときに矛盾を引き起こしていました。コンストラクターとTryCreateの両方でUriKindを一致させると、期待どおりの結果が得られます。
整形式のURIは、特定のRFCに準拠していることを意味します。例のローカルパスはこれらに準拠していません。詳細は IsWellFormedUriString
のドキュメントをご覧ください。
そのメソッドからの偽の結果は、Uri
クラスが入力を解析できないことを意味しません。 URI入力はRFCに準拠していない場合がありますが、有効なURIである可能性があります。
Update:そしてあなたの質問に答えるために-Uriドキュメントが示すように、 TryCreate
と呼ばれる静的メソッドがあります=それはあなたが望むものを正確に試行し、trueまたはfalseを返します(trueの場合は実際のUri
インスタンス)。
受け入れられた答えは明示的な例を提供していないため、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引数はファイルの場所を参照する絶対パスであるため、メソッドのドキュメントに従ってfalseを返します。 this を参照してください