From 6d7399512a40e0d44f04bd95c30fd7a4b6522d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9A=D0=BE=D1=80=D0=B6=D0=BE=D0=B2?= Date: Tue, 16 Jun 2020 18:19:25 +0300 Subject: [PATCH 1/5] IsRequered For WCF Add Support IsRequired property DataMemberAttribute in MetaWCFBodyWriter --- src/SoapCore/Meta/MetaWCFBodyWriter.cs | 22 ++++++++++++------- .../ServiceModel/DataMemberDescription.cs | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/SoapCore/Meta/MetaWCFBodyWriter.cs b/src/SoapCore/Meta/MetaWCFBodyWriter.cs index b8e832f4..b4823141 100644 --- a/src/SoapCore/Meta/MetaWCFBodyWriter.cs +++ b/src/SoapCore/Meta/MetaWCFBodyWriter.cs @@ -172,7 +172,8 @@ private void WriteParameters(XmlDictionaryWriter writer, SoapMethodParameterInfo var parameterName = !string.IsNullOrEmpty(elementAttribute?.ElementName) ? elementAttribute.ElementName : parameterInfo.Parameter.GetCustomAttribute()?.Name ?? parameterInfo.Parameter.Name; - AddSchemaType(writer, parameterInfo.Parameter.ParameterType, parameterName, objectNamespace: elementAttribute?.Namespace ?? (parameterInfo.Namespace != "http://tempuri.org/" ? parameterInfo.Namespace : null)); + var isRequired = !parameterInfo.Parameter.IsOptional; + AddSchemaType(writer, parameterInfo.Parameter.ParameterType, parameterName, objectNamespace: elementAttribute?.Namespace ?? (parameterInfo.Namespace != "http://tempuri.org/" ? parameterInfo.Namespace : null), isRequired: isRequired); } } @@ -270,7 +271,8 @@ private void AddOperations(XmlDictionaryWriter writer) } var returnName = operation.DispatchMethod.ReturnParameter.GetCustomAttribute()?.Name ?? operation.Name + "Result"; - AddSchemaType(writer, returnType, returnName, false, GetDataContractNamespace(returnType)); + var isRequired = !operation.DispatchMethod.ReturnParameter.IsOptional; + AddSchemaType(writer, returnType, returnName, false, GetDataContractNamespace(returnType), isRequired: isRequired); } WriteParameters(writer, operation.OutParameters); @@ -796,6 +798,7 @@ private void WriteComplexType(XmlDictionaryWriter writer, Type type) var attributes = property.GetCustomAttributes(true); int order = 0; + bool isRequired = false; foreach (var attr in attributes) { if (attr is DataMemberAttribute dataContractAttribute) @@ -810,6 +813,8 @@ private void WriteComplexType(XmlDictionaryWriter writer, Type type) order = dataContractAttribute.Order; } + isRequired = dataContractAttribute.IsRequired; + break; } } @@ -818,13 +823,14 @@ private void WriteComplexType(XmlDictionaryWriter writer, Type type) { Name = propertyName, Type = property.PropertyType, - Order = order + Order = order, + IsRequired = isRequired }); } foreach (var p in dataMembersToWrite.OrderBy(x => x.Order).ThenBy(p => p.Name, StringComparer.Ordinal)) { - AddSchemaType(writer, p.Type, p.Name, false, GetDataContractNamespace(p.Type)); + AddSchemaType(writer, p.Type, p.Name, false, GetDataContractNamespace(p.Type), p.IsRequired); } } @@ -1000,7 +1006,7 @@ private void AddService(XmlDictionaryWriter writer) writer.WriteEndElement(); // wsdl:port } - private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, bool isArray = false, string objectNamespace = null) + private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, bool isArray = false, string objectNamespace = null, bool isRequired = false) { var typeInfo = type.GetTypeInfo(); var typeName = GetTypeName(type); @@ -1035,7 +1041,7 @@ private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, b if (isArray) { - writer.WriteAttributeString("minOccurs", "0"); + writer.WriteAttributeString("minOccurs", isRequired ? "1" : "0"); writer.WriteAttributeString("maxOccurs", "unbounded"); } } @@ -1075,7 +1081,7 @@ private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, b } } - writer.WriteAttributeString("minOccurs", "0"); + writer.WriteAttributeString("minOccurs", , isRequired ? "1" : "0"); if (isArray) { writer.WriteAttributeString("maxOccurs", "unbounded"); @@ -1091,7 +1097,7 @@ private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, b } else { - writer.WriteAttributeString("minOccurs", "0"); + writer.WriteAttributeString("minOccurs", , isRequired ? "1" : "0"); if (isArray) { writer.WriteAttributeString("maxOccurs", "unbounded"); diff --git a/src/SoapCore/ServiceModel/DataMemberDescription.cs b/src/SoapCore/ServiceModel/DataMemberDescription.cs index a0814af6..27407612 100644 --- a/src/SoapCore/ServiceModel/DataMemberDescription.cs +++ b/src/SoapCore/ServiceModel/DataMemberDescription.cs @@ -7,5 +7,6 @@ public class DataMemberDescription public Type Type { get; set; } public string Name { get; set; } public int? Order { get; set; } + public bool IsRequired { get; set; } } } From b2a75f08a2932fe312c6d99b360560192eca2358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9A=D0=BE=D1=80=D0=B6=D0=BE=D0=B2?= Date: Tue, 16 Jun 2020 18:25:05 +0300 Subject: [PATCH 2/5] fix missing arguments --- src/SoapCore/Meta/MetaWCFBodyWriter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SoapCore/Meta/MetaWCFBodyWriter.cs b/src/SoapCore/Meta/MetaWCFBodyWriter.cs index b4823141..97e8c578 100644 --- a/src/SoapCore/Meta/MetaWCFBodyWriter.cs +++ b/src/SoapCore/Meta/MetaWCFBodyWriter.cs @@ -1081,7 +1081,7 @@ private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, b } } - writer.WriteAttributeString("minOccurs", , isRequired ? "1" : "0"); + writer.WriteAttributeString("minOccurs", isRequired ? "1" : "0"); if (isArray) { writer.WriteAttributeString("maxOccurs", "unbounded"); @@ -1097,7 +1097,7 @@ private void AddSchemaType(XmlDictionaryWriter writer, Type type, string name, b } else { - writer.WriteAttributeString("minOccurs", , isRequired ? "1" : "0"); + writer.WriteAttributeString("minOccurs", isRequired ? "1" : "0"); if (isArray) { writer.WriteAttributeString("maxOccurs", "unbounded"); From c5753b09d2b5178ae30b3f90e77898c2e2512af6 Mon Sep 17 00:00:00 2001 From: Aleksandr Kotov Date: Wed, 24 Jun 2020 11:57:01 +0300 Subject: [PATCH 3/5] OperationContract(IsOneWay = true) still generates the ()?.Name - ?? typeRootName - ?? parameterInfo.Parameter.Name; + ?? parameterInfo.Parameter.GetCustomAttribute()?.Name + ?? typeRootName + ?? parameterInfo.Parameter.Name; AddSchemaType(writer, parameterInfo.Parameter.ParameterType, parameterName, @namespace: elementAttribute?.Namespace); } @@ -495,13 +495,16 @@ private void AddMessage(XmlDictionaryWriter writer) } // output - writer.WriteStartElement("wsdl", "message", Namespaces.WSDL_NS); - writer.WriteAttributeString("name", $"{BindingType}_{operation.Name}_OutputMessage"); - writer.WriteStartElement("wsdl", "part", Namespaces.WSDL_NS); - writer.WriteAttributeString("name", "parameters"); - writer.WriteAttributeString("element", "tns:" + responseTypeName); - writer.WriteEndElement(); // wsdl:part - writer.WriteEndElement(); // wsdl:message + if (!operation.IsOneWay) + { + writer.WriteStartElement("wsdl", "message", Namespaces.WSDL_NS); + writer.WriteAttributeString("name", $"{BindingType}_{operation.Name}_OutputMessage"); + writer.WriteStartElement("wsdl", "part", Namespaces.WSDL_NS); + writer.WriteAttributeString("name", "parameters"); + writer.WriteAttributeString("element", "tns:" + responseTypeName); + writer.WriteEndElement(); // wsdl:part + writer.WriteEndElement(); // wsdl:message + } } } @@ -516,9 +519,12 @@ private void AddPortType(XmlDictionaryWriter writer) writer.WriteStartElement("wsdl", "input", Namespaces.WSDL_NS); writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_InputMessage"); writer.WriteEndElement(); // wsdl:input - writer.WriteStartElement("wsdl", "output", Namespaces.WSDL_NS); - writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_OutputMessage"); - writer.WriteEndElement(); // wsdl:output + if (!operation.IsOneWay) + { + writer.WriteStartElement("wsdl", "output", Namespaces.WSDL_NS); + writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_OutputMessage"); + writer.WriteEndElement(); // wsdl:output + } writer.WriteEndElement(); // wsdl:operation } diff --git a/src/SoapCore/Meta/MetaWCFBodyWriter.cs b/src/SoapCore/Meta/MetaWCFBodyWriter.cs index 97e8c578..ffb34720 100644 --- a/src/SoapCore/Meta/MetaWCFBodyWriter.cs +++ b/src/SoapCore/Meta/MetaWCFBodyWriter.cs @@ -861,13 +861,16 @@ private void AddMessage(XmlDictionaryWriter writer) writer.WriteEndElement(); // wsdl:message // output - writer.WriteStartElement("wsdl", "message", Namespaces.WSDL_NS); - writer.WriteAttributeString("name", $"{BindingType}_{operation.Name}_OutputMessage"); - writer.WriteStartElement("wsdl", "part", Namespaces.WSDL_NS); - writer.WriteAttributeString("name", "parameters"); - writer.WriteAttributeString("element", "tns:" + operation.Name + "Response"); - writer.WriteEndElement(); // wsdl:part - writer.WriteEndElement(); // wsdl:message + if (!operation.IsOneWay) + { + writer.WriteStartElement("wsdl", "message", Namespaces.WSDL_NS); + writer.WriteAttributeString("name", $"{BindingType}_{operation.Name}_OutputMessage"); + writer.WriteStartElement("wsdl", "part", Namespaces.WSDL_NS); + writer.WriteAttributeString("name", "parameters"); + writer.WriteAttributeString("element", "tns:" + operation.Name + "Response"); + writer.WriteEndElement(); // wsdl:part + writer.WriteEndElement(); // wsdl:message + } AddMessageFaults(writer, operation); } @@ -901,10 +904,14 @@ private void AddPortType(XmlDictionaryWriter writer) writer.WriteAttributeString("wsam", "Action", Namespaces.WSAM_NS, operation.SoapAction); writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_InputMessage"); writer.WriteEndElement(); // wsdl:input - writer.WriteStartElement("wsdl", "output", Namespaces.WSDL_NS); - writer.WriteAttributeString("wsam", "Action", Namespaces.WSAM_NS, operation.SoapAction + "Response"); - writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_OutputMessage"); - writer.WriteEndElement(); // wsdl:output + + if (!operation.IsOneWay) + { + writer.WriteStartElement("wsdl", "output", Namespaces.WSDL_NS); + writer.WriteAttributeString("wsam", "Action", Namespaces.WSAM_NS, operation.SoapAction + "Response"); + writer.WriteAttributeString("message", $"tns:{BindingType}_{operation.Name}_OutputMessage"); + writer.WriteEndElement(); // wsdl:output + } AddPortTypeFaults(writer, operation); From 72d95ae20e299473d7572b9dcde43d41d50a4cd2 Mon Sep 17 00:00:00 2001 From: Aleksandr Kotov Date: Wed, 24 Jun 2020 18:46:36 +0300 Subject: [PATCH 4/5] OperationContract(IsOneWay = true) still generates the Date: Wed, 24 Jun 2020 18:47:51 +0300 Subject: [PATCH 5/5] 1.1.0.1-beta --- src/SoapCore/SoapCore.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SoapCore/SoapCore.csproj b/src/SoapCore/SoapCore.csproj index 9a00f43b..bd678ff4 100644 --- a/src/SoapCore/SoapCore.csproj +++ b/src/SoapCore/SoapCore.csproj @@ -2,7 +2,7 @@ SOAP protocol middleware for ASP.NET Core - 1.1.0.1-alpha + 1.1.0.1-beta Digital Design netcoreapp3.0;netstandard2.0;netcoreapp2.1;netcoreapp3.1 SoapCore @@ -14,7 +14,7 @@ false false false - 1.1.0.1-alpha + 1.1.0.1-beta false SoapCore.snk true