-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Description
Hi, I am evaluating the porting of some .net 4.7.2 code to .net core 3 and found this problem that I think is a compatibility issue in XML Serialization.
You can find the repro project at https://github.com/lscorcia/net-core-serialization-issue.
Basically we have a WCF Connected Service which takes a couple of objects as parameters. One of them contains a byte[] property, declared as nullable in the service definition. This is the relevant generated proxy snippet:
/// <remarks/>
[System.Xml.Serialization.SoapElementAttribute(DataType="base64Binary", IsNullable=true)]
public byte[] contenuto
{
get
{
return this.contenutoField;
}
set
{
this.contenutoField = value;
}
}
When invoking the remote service, the request serialization is ok when the property is set to some value, but fails when the value is null: it throws a System.ServiceModel.CommunicationException in System.Private.ServiceModel.dll. Here is the full stack trace:
System.ServiceModel.CommunicationException
HResult=0x80131500
Message=There was an error in serializing body of message : 'There was an error generating the XML document.'. Please see InnerException for more details.
Source=System.Private.ServiceModel
StackTrace:
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter writer, MessageVersion version, String action, MessageDescription messageDescription, Object returnValue, Object[] parameters, Boolean isRequest)
Inner Exception 1:
InvalidOperationException: There was an error generating the XML document.
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) in /_/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs:line 373
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter writer, MessageVersion version, String action, MessageDescription messageDescription, Object returnValue, Object[] parameters, Boolean isRequest)
Inner Exception 2:
InvalidOperationException: Internal error.
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WritePrimitiveValue(TypeDesc typeDesc, Object o, Boolean isElement, String& stringValue) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 1165
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WritePrimitive(WritePrimitiveMethodRequirement method, String name, String ns, Object defaultValue, Object o, TypeMapping mapping, Boolean writeXsiType, Boolean isElement, Boolean isNullable) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 991
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteElement(Object o, ElementAccessor element, Boolean writeAccessor) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 405
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteElements(Object o, Object enumSource, ElementAccessor[] elements, TextAccessor text, ChoiceIdentifierAccessor choice, Boolean writeAccessors, Boolean isNullable) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 194
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteStructMethod(StructMapping mapping, String n, String ns, Object o, Boolean isNullable, Boolean needType) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 598
at System.Xml.Serialization.ReflectionXmlSerializationWriter.<>c__DisplayClass20_0.<CreateXmlSerializationWriteCallback>b__0(Object o) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 456
at System.Xml.Serialization.XmlSerializationWriter.WriteReferencedElement(String name, String ns, Object o, Type ambientType) in /_/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs:line 1350
at System.Xml.Serialization.XmlSerializationWriter.WriteReferencedElements() in /_/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs:line 1370
at System.Xml.Serialization.ReflectionXmlSerializationWriter.GenerateMembersElement(Object o, XmlMembersMapping xmlMembersMapping) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 1371
at System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteObject(Object o) in /_/src/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs:line 74
at System.Xml.Serialization.XmlSerializer.SerializeUsingReflection(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) in /_/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs:line 383
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) in /_/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs:line 350
This type of call was working fine in the original .net 4.7.2 software.
I can supply the service WSDL if needed, but I don't think that's relevant - the WCF proxy class looks ok and the error is in the early request creation.
I tried source-stepping in the framework code, but it is heavily optimized and the debugger is not that helpful. It looks like the null value of the array prevents the recognition of the parameter as an array and that it ends up on the wrong code path, but I might be easily mistaken on this.
Please let me know if you need any additional information.