System.Uri构造函数坚持将%2f序列转义为foward斜杠,当它在URL的路径部分中看到它们时.我怎么能避免这种行为?
我已经看到了这个thig上的Connect票证,但据我所知,解决办法对.net 4不起作用.
它在内部保留原始字符串,例如,以下代码:
Uri u = new Uri("http://www.example.com/path?var=value%2fvalue");
Console.WriteLine(u.OriginalString);
Run Code Online (Sandbox Code Playgroud)
会显示
http://www.example.com/path?var=value%2fvalue
Run Code Online (Sandbox Code Playgroud)
编辑:我已更新最近.NET版本的Connect Link Workaround中的代码.这里是:
// System.UriSyntaxFlags is internal, so let's duplicate the flag privately
private const int UnEscapeDotsAndSlashes = 0x2000000;
private const int SimpleUserSyntax = 0x20000;
public static void LeaveDotsAndSlashesEscaped(Uri uri)
{
if (uri == null)
throw new ArgumentNullException("uri");
FieldInfo fieldInfo = uri.GetType().GetField("m_Syntax", BindingFlags.Instance | BindingFlags.NonPublic);
if (fieldInfo == null)
throw new MissingFieldException("'m_Syntax' field not found");
object uriParser = fieldInfo.GetValue(uri);
fieldInfo = typeof(UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
if (fieldInfo == null)
throw new MissingFieldException("'m_Flags' field not found");
object uriSyntaxFlags = fieldInfo.GetValue(uriParser);
// Clear the flag that we don't want
uriSyntaxFlags = (int)uriSyntaxFlags & ~UnEscapeDotsAndSlashes;
uriSyntaxFlags = (int)uriSyntaxFlags & ~SimpleUserSyntax;
fieldInfo.SetValue(uriParser, uriSyntaxFlags);
}
Run Code Online (Sandbox Code Playgroud)
当然,这是一个黑客,所以你应该冒风险使用它:-)