2017-01-25 2 views
5

У меня есть следующий простой XML сериализации типа:Отсутствует SecurityProtocolType.Ssl3 значение перечисления при XML сериализации

[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 = @"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; 
} 

В то время как на неисправном коде, это сгенерированный код:

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 перечислений не генерируется неудачный случай. Вы не знаете, почему этот код отсутствует?

+0

Проверьте версии .NET, установленные на ПК. Я считаю, что новая версия 4.6 могла удалить эту опцию. –

+0

@Brianfromstatefarm nope, у меня установлены 4.6.1 и 4.6.2, а 4.6.x все еще имеет член перечисления Ssl3. – huseyint

ответ

3

Простая диагностика заключается в том, что SGen.exe запускался с неправильными ссылочными сборками. Параметры командной строки /reference имеют значение, если они не используются, тогда они возвращаются к тем, которые находятся в каталоге c: \ windows \ microsoft.net.

Подходит для обуви, переименование SecurityProtocolType было довольно изменчивым. Он был изменен с .NET 4.0 на 4.5, добавив членов перечисления Tls11 и Tls12. Здесь много Q + A, чтобы включить их даже в проект, который нацелен на 4.0. И есть довольно большая проблема с SSLv3, он был скомпрометирован beyond repair. Соответственно, Microsoft пытается остановить программистов от ее использования, что вы можете увидеть в the .NETCore declaration. Атрибут [Устаревший] - это тот, на который внимание SGen.exe обращает внимание.

Мне не показалось очевидным, какой вкус ссылочной сборки можно было использовать. Хотя SslProtocols.Ssl3 имеет атрибут [Устаревший] в .NETCore, член перечисления SecurityProtocolType does not. Поэтому SGen.exe случайно использует ссылку на сборку .NETCore не объясняет это. Что-то вроде Моно или Хамарин не просто объясняет это. Silverlight или справочная сборка PCL не объясняют это, по крайней мере, на моей машине. Увлекательная бета-версия - это всегда возможность.

Если у вас есть известная причина использовать необычный аргумент /reference для SGen.exe, лучше всего переустановить .NET Framework на этом компьютере. И прекратите использовать Ssl3, это действительно устарело.

Смежные вопросы