2012-08-17 11 views
18

एक देव मशीन पर VS2012 प्रीमियम स्थापित करने के बाद एक यूनिट परीक्षण विफल हुआ, इसलिए डेवलपर ने समस्या को हल किया। जब परिवर्तन टीमसिटी में धकेल दिए गए तो यूनिट परीक्षण विफल हो गया। परियोजना को VS2012 के साथ संगत होने के लिए अपग्रेड किए जाने वाले समाधान फ़ाइल के अलावा अन्य नहीं बदला गया है। यह अभी भी लक्ष्य है। नेट फ्रेमवर्क 4.0System.Uri.ToString व्यवहार VS2012 के बाद

मैंने Uri.ToString पर कॉल करते समय यूनिकोड वर्णों से बचने के साथ किसी समस्या के लिए समस्या को अलग कर दिया है। निम्नलिखित कोड व्यवहार को दोहराता है।

Imports NUnit.Framework 

<TestFixture()> 
Public Class UriTest 

    <Test()> 
    Public Sub UriToStringUrlDecodes() 
     Dim uri = New Uri("http://www.example.org/test?helloworld=foo%B6bar") 

     Assert.AreEqual("http://www.example.org/test?helloworld=foo¶bar", uri.ToString()) 
    End Sub 

End Class 

VS2010 में एक मशीन है कि VS2012 इंस्टॉल नहीं है, पर इस रनिंग सफल होता है, स्थापित VS2012 के साथ एक मशीन पर VS2010 में इस चल विफल रहता है। NuGet से NCrunch और NUnit के नवीनतम संस्करण का उपयोग कर दोनों।

Machine without VS2012 Install

Machine with VS2012 Install

में विफल रहा है ज़ोर से संदेश

Expected string length 46 but was 48. Strings differ at index 42. 
    Expected: "http://www.example.org/test?helloworld=foo¶bar" 
    But was: "http://www.example.org/test?helloworld=foo%B6bar" 
    -----------------------------------------------------^ 

दोनों .NET 4 और .NET 4.5 के लिए MSDN पर प्रलेखन पता चलता है कि ToString इस चरित्र सांकेतिक शब्दों में बदलना नहीं करना चाहिए, जिसका अर्थ है कि पुराना व्यवहार सही होना चाहिए।

A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %. 

वीएस2012 स्थापित करने के बाद, यह यूनिकोड चरित्र बच निकला जा रहा है।

VS2012 के साथ मशीन पर System.dll की फ़ाइल संस्करण 4.0.30319.17929

है निर्माण सर्वर पर System.dll की फ़ाइल संस्करण 4.0.30319.236

कारण है कि हम कर रहे हैं की खूबियों की उपेक्षा है uri.ToString() का उपयोग करके, हम परीक्षण कर रहे हैं और आसपास के किसी भी संभावित काम के बारे में। क्या कोई यह समझा सकता है कि यह व्यवहार क्यों बदल गया है, या यह एक बग है?

संपादित करें, यहाँ सी # संस्करण

using System; 
using NUnit.Framework; 

namespace SystemUriCSharp 
{ 
    [TestFixture] 
    public class UriTest 
    { 

     [Test] 
     public void UriToStringDoesNotEscapeUnicodeCharacters() 
     { 
      var uri = new Uri(@"http://www.example.org/test?helloworld=foo%B6bar"); 

      Assert.AreEqual(@"http://www.example.org/test?helloworld=foo¶bar", uri.ToString()); 
     } 

    } 
} 

आगे की जांच पड़ताल के बारे में थोड़ी, अगर मैं, .NET 4.0 या .NET 4.5 परीक्षण असफल को लक्षित अगर मैं इसे .NET 3.5 तो यह सफल होता है करने के लिए स्विच है।

+0

मुझे पता है तर्क तय है कि यह है कि मैं कुछ गलत कर रहा हूँ और वहाँ .NET में एक बग नहीं होगा, लेकिन मैं सिर्फ काम नहीं कर सकता हूँ यह क्यों हो रहा है। –

+0

संभावित रूप से 'बूल चेक = @ "http://www.example.org/test?helloworld=foo¶bar" == uri.ToString();' गलत है, है ना? – t3hn00b

+0

हां यह झूठा है –

उत्तर

6

परिवर्तन पहले .NET संस्करणों की समस्याओं से संबंधित है, जो अब मानकों के प्रति अधिक अनुकूल बन गए हैं। %B6 यूटीएफ -16 है, लेकिन यूटीएफ -8 मानकों के अनुसार उरी में उपयोग किया जाना चाहिए, जिसका अर्थ है कि यह %C2%B6 होना चाहिए। तो %B6 यूटीएफ -8 नहीं है, अब इसे सही ढंग से अनदेखा किया गया है और डीकोड नहीं किया गया है।

connect report से अधिक विवरण नीचे दिए गए क्रियापद में उद्धृत।

