2017-01-25 10 views
5

मैं निम्नलिखित सरल एक्सएमएल serializable प्रकार है:लापता SecurityProtocolType.Ssl3 enum मूल्य

[XmlType] 
public class TestType 
{ 
    public System.Net.SecurityProtocolType ProtocolType { get; set; } 
} 

var instanceToSerialize = new TestType { ProtocolType = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 }; 

मैं इस वस्तु अपने कंप्यूटर और कई कंप्यूटरों पर ठीक की आवृत्ति को क्रमानुसार कर सकते हैं।

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: Instance validation error: '4080' is not a valid value for System.Net.SecurityProtocolType. 
at System.Xml.Serialization.XmlCustomFormatter.FromEnum(Int64 val, String[] vals, Int64[] ids, String typeName) 
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write1_SecurityProtocolType(SecurityProtocolType v) 
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write3_TestType(String n, String ns, TestType o, Boolean isNullable, Boolean needType) 
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write4_TestType(Object o) 

मैं काम कर रहा है और मामलों नाकाम रहने के लिए sgen.exe उत्पन्न कोड की तुलना में है: लेकिन कंप्यूटर मैं परीक्षण किया है में से एक पर, मैं निम्नलिखित अपवाद हो रही है। काम करने के मामले पर मैं इस कोड उत्पन्न होते हैं:

string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) { 
    string s = null; 
    switch (v) { 
     case global::[email protected]: s = @"Tls"; break; 
     case global::[email protected]: s = @"Tls11"; break; 
     case global::[email protected]: s = @"Tls12"; break; 
     default: s = FromEnum(((System.Int64)v), new string[] {@"Tls", 
      @"Tls11", 
      @"Tls12"}, new System.Int64[] {(long)global::[email protected], 
      (long)global::[email protected], 
      (long)global::[email protected]}, @"System.Net.SecurityProtocolType"); break; 
    } 
    return s; 
} 

आप देख सकते हैं कि Ssl3 enum सदस्य के लिए कोड जेनरेट नहीं है:

string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) { 
    string s = null; 
    switch (v) { 
     case global::[email protected]: s = @"Ssl3"; break; 
     case global::[email protected]: s = @"Tls"; break; 
     case global::[email protected]: s = @"Tls11"; break; 
     case global::[email protected]: s = @"Tls12"; break; 
     default: s = FromEnum(((System.Int64)v), new string[] {@"Ssl3", 
      @"Tls", 
      @"Tls11", 
      @"Tls12"}, new System.Int64[] {(long)global::[email protected], 
      (long)global::[email protected], 
      (long)global::[email protected], 
      (long)global::[email protected]}, @"System.Net.SecurityProtocolType"); break; 
    } 
    return s; 
} 

में नाकाम रहने के कोड पर जबकि, इस उत्पन्न कोड है असफल मामला क्या आपको कोई विचार है कि वह कोड क्यों गुम है?

+0

पीसी पर स्थापित .NET के संस्करणों की जांच करें। मेरा मानना ​​है कि नवीनतम संस्करण 4.6 ने उस विकल्प को हटा दिया होगा। –

+0

@Brianfromstatefarm nope, मेरे पास 4.6.1 और 4.6.2 स्थापित है और 4.6.x में अभी भी एसएसएल 3 एनम सदस्य है। – huseyint

उत्तर

3

सादा नैदानिक ​​यह है कि SGen.exe गलत संदर्भ असेंबली के साथ चलाया गया था। /reference कमांड लाइन विकल्प मायने रखता है, अगर इसका उपयोग नहीं किया जाता है तो यह c: \ windows \ microsoft.net

जूते फिट बैठता है, सुरक्षाप्रोटोकॉल टाइप एनम काफी जटिल है। इसे .NET 4.0 से 4.5 में बदल दिया गया था, जिसमें Tls11 और Tls12 enum सदस्य शामिल थे। 4.0 के लक्ष्य वाले एक प्रोजेक्ट पर भी उन्हें सक्षम करने के लिए यहां क्यू + ए के बहुत सारे हैं। और एसएसएलवी 3 के साथ एक बहुत बड़ी समस्या है, इसे beyond repair से समझौता किया गया है। तदनुसार माइक्रोसॉफ्ट प्रोग्रामर को इसका इस्तेमाल करने से रोकने की कोशिश कर रहा है, कुछ ऐसा जो आप the .NETCore declaration में देख सकते हैं। [अप्रचलित] विशेषता वह है जो SGen.exe पर ध्यान देती है।

यह मेरे लिए अन्यथा स्पष्ट नहीं है कि संदर्भ असेंबली का स्वाद किस प्रकार इस्तेमाल किया जा सकता था। जबकि SslProtocols.Ssl3 में .NETCore में [अप्रचलित] विशेषता है, सुरक्षाप्रोटोकॉल टाइप एनम सदस्य does not। तो SGen.exe गलती से .NETCore संदर्भ असेंबली का उपयोग करके इसे समझा नहीं है। मोनो या ज़ैमरिन की तरह कुछ आसानी से इसे समझा नहीं जाता है। सिल्वरलाइट या पीसीएल संदर्भ असेंबली कम से कम मेरी मशीन पर नहीं बताती है। एक भद्दा बीटा संस्करण हमेशा एक संभावना है।

जब तक आपके पास SGen.exe के लिए असामान्य /reference तर्क का उपयोग करने का ज्ञात कारण नहीं है, तो सबसे अच्छी सिफारिश उस मशीन पर .NET Framework को पुनर्स्थापित करना है। और एसएसएल 3 का उपयोग करना बंद करो, यह वास्तव में अप्रचलित है।

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