1 Востаннє редагувалося Betterthanyou (13.04.2020 10:18:38)

Тема: [HTTP, SOAP] Як передавати List від клієнта до серера

Ніяк не можу знайти інформації, як правильно передавати контейнер List від клієнта до сервера (Веб сервіс, SOAP, .net).

Є такий лист

List<string> selectedParticipantsId = new List<string>();

Він перетворюється у масив байтів

byte[] SPIAsBytes = selectedParticipantsId.SelectMany(s =>
                    Encoding.UTF8.GetBytes(s + Environment.NewLine)).ToArray();

І передається через клас ServiceInvoker до серверу
Викликається InvokeService де
_SOAPRequest - XML запит
requestURLString - веб адреса (URL)
methodName - назва методу

class ServiceInvoker
    {
        private static readonly string _contentType = "text/xml;charset=\"utf-8\"";
        private static readonly string _accept = "text/xml";
        private static readonly string _method = "POST";

        public static string InvokeService(
            string _SOAPRequest,
            string requestURLString,
            string methodName)
        {
            //Calling CreateSOAPWebRequest method  
            HttpWebRequest request = CreateSOAPWebRequest(
                requestURLString,
                methodName
                );
            XmlDocument SOAPReqBody = new XmlDocument();
            //SOAP Body Request  
            SOAPReqBody.LoadXml(_SOAPRequest);

            using (Stream stream = request.GetRequestStream())
            {
                SOAPReqBody.Save(stream);
            }
            //Geting response from request  
            using (WebResponse Serviceres = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))
                {
                    XmlSerializer serializer =
                        new XmlSerializer(typeof(ServiceResult));
                    
                    //reading stream  
                    var ServiceResult = rd.ReadToEnd();
                    
                    //load xml
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(ServiceResult);

                    //writting stream result  
                    return doc.GetElementsByTagName("soap:Body")[0].
                        ChildNodes[0].
                        ChildNodes[0].
                        InnerText;
                }
            }
        }

        public static HttpWebRequest CreateSOAPWebRequest(string requestURLString,
            string methodName)
        {
            //Making Web Request  
            HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(requestURLString);
            //SOAPAction  
            Req.Headers.Add(@"SOAPAction:http://tempuri.org/" + methodName);
            //Content_type  
            Req.ContentType = _contentType;
            Req.Accept = _accept;
            //HTTP method  
            Req.Method = _method;
            //return HttpWebRequest  
            return Req;
        }
    }

Ось так виглядає XML запит

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
</soap:Header>
<soap:Body>
<SaveGroup xmlns="http://tempuri.org/">
<groupName>?</groupName>
<description>?</description>
<additionalInformation>?</additionalInformation>
<selectedParticipantsId>?</selectedParticipantsId>
</SaveGroup>
</soap:Body>
</soap:Envelope>

Сервер має [WebMethod] який це все приймає, а потім в зворотньому порядку з string робить list контейнер

        [WebMethod]
        public string SaveGroup(
            string groupName,
            string description,
            string additionalInformation,
            string selectedParticipantsId)
        {
            byte[] SPIAsBytes = Convert.FromBase64String(selectedParticipantsId);
            var a = Encoding.UTF8.GetString(SPIAsBytes);
            List<string> _selectedParticipantsId = new List<string>();

            _selectedParticipantsId = a.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList<string>();
            _selectedParticipantsId.RemoveAt(_selectedParticipantsId.Count - 1);

        }

Є простіший спосіб передачі контейнера list від клієнту до серверу ? (Без конвертації даних)

2

Re: [HTTP, SOAP] Як передавати List від клієнта до серера

Для цього ж є серіалізація, описуємо якийсь контейнер серіалізуємо до xml чи json,а потім ганяємо туди/сюди як звичайний текст.

Подякували: Betterthanyou, FakiNyan, leofun013