Ejemplo n.º 1
0
        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();
                        }
                    }
                }
            }
        }