Uri.IsWellFormedUriString()对于正确的URL返回false

时间:2017-05-09 13:59:10

标签: c# .net coreclr

我有一个C#(。Net Core 1.1)应用,需要检查网址是否有效。我使用了Uri.IsWellFormedUriString(),它运行得很好,但对下面的这个返回false有疑问。在我看来,URL完全有效吗?

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/Black"
    android:padding="10dp">

    <TextView
        android:id="@+id/artist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:paddingRight="5dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/White"
        android:text="Demo text"
        android:textSize="23px"
        android:textStyle="bold"
        android:typeface="sans" />

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/artist"
        android:layout_marginTop="4dp"
        android:layout_toLeftOf="@+id/play_pause"
        android:ellipsize="end"
        android:text="Hello there"
        android:maxLines="2"
        android:paddingRight="5dp"
        android:textColor="@color/White"
        android:textSize="31px"
        android:textStyle="bold|normal"
        android:typeface="sans" />

    <ImageButton
        android:id="@+id/play_pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:background="@null"
        android:padding="8dp" />
</RelativeLayout>

我在下面的PHP函数中使用了相同的URL,表示URL格式正确:

Uri.IsWellFormedUriString("http://www.test.com/search/Le+Venezuela+b%C3%A9n%C3%A9ficie+d%27importantes+ressources+naturelles+%3A+p%C3%A9trole%2C+gaz%2C+mines", UriKind.Absolute)

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:2)

问题可能是网址被转义了。请尝试使用UnscapeDataString

string urlencoded= "http://www.test.com/search/Le+Venezuela+b%C3%A9n%C3%A9ficie+d%27importantes+ressources+naturelles+%3A+p%C3%A9trole%2C+gaz%2C+mines";
var isWellFormed=Uri.IsWellFormedUriString(
                       Uri.UnescapeDataString(urlencoded), 
                       UriKind.Absolute);

修改

当您使用.net核心时,也许您需要使用System.Net.WebUtility.UrlDecode

答案 1 :(得分:1)

问题是%2C不必要地转义;把它作为逗号,它报告为真。

答案 2 :(得分:1)

这似乎是bug in DotNet.,如果URI既包含Å或like等非ASCII字符又包含任何URI保留字符(! * ' ( ) ; : @ & = + $ , / ? # [ ]),则它似乎总是返回false。如果该保留字符是百分比编码的,它将失败。

这些将通过:

"https://example.com/a"
"https://example.com/a*"
"https://example.com/a%2A"
"https://example.com/*"
"https://example.com/%2A"
"https://example.com/%C3%A5*"
"https://example.com/%E0%B8%95%E0%B8%B1*"

这些将失败:

"https://example.com/%C3%A5%2A"
"https://example.com/%E0%B8%95%E0%B8%B1%2A"

如此有效地,您要么必须去除那些百分比编码的特殊字符,要么找到其他URI检查器,要么等待Microsoft对其进行修复。