From 3674888ce1e9b6de4c41fc6bbecbd7fc698de369 Mon Sep 17 00:00:00 2001 From: Maksim Bronnikov Date: Mon, 15 Dec 2025 19:49:07 +0300 Subject: [PATCH] Fix WSDL schema generator with non-annotated System.Object (backcompatibility with wcf?) --- .../Services/ComplexTypeWithSystemObject.cs | 6 ++++++ .../IComplexTypeWithSystemObjectService.cs | 17 +++++++++++++++++ src/SoapCore.Tests/Wsdl/WsdlTests.cs | 19 +++++++++++++++++++ src/SoapCore/Meta/MetaBodyWriter.cs | 5 +++++ 4 files changed, 47 insertions(+) create mode 100644 src/SoapCore.Tests/Wsdl/Services/ComplexTypeWithSystemObject.cs create mode 100644 src/SoapCore.Tests/Wsdl/Services/IComplexTypeWithSystemObjectService.cs diff --git a/src/SoapCore.Tests/Wsdl/Services/ComplexTypeWithSystemObject.cs b/src/SoapCore.Tests/Wsdl/Services/ComplexTypeWithSystemObject.cs new file mode 100644 index 00000000..22555242 --- /dev/null +++ b/src/SoapCore.Tests/Wsdl/Services/ComplexTypeWithSystemObject.cs @@ -0,0 +1,6 @@ +namespace SoapCore.Tests.Wsdl.Services; + +public class ComplexTypeWithSystemObject +{ + public object SystemObject { get; set; } +} diff --git a/src/SoapCore.Tests/Wsdl/Services/IComplexTypeWithSystemObjectService.cs b/src/SoapCore.Tests/Wsdl/Services/IComplexTypeWithSystemObjectService.cs new file mode 100644 index 00000000..b549e43b --- /dev/null +++ b/src/SoapCore.Tests/Wsdl/Services/IComplexTypeWithSystemObjectService.cs @@ -0,0 +1,17 @@ +using System; +using System.ServiceModel; + +namespace SoapCore.Tests.Wsdl.Services +{ + [ServiceContract] + public interface IComplexTypeWithSystemObjectService + { + [OperationContract] + ComplexTypeWithSystemObject Test(); + } + + public class ComplexTypeWithSystemObjectService : IComplexTypeWithSystemObjectService + { + public ComplexTypeWithSystemObject Test() => throw new NotImplementedException(); + } +} diff --git a/src/SoapCore.Tests/Wsdl/WsdlTests.cs b/src/SoapCore.Tests/Wsdl/WsdlTests.cs index b852f72d..dcf7ea3b 100644 --- a/src/SoapCore.Tests/Wsdl/WsdlTests.cs +++ b/src/SoapCore.Tests/Wsdl/WsdlTests.cs @@ -1407,6 +1407,25 @@ public async Task CheckComplexGenericTypeWithMultipleArgumentsWsdl(SoapSerialize Assert.AreEqual($"tns:{genericTypeName}Of{genericTypeArgumentName}{genericTypeArgumentName}", typeName); } + [DataTestMethod] + [DataRow(SoapSerializer.XmlSerializer)] + public async Task CheckComplexTypeWithSystemObjectWsdl(SoapSerializer soapSerializer) + { + var wsdl = await GetWsdlFromMetaBodyWriter(soapSerializer); + Trace.TraceInformation(wsdl); + Assert.IsNotNull(wsdl); + + var root = XElement.Parse(wsdl); + + var systemObjectElement = GetElements(root, _xmlSchema + "element") + .SingleOrDefault(a => a.Attribute("name")?.Value.Equals(nameof(ComplexTypeWithSystemObject.SystemObject)) == true); + + Assert.IsNotNull(systemObjectElement); + + var typeAttribute = systemObjectElement.Attribute("type"); + Assert.IsNull(typeAttribute); + } + [TestMethod] public void CheckSchemeOverride() { diff --git a/src/SoapCore/Meta/MetaBodyWriter.cs b/src/SoapCore/Meta/MetaBodyWriter.cs index 74d8322e..caa980b1 100644 --- a/src/SoapCore/Meta/MetaBodyWriter.cs +++ b/src/SoapCore/Meta/MetaBodyWriter.cs @@ -1273,6 +1273,11 @@ private void AddSchemaType(XmlDictionaryWriter writer, TypeToBuild toBuild, stri _complexTypeToBuild.Enqueue(newTypeToBuild); } } + else if (type == typeof(object)) + { + writer.WriteAttributeString("name", name); + WriteQualification(writer, isUnqualified); + } else if (toBuild.IsAnonumous) { if (string.IsNullOrEmpty(name))