8

次のテストでは、なぜ(のみ)最後のテストが失敗するのですか?

    [Fact]
    public void IsWellFormedUriString_AbsolutNonHashTagUri_ReturnsTrue()
    {
        Assert.True(Uri.IsWellFormedUriString("http://www.RegularSite.org/Home", UriKind.Absolute));
    }

    [Fact]
    public void IsWellFormedUriString_RelativeNonHashTagUri_ReturnsTrue()
    {
        Assert.True(Uri.IsWellFormedUriString("Home", UriKind.Relative));
    }

    [Fact]
    public void IsWellFormedUriString_AbsolutHashTagUri_ReturnsTrue()
    {
        Assert.True(Uri.IsWellFormedUriString("http://www.w3.org/#!Home", UriKind.Absolute));
    }

    [Fact]
    public void IsWellFormedUriString_RelativeHashTagUri_ReturnsTrue()
    {
        // Fails!
        Assert.True(Uri.IsWellFormedUriString("#!Home", UriKind.Relative));
    }

の絶対バージョンでハッシュバンUriを認識する場合は、相対バージョンではどうでしょうか。私は何が欠けていますか?IsWellFormedUriString

注:これは役に立ちません。

4

1 に答える 1

3

これが期待どおりに機能しない理由は、ハッシュバングがURI スキームの一部ではないためです。メソッドは URI 形式の階層部分を想定しており、ハッシュ マーク (およびその後のハッシュバング) は、相対パスおよび絶対パスが決定される階層部分のメンバーではありません。

< >は必須部品です
[ ]はオプション部品です

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

絶対URIの例として; 私が間違っていなければ、フラグメントとハッシュマークを含むクエリは無視されます

http://domain.com/path/to/something/?query=1#fragment

ここにあなたのためのいくつかの追加情報もあります。Uri.IsWellFormedUriString()これはすべて、メソッドを説明する MSDN からのものです。

文字列を使用して URI の構築を試みることにより、文字列が適切な形式であるかどうかを示し、文字列がさらにエスケープする必要がないことを確認します。

備考:

デフォルトでは、文字列はRFC 2396およびRFC 2732に従って整形式であると見なされます。国際リソース識別子 (IRI) または国際化ドメイン名 (IDN) の解析が有効になっている場合、文字列はRFC 3986およびRFC 3987に従って整形式であると見なされます。

次の条件のいずれかが発生した場合、文字列の形式が不適切であると見なされ、メソッドが false を返します。

以下は、いくつかの失敗の例です。

http://www.contoso.com/path???/file name
文字列が正しくエスケープされていません。

c:\directory\filename
文字列は、暗黙的なファイル URI を表す絶対 URI です。

file://c:/directory/filename
文字列は、パスの前にスラッシュがない絶対 URI です。

http:\host/path/file
スラッシュとして扱われる場合でも、文字列にはエスケープされていないバックスラッシュが含まれています

www.contoso.com/path/file
文字列は階層型の絶対 URI を表し、"://" は含まれません

于 2012-09-01T00:38:24.693 に答える