.NET 4.5 बढ़ाया और आरएफसी 3987 जो यूआरआई के लिए IRI पार्स नियम का समर्थन करता है की अधिक संगत आवेदन किया है। आईआरआई अंतर्राष्ट्रीय संसाधन पहचानकर्ता हैं। यह गैर-ASCII वर्णों को यूआरआई/आईआरआई स्ट्रिंग में पार्स किए जाने की अनुमति देता है।

.NET 4.5 से पहले, हमारे पास आईआरआई के कुछ असंगत हैंडलिंग थे।

जो कुछ IRI हैंडलिंग/पार्स किया: हम झूठे का एक डिफ़ॉल्ट है कि आप पर बदल सकता है के साथ एक app.config प्रविष्टि नहीं थी। हालांकि, इसमें कुछ समस्याएं थीं। में विशेष रूप से यह गलत प्रतिशत एन्कोडिंग हैंडलिंग के लिए अनुमति देता है। आरएफसी 3 9 87 के अनुसार यूआरआई/आईआरआई स्ट्रिंग में प्रतिशत-एन्कोडेड आइटम प्रतिशत-एन्कोडेड यूटीएफ -8 ऑक्टेट्स होने चाहिए। वे प्रतिशत-एन्कोडेड यूटीएफ -16 के रूप में व्याख्या नहीं किए गए हैं। इसलिए, यूटीएफ -8 के अनुसार "% B6" को संभालना गलत है और कोई डिकोडिंग नहीं होगी। U के लिए सही यूटीएफ -8 एन्कोडिंग वास्तव में "% सी 2% बी 6" है।

अपने स्ट्रिंग इस बजाय था, तो:

 string strUri = @"http://www.example.com/test?helloworld=foo%C2%B6bar"; 

तो यह ToString() विधि और प्रतिशत एन्कोडिंग डीकोड और हटाया में सामान्यीकृत मिल जाएगा।

क्या आप अपनी आवेदन आवश्यकताओं और ToString() विधि के उपयोग के बारे में अधिक जानकारी प्रदान कर सकते हैं? आम तौर पर, हम सबसे सामान्यीकरण आवश्यकताओं के लिए उरी ऑब्जेक्ट की AbsoluteUri संपत्ति की अनुशंसा करते हैं।

इस मुद्दे अपने अनुप्रयोग विकास और व्यापार की जरूरत है तो हमें ईमेल पता "माइक्रोसॉफ्ट डॉट com पर netfx45compat" के माध्यम से अवगत कराएं ब्लॉक कर रहा है तो।

Thx,

नेटवर्किंग टीम

0

उस स्थिति में आप ऐसा नहीं कर सकते हैं। मुख्य मुद्दा चरित्र "¶" है।

नेट में हमें चरित्र a पर समस्या मिली। आप उस पर एक शोध कर सकते हैं।

उरी के पैरामीटर एक-एक करके लें। उन्हें एक करके जोड़ें और उनकी तुलना करें। हो सकता है कि आप इसे बनाने या इसे बदलने के लिए "¶" वर्ण के लिए एक विधि का उपयोग कर सकें।

उदाहरण के लिए;

Dim uri = New Uri("http://www.example.org/test?helloworld=foo%B6bar") 

Assert.AreEqual("http://www.example.org/test?helloworld=foo¶bar", uri.Host+uri.AbsolutePath+"?"+uri.Query) 

कि काम करेंगे

uri.AbsolutePath:/परीक्षण

यूआरएल।मेजबान: http://www.example.org

uri.Query: HelloWorld = foo¶bar

+0

यह VS2012 स्थापित करने से पहले काम करता था, और एमएसडीएन दस्तावेज के अनुसार काम करना चाहिए। मैं आसपास के काम में दिलचस्प नहीं हूं - यह आसान है, मुझे दिलचस्पी है कि यह अब क्यों काम नहीं करता है। –

8

कुछ .NET फ्रेमवर्क 4.5, जो VS2012 के साथ स्थापित किया गया है में किए गए बदलावों के होते हैं, और जो भी (मेरी जानकारी के अनुसार) है एक जगह "जगह उन्नयन" कहा जाता है। इसका मतलब यह है कि यह वास्तव में .NET Framework 4.

इसके अलावा, breaking changes documented in System.Uri हैं। उनमें से एक यूनिकोड सामान्यीकरण फॉर्म सी (एनएफसी) अब यूआरआई के गैर-मेजबान भागों पर नहीं किया जाएगा। मुझे यकीन नहीं है कि यह आपके मामले पर लागू है, लेकिन यह त्रुटि की आपकी जांच में एक अच्छा प्रारंभिक बिंदु के रूप में काम कर सकता है।

+0

दिलचस्प, यह बताता है कि यह क्यों बदला गया - यह उन परिवर्तनों में से एक का दुष्प्रभाव हो सकता है, मैं उम्मीद कर रहा था कि अब तक कनेक्ट के माध्यम से प्रतिक्रिया प्राप्त हो लेकिन कोई भाग्य नहीं है। –

+0

अच्छी जगह, हालांकि यह बताती है कि "यह केवल उन अनुप्रयोगों को प्रभावित करता है जो .NET Framework 4.5 को लक्षित करते हैं।" – Justin

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