2009-05-11 11 views
25

उरी वर्ग चूक पालन करने के लिए OpenID और OAuth के लिए प्राप्त करने के लिए, मैं उरी आरएफसी 3986.कैसे Uri.EscapeDataString आरएफसी के साथ आरएफसी 2396. करने के लिए 3986

के अनुरूप बचने System.Uri class documentation से की जरूरत है:

डिफ़ॉल्ट रूप से, यूआरआई में किसी भी आरक्षित वर्ण आरएफसी 2396. के अनुसार फरार हो रहे हैं यह व्यवहार परिवर्तन अंतर्राष्ट्रीय संसाधन पहचानकर्ता या अंतर्राष्ट्रीय डोमेन नाम पार्स सक्षम हो जाता है, जिसमें यूआरआई में मामला सुरक्षित वर्णों RFC 3986 और RFC 3987 के अनुसार फरार हो रहे हैं।

प्रलेखन भी और कहा गया है इस IRI मोड और इस तरह RFC 3986 व्यवहार को सक्रिय करने के लिए एक machine.config uri खंड तत्व जोड़ मतलब यह है कि यह अपने अनुप्रयोग/web.config करने के लिए फ़ाइल:

<configuration> 
    <uri> 
    <idn enabled="All" /> 
    <iriParsing enabled="true" /> 
    </uri> 
</configuration> 

लेकिन यह मौजूद है कि क्या .config फ़ाइल में या नहीं, मुझे एक .NET 3.5 SP1 ऐप के लिए एक ही (गैर-3 9 86) भागने का व्यवहार मिल रहा है। आरएफसी 3986 नियमों का उपयोग करने के लिए मुझे Uri.EscapeDataString प्राप्त करने के लिए और क्या करने की आवश्यकता है? (विशेष रूप से आरक्षित पात्रों के रूप में है कि आरएफसी में परिभाषित से बचने के लिए)

+0

मैंने कुछ समुदाय सामग्री को वाक्यविन्यास उदाहरण में टाइपो को फिर से जोड़ा है। –

+0

मैंने इसे आंतरिक रूप से .NET Framework (मैं एमएसएफटी के लिए काम करता हूं) के साथ एक बग के रूप में दायर किया। वे इसे एक प्रलेखन बग के रूप में स्वीकार करते हैं, क्योंकि वास्तव में यह कॉन्फ़िगरेशन सेटिंग * से बचने के संबंध में यूआरआई कक्षा आरएफसी 3986 की तरह व्यवहार नहीं करती है। –

उत्तर

31

नहीं करने के बाद Uri.EscapeDataString RFC 3986 व्यवहार पर लेने के लिए प्राप्त करने में सक्षम हो गया है, मैं अपने खुद के RFC 3986 अनुरूप बचने विधि लिखा था। यह Uri.EscapeDataString का लाभ उठाता है, और फिर आरएफसी 3986 अनुपालन से बचने के लिए 'उन्नयन' करता है।

/// <summary> 
/// The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. 
/// </summary> 
private static readonly string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" }; 

/// <summary> 
/// Escapes a string according to the URI data string rules given in RFC 3986. 
/// </summary> 
/// <param name="value">The value to escape.</param> 
/// <returns>The escaped value.</returns> 
/// <remarks> 
/// The <see cref="Uri.EscapeDataString"/> method is <i>supposed</i> to take on 
/// RFC 3986 behavior if certain elements are present in a .config file. Even if this 
/// actually worked (which in my experiments it <i>doesn't</i>), we can't rely on every 
/// host actually having this configuration element present. 
/// </remarks> 
internal static string EscapeUriDataStringRfc3986(string value) { 
    // Start with RFC 2396 escaping by calling the .NET method to do the work. 
    // This MAY sometimes exhibit RFC 3986 behavior (according to the documentation). 
    // If it does, the escaping we do that follows it will be a no-op since the 
    // characters we search for to replace can't possibly exist in the string. 
    StringBuilder escaped = new StringBuilder(Uri.EscapeDataString(value)); 

    // Upgrade the escaping to RFC 3986, if necessary. 
    for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++) { 
     escaped.Replace(UriRfc3986CharsToEscape[i], Uri.HexEscape(UriRfc3986CharsToEscape[i][0])); 
    } 

    // Return the fully-RFC3986-escaped string. 
    return escaped.ToString(); 
} 
+2

