«Невозможно удалить полезные данные из конверта SOAP» с помощью ParkSquare.SoapClient - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь оспорить сгенерированный svcUtil SOAP Клиент с альтернативным подходом. Хотя подход svcUtil работает хорошо, но поскольку он использует постоянный канал WCF к Saop-серверу, мы хотели бы попытаться избежать этого всегда подключенного поведения. С другой стороны, svcUtil отлично работает, генерируя DTO из wsdl, поэтому мы хотели бы использовать его только для DTO.

SparkQuare предоставляет Nuget SoapClient, который использует стандартный HttpClient, а затем соответствует нашей цели. Однако у меня возникают проблемы с его настройкой.

В настоящее время я получаю эту ошибку:

System.AggregateException: произошла одна или несколько ошибок. (Невозможно удалить полезную нагрузку из SOAP конверта) ---- ParkSquare.SoapClient.SoapHttpClientException: Невозможно извлечь полезную нагрузку из SOAP конверта

Я предполагаю, что я неправильно настроил defaultNamespace и action но я не нашел соответствующей документации. Кто-нибудь получил подсказки об этом?

using System;
using System.Net.Http;
using System.Collections.Generic;
using System.Threading.Tasks;
using ParkSquare.SoapClient;
using System.Net.Http.Headers;
using System.Text;
using Soap_sern_mvt_ServiceReference; //DTO generated by SvcUtil

namespace ErpApi.EndPoint.ParkSquareSoapClient
{

    public class SerialNumberMouvementParkSquareSoapClient : ISerialNumberMouvement
    {
        private ISoapClient _soapClient;
        private HttpClient _httpClient;

        public SerialNumberMouvementParkSquareSoapClient()
        {
            string cred = "some:credentials";
            _httpClient = new HttpClient();
            _httpClient.DefaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue(
                    "Basic", 
                    Convert.ToBase64String(Encoding.ASCII.GetBytes(cred)));

            _soapClient = new ParkSquare.SoapClient.SoapClient(
                _httpClient,
                new RawBodySerializer(),
                new SoapHttpRequestBuilder(),
                new PayloadStripper(),
                new BodyDeserializer()); 
        }

        public async Task<IEnumerable<string>> GetAsync(string serialNumber)
        {
            ZsdSernMvtRequest requestDto = new ZsdSernMvtRequest();
            ZsdSernMvt data = new ZsdSernMvt
            {
                EtSernrMvt = new List<ZsdSSernrSalesMvt>().ToArray(),
                IndividualSerialNumber = serialNumber
            };

            requestDto.ZsdSernMvt = data;

            //Exception will fire here :
             var responseDto = await _soapClient.PostAsync<ZsdSernMvtRequest, ZsdSernMvtResponse1>(
                endpoint: new Uri("http://theSoapServer/sap/bc/srt/rfc/sap/zws_sern_mvt/010/zome_sern_mvt/zome_sern_mvt?sap-client=010"),
                request: requestDto,
                 defaultNamespace: "urn:sap-com:document:sap:soap:functions:mc-style",
                action: "urn:sap-com:document:sap:soap:functions:mc-style:ZWS_SERN_MVT:ZsdSernMvtRequest",
                SoapVersion.Soap12);

            return new List<string>() { responseDto.ToString() };
        }
   }
}  

