Uri对象不一致转义的网址

时间:2018-11-26 17:53:50

标签: c# .net

似乎在.NET 3.5及更低版本以及ASP.NET中,以下URL是未转义的。有办法避免这种行为吗?

    var strUrl = "https://url.com/file%2F.pdf";
    var uri = new Uri(strUrl);
    var strUri = uri.ToString();

    if (strUrl != strUri)
    {
        throw new Exception("bug!"); // Happens in below .NET 4
    }

3 个答案:

答案 0 :(得分:0)

这种行为上的变化(尽管很小)仍然是一个重大变化,这意味着它永远不会在将来的3.5版本中得到修复(是,3.5 SP1 is still under support)。

要解决此问题,您要么必须实施自定义解决方法,要么找到可以为您解决的库或程序包,或者升级到新的.NET版本。

答案 1 :(得分:0)

您可以在将其传递给URI之前使用html解码

答案 2 :(得分:0)

我使用以下代码使用反射找到了.NET 3.5的解决方案:

if (strUrl != uri.ToString())
{
 var fm_Info = typeof(Uri).GetField("m_Info", BindingFlags.NonPublic | BindingFlags.Instance);
 var m_Info = fm_Info.GetValue(uri);
 var tUriInfo = typeof(Uri).GetNestedType("UriInfo", BindingFlags.NonPublic | 
 BindingFlags.Instance);
 var fString = tUriInfo.GetField("String");
 fString.SetValue(m_Info, strUrl);
}

理想情况下,升级.NET版本将是最好的解决方案,但是对于那些不能这样做的人,这可能会有帮助。