क्या आपको पता है कि .NET 4.5 वास्तव में अंततः इसे ठीक करता है? http://msdn.microsoft.com/en-us/library/hh367887(v=VS.110).aspx –

+1

मुझे ऐसा विश्वास नहीं है। –

+2

.NET 4.5 ने इसे ठीक कर दिया है। –

0

आप ढांचे के क्या संस्करण का उपयोग कर रहे हैं? ऐसा लगता है कि इनमें से बहुत से परिवर्तन (from MSDN) ".NET Framework 3.5। 3.0 SP1, और 2.0 SP1" टाइमफ्रेम में किए गए थे।

+1

मैंने जोड़ा है कि मैं अपने प्रश्न के लिए .NET 3.5 SP1 का उपयोग कर रहा हूं। मैं कुछ मनोरंजन के साथ ध्यान देता हूं कि एमएसडीएन लेख जो आप लिंक करते हैं, वह खुद के साथ असंगत है, अमान्य एक्सएमएल, उरी और यूरी का उपयोग करने पर अंतरंग रूप से उपयोग किया जाता है जब केस संवेदनशीलता मायने रखती है, और जब मान को "सब" माना जाता है "सत्य" के रूप में, डॉक्टर स्वयं बाद में प्रदर्शित करता है। :) –

-1

मैं एक बेहतर जवाब नहीं मिल सकता है (या तो 100% ढांचे या 100% reimplementation), इसलिए मैं इस abomination बना लिया है। लगता है कि ओथ के साथ काम करना प्रतीत होता है।

class al_RFC3986 
{ 
    public static string Encode(string s) 
    { 
     StringBuilder sb = new StringBuilder(s.Length*2);//VERY rough estimate 
     byte[] arr = Encoding.UTF8.GetBytes(s); 

     for (int i = 0; i < arr.Length; i++) 
     { 
      byte c = arr[i]; 

      if(c >= 0x41 && c <=0x5A)//alpha 
       sb.Append((char)c); 
      else if(c >= 0x61 && c <=0x7A)//ALPHA 
       sb.Append((char)c); 
      else if(c >= 0x30 && c <=0x39)//123456789 
       sb.Append((char)c); 
      else if (c == '-' || c == '.' || c == '_' || c == '~') 
       sb.Append((char)c); 
      else 
      { 
       sb.Append('%'); 
       sb.Append(Convert.ToString(c, 16).ToUpper()); 
      } 
     } 
     return sb.ToString(); 
    } 
} 
+0

डाउनवॉट्स के कारण? –

+0

क्योंकि उत्तर खराब स्वाद इमो है। – Anders

3

यह वास्तव में, डिफ़ॉल्ट रूप से काम करते हैं here देखने के लिए .NET 4.5 में निर्धारित किया गया है।

मैं सिर्फ PUrify नामक एक नए पुस्तकालय बनाए गए इस में दृष्टिकोण का एक परिवर्तन के माध्यम से जिसके लिए नेट पूर्व 4.5 (3.5 के लिए काम करता है) और मोनो काम करने के लिए इस हो रही संभाल लेंगे (इस मामले की छानबीन करने के बाद) post। PUrify एस्केपडाटास्ट्रिंग को नहीं बदलता है लेकिन यह आपको आरक्षित वर्णों के साथ उरिस देता है जो बच नहीं पाएगा।

0

मैं इस सवाल का एहसास है और जवाब के कुछ साल पुरानी हैं, लेकिन मैंने सोचा था कि जब मैं मुसीबत हो रही compliance under .Net 4.5 था मैं अपने निष्कर्ष का हिस्सा होगा।

अपने कोड asp.net के तहत चल रहा है, सिर्फ 4.5 लक्षित करने के लिए परियोजना की स्थापना और 4.5 या बाद के साथ एक मशीन पर चल रहा है, तो आप अभी भी 4.0 व्यवहार हो सकता है। आपको यह सुनिश्चित करने की ज़रूरत है कि <httpRuntime targetFramework="4.5" /> वेब.कॉन्फिग में सेट है।

this blog article on msdn से,

यदि कोई <httpRuntime targetFramework> Web.config में मौजूद विशेषता है, हम उस आवेदन चाहता था 4.0 quirks व्यवहार मान।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^