當在URL的路徑部分看到它們時,System.Uri構造函數堅持將%2f序列作爲正斜線來避開。我怎麼能避免這種行爲?如何使System.Uri不在路徑中使用unescape%2f(斜槓)?
我已經看到Connect門票在這thig,但解決方法是不工作的。NET 4據我所知。
當在URL的路徑部分看到它們時,System.Uri構造函數堅持將%2f序列作爲正斜線來避開。我怎麼能避免這種行爲?如何使System.Uri不在路徑中使用unescape%2f(斜槓)?
我已經看到Connect門票在這thig,但解決方法是不工作的。NET 4據我所知。
它保持了原始的字符串內部,例如,下面的代碼:
Uri u = new Uri("http://www.example.com/path?var=value%2fvalue");
Console.WriteLine(u.OriginalString);
將顯示
http://www.example.com/path?var=value%2fvalue
編輯:我有更新的Connect Link Workaround發現最近的代碼。 NET版本。那就是:
// 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);
}
當然,這是一個黑客,所以你應該在你自己的風險,使用它:-)
類似問題的解決方案是,但'new Uri(「http://www.example.com/value%2fvalue」).ToString()'產生'「http://www.example.com/value/value」'。我應該編輯問題 - 謝謝你的提示。 – 2011-04-25 18:05:56
完全偏離主題,但感謝您在HAP上的工作。已經使用了很長時間了。 – 2011-04-25 18:08:00
@Artem - 謝謝:-)。對於Uri,我認爲它是按照RFC 3986設計的100%。但PATH部分或QUERY部分中的註釋值%2fval處理的處理方式不同。你也可以使用uri.GetComponents(UriComponents.SerializationInfoString,UriFormat.SafeUnescaped)來「接近」原始字符串(PATH部分除外)。 – 2011-04-26 06:08:08
嘗試URI.EscapeUriString
構建新的URI之前。它使得%2F
看起來像%252F
,在我的情況下工作得很好。
正如我曾經參與過this question,您可以通過配置禁用此行爲:
<configuration>
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/>
</schemeSettings>
</uri>
</configuration>
http://stackoverflow.com/a/18511985/420849 - 這是在PowerShell中 – Boo 2013-08-29 13:16:46