для справки ниже приведен код, сгенерированный svcutil, который содержит DTO, использованный выше.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Soap_sern_mvt_ServiceReference
{


    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="urn:sap-com:document:sap:soap:functions:mc-style", ConfigurationName="Soap_sern_mvt_ServiceReference.ZWS_SERN_MVT")]
    public interface ZWS_SERN_MVT
    {

        [System.ServiceModel.OperationContractAttribute(Action="urn:sap-com:document:sap:soap:functions:mc-style:ZWS_SERN_MVT:ZsdSernMvtRequest", ReplyAction="*")]
        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
        System.Threading.Tasks.Task<Soap_sern_mvt_ServiceReference.ZsdSernMvtResponse1> ZsdSernMvtAsync(Soap_sern_mvt_ServiceReference.ZsdSernMvtRequest request);
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZsdSernMvt
    {

        private ZsdSSernrSalesMvt[] etSernrMvtField;

        private string individualSerialNumberField;

        private ZsdSSernr[] multipleSerialNumbersField;

        private string productIsAWatchField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
        [System.Xml.Serialization.XmlArrayItemAttribute("item", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
        public ZsdSSernrSalesMvt[] EtSernrMvt
        {
            get
            {
                return this.etSernrMvtField;
            }
            set
            {
                this.etSernrMvtField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
        public string IndividualSerialNumber
        {
            get
            {
                return this.individualSerialNumberField;
            }
            set
            {
                this.individualSerialNumberField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
        [System.Xml.Serialization.XmlArrayItemAttribute("item", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
        public ZsdSSernr[] MultipleSerialNumbers
        {
            get
            {
                return this.multipleSerialNumbersField;
            }
            set
            {
                this.multipleSerialNumbersField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
        public string ProductIsAWatch
        {
            get
            {
                return this.productIsAWatchField;
            }
            set
            {
                this.productIsAWatchField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZsdSSernrSalesMvt
    {

        private string brand_codeField;

        private string intercompagy_codeField;

        private string serial_numberField;

        private string product_SAP_numberField;

        private string receipt_dateField;

        private string sales_dateField;

        private string customer_numberField;

        private string nameField;

        private string additional_textField;

        private string movement_codeField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
        public string Brand_code
        {
            get
            {
                return this.brand_codeField;
            }
            set
            {
                this.brand_codeField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
        public string Intercompagy_code
        {
            get
            {
                return this.intercompagy_codeField;
            }
            set
            {
                this.intercompagy_codeField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
        public string Serial_number
        {
            get
            {
                return this.serial_numberField;
            }
            set
            {
                this.serial_numberField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
        public string Product_SAP_number
        {
            get
            {
                return this.product_SAP_numberField;
            }
            set
            {
                this.product_SAP_numberField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
        public string Receipt_date
        {
            get
            {
                return this.receipt_dateField;
            }
            set
            {
                this.receipt_dateField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
        public string Sales_date
        {
            get
            {
                return this.sales_dateField;
            }
            set
            {
                this.sales_dateField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
        public string Customer_number
        {
            get
            {
                return this.customer_numberField;
            }
            set
            {
                this.customer_numberField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
        public string Name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=8)]
        public string Additional_text
        {
            get
            {
                return this.additional_textField;
            }
            set
            {
                this.additional_textField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=9)]
        public string Movement_code
        {
            get
            {
                return this.movement_codeField;
            }
            set
            {
                this.movement_codeField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZsdSSernr
    {

        private string serial_numberField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
        public string Serial_number
        {
            get
            {
                return this.serial_numberField;
            }
            set
            {
                this.serial_numberField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
    public partial class ZsdSernMvtResponse
    {

        private ZsdSSernrSalesMvt[] etSernrMvtField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
        [System.Xml.Serialization.XmlArrayItemAttribute("item", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
        public ZsdSSernrSalesMvt[] EtSernrMvt
        {
            get
            {
                return this.etSernrMvtField;
            }
            set
            {
                this.etSernrMvtField = value;
            }
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class ZsdSernMvtRequest
    {

        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="urn:sap-com:document:sap:soap:functions:mc-style", Order=0)]
        public Soap_sern_mvt_ServiceReference.ZsdSernMvt ZsdSernMvt;

        public ZsdSernMvtRequest()
        {
        }

        public ZsdSernMvtRequest(Soap_sern_mvt_ServiceReference.ZsdSernMvt ZsdSernMvt)
        {
            this.ZsdSernMvt = ZsdSernMvt;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class ZsdSernMvtResponse1
    {

        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="urn:sap-com:document:sap:soap:functions:mc-style", Order=0)]
        public Soap_sern_mvt_ServiceReference.ZsdSernMvtResponse ZsdSernMvtResponse;

        public ZsdSernMvtResponse1()
        {
        }

        public ZsdSernMvtResponse1(Soap_sern_mvt_ServiceReference.ZsdSernMvtResponse ZsdSernMvtResponse)
        {
            this.ZsdSernMvtResponse = ZsdSernMvtResponse;
        }
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    public interface ZWS_SERN_MVTChannel : Soap_sern_mvt_ServiceReference.ZWS_SERN_MVT, System.ServiceModel.IClientChannel
    {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
    public partial class ZWS_SERN_MVTClient : System.ServiceModel.ClientBase<Soap_sern_mvt_ServiceReference.ZWS_SERN_MVT>, Soap_sern_mvt_ServiceReference.ZWS_SERN_MVT
    {

        public ZWS_SERN_MVTClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }

        public System.Threading.Tasks.Task<Soap_sern_mvt_ServiceReference.ZsdSernMvtResponse1> ZsdSernMvtAsync(Soap_sern_mvt_ServiceReference.ZsdSernMvtRequest request)
        {
            return base.Channel.ZsdSernMvtAsync(request);
        }

        public virtual System.Threading.Tasks.Task OpenAsync()
        {
            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen));
        }

        public virtual System.Threading.Tasks.Task CloseAsync()
        {
            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose));
        }
    }
}

1 Ответ

0 голосов
/ 27 января 2020

Есть ли у вас полная трассировка стека, которая приводит к этому исключению?

Кроме того, полный (действительный) SOAP запрос, отправленный по сети сгенерированным клиентом? Вы можете получить это, запустив Fiddler (или аналогичный) для захвата запроса.

...