2011-04-25 72 views

回答

5

它保持了原始的字符串內部,例如,下面的代碼:

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); 
} 

當然,這是一個黑客,所以你應該在你自己的風險,使用它:-)

+0

類似問題的解決方案是,但'new Uri(「http://www.example.com/value%2fvalue」).ToString()'產生'「http://www.example.com/value/value」'。我應該編輯問題 - 謝謝你的提示。 – 2011-04-25 18:05:56

+0

完全偏離主題,但感謝您在HAP上的工作。已經使用了很長時間了。 – 2011-04-25 18:08:00

+1

@Artem - 謝謝:-)。對於Uri,我認爲它是按照RFC 3986設計的100%。但PATH部分或QUERY部分中的註釋值%2fval處理的處理方式不同。你也可以使用uri.GetComponents(UriComponents.SerializationInfoString,UriFormat.SafeUnescaped)來「接近」原始字符串(PATH部分除外)。 – 2011-04-26 06:08:08

1

嘗試URI.EscapeUriString構建新的URI之前。它使得%2F看起來像%252F,在我的情況下工作得很好。

2

正如我曾經參與過this question,您可以通過配置禁用此行爲:

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 
相關問題