private void CodeBinding(WsdlBinding binding, string directory, string namespaceName) { using (var file = new CodeFile(directory, $"{binding.CodeName}.cs")) { file.WriteLine("using Microsoft.Extensions.Logging;"); file.WriteLine("using System;"); file.WriteLine("using System.Threading.Tasks;"); file.WriteLine("using System.Xml.Linq;"); file.WriteLine(""); using (var nsScope = file.CreateNamespaceScope(namespaceName)) { using (var classScope = file.CreateClassScope("internal", binding.CodeName, "BaseSoapBinding")) { // constructor file.WriteLine($"public {binding.CodeName}(string soapLocation, string accessToken, int timeout, bool enableGzipCompression, INetUtility net, ILogger logger)"); file.Indent(); file.WriteLine(": base(soapLocation, accessToken, timeout, enableGzipCompression, net, logger)"); file.Unindent(); file.Ocb(); file.Ccb(); foreach (var op in binding.Operations) { var portTypeOperation = binding.PortType.Operations.First(x => x.Name == op.Name); var inputHeaderType = op.InputSoapHeader.CodeName; var outputHeaderType = op.OutputSoapHeader.CodeName; var inputType = portTypeOperation.InputElement.CodeName; var outputType = portTypeOperation.OutputElement.CodeName; file.WriteLine($"public async Task<SoapData<{outputHeaderType}, {outputType}>> {StringUtil.ToPascalCaseName(op.Name)}Async(SoapData<{inputHeaderType}, {inputType}> inData)"); file.Ocb(); file.WriteLine($"var xHeaderData = new XElement(XName.Get(\"{op.InputSoapHeader.XName.Name}\", \"{op.InputSoapHeader.XName.Namespace}\"));"); file.WriteLine("inData.Header.WriteTo(xHeaderData);"); file.WriteLine($"var xBodyData = new XElement(XName.Get(\"{portTypeOperation.InputElement.XName.Name}\", \"{portTypeOperation.InputElement.XName.Namespace}\"));"); file.WriteLine("inData.Body.WriteTo(xBodyData);"); file.WriteLine($"var outData = new SoapData<{outputHeaderType}, {outputType}>();"); file.WriteLine($"outData.Header = new {outputHeaderType}();"); file.WriteLine($"outData.Body = new {outputType}();"); file.WriteLine($"var faultData = new {portTypeOperation.FaultElement.CodeName}();"); file.WriteLine($"var isSuccessful = await GetSoapResultAsync(\"{op.SoapAction}\", xHeaderData, xBodyData, outData, faultData).ConfigureAwait(false);"); using (var ifScope = file.CreateScope("if (!isSuccessful)")) { file.WriteLine("if (faultData.Errors.Count == 1)"); file.Ocb(); file.WriteLine("throw faultData.Errors[0];"); file.Ccb(); file.WriteLine("else"); file.Ocb(); file.WriteLine("throw new AggregateException(faultData.Errors);"); file.Ccb(); } file.WriteLine("return outData;"); file.Ccb(); } } } } }
private WsdlBinding CreateBinding(ServiceDescription wsdl, Binding binding) { var b = new WsdlBinding(); b.Wsdl = wsdl; b.XName = new XmlQualifiedName(binding.Name, binding.ServiceDescription.TargetNamespace); b.PortType = _portTypeLookup[binding.Type.Name]; foreach (OperationBinding operationBinding in binding.Operations) { var ob = new WsdlOperationBinding(); b.Operations.Add(ob); ob.Name = operationBinding.Name; foreach (ServiceDescriptionFormatExtension extension in operationBinding.Extensions) { if (extension is SoapAddressBinding) { ob.SoapAction = (extension as SoapAddressBinding).Location; } } foreach (ServiceDescriptionFormatExtension extension in operationBinding.Input.Extensions) { if (extension is SoapHeaderBinding) { var header = extension as SoapHeaderBinding; var msg = wsdl.Messages[header.Message.Name]; var part = msg.Parts[header.Part]; ob.InputSoapHeader = new WsdlType { XName = part.Element }; } } foreach (ServiceDescriptionFormatExtension extension in operationBinding.Output.Extensions) { if (extension is SoapHeaderBinding) { var header = extension as SoapHeaderBinding; var msg = wsdl.Messages[header.Message.Name]; var part = msg.Parts[header.Part]; ob.OutputSoapHeader = new WsdlType { XName = part.Element }; } } } return(b); }