Задать вопрос
@student895

Как получить ответ от асинхронного сервиса при интеграции в asp.net core?

Добрый день! Стоит задача интеграции двух ИС через правительственный интеграционный сервис длаее ПИС.
Мы отправляем заявку на подключение в ПИС на определенный асинхронный сервис ИС2. В заявке указываем URL принимающий ответ от ИС2.
С своего ИС1 отправляю SOAP запрос через ПИС на ИС2 и получаю ответ:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-D8ED0C13F781CE98C3170920094814225887">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311"/><ds:Reference URI="#id-D8ED0C13F781CE98C3170920094814125886">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gost34311"/><ds:DigestValue>f0J3NqHB/RDFGx7EDZ5G0Tsf0BFmls9X1/kXHeXp3AE=</ds:DigestValue></ds:Reference>
</ds:SignedInfo><ds:SignatureValue>3furXCRVawkHOoNGo14xNuyYQldAEuIg55uiYdHQs1n1Ih9EFgczSfS0eBVf7q2WfoffWWCgL9lO+3DBbAAtyg==</ds:SignatureValue>
</ds:Signature>
</wsse:Security>
</SOAP-ENV:Header>
<soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-D8ED0C13F781CE98C3170920094814125886">
<ns3:sendMessageResponse xmlns:ns3="/AsyncChannel/v10/Types">
<response>
<messageId>2178197311</messageId>
<correlationId>070481404</correlationId>
<responseDate>2024-02-29T16:02:49.880+06:00</responseDate>
<sessionId>{z4cf3b14-94a0-49p6-95w2-57fxf1284019}</sessionId>
</response>
</ns3:sendMessageResponse>
</soap:Body>
</soap:Envelope>

насколько я понял это означает что ИС2 принял мой запрос и обрабатывает, тут важным блоком является
<messageId>2178197311</messageId>
<correlationId>070481404</correlationId>
<sessionId>{z4cf3b14-94a0-49p6-95w2-57fxf1284019}</sessionId>

Теперь, после того как ИС2 обработает мой запрос, должен выслать результат ответа на указанный мной URL в заявке ПИС.
Например мой URL https://is1.com/integration/is2/service1
код контроллера который должен принять результат от ИС2 через ПИС и записать в файл XML:
spoiler

[Route("integration/is2/service1")] //service1
        [Consumes("application/xml", "text/xml")]
        public async Task<IActionResult> Service1Integration()
        {
            try
            {
                // Читаем тело запроса
                using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
                {
                    var webRootPath = _environment.WebRootPath;
                    var soapMessage = await reader.ReadToEndAsync();
                    // Путь к файлу для сохранения SOAP-сообщения
                    var filePath = Path.Combine(webRootPath, $"NOBDacceptQUEUE-{DateTime.Now.Date.ToString("dd.MM.yyyy")}-{DateTime.Now.TimeOfDay.ToString(@"hh\-mm\-ss")}.xml");
                    // Запись SOAP-сообщения в файл
                    using (var streamWriter = new StreamWriter(filePath))
                    {
                        await streamWriter.WriteAsync(soapMessage);
                    }
                    
                    //парсинг SOAP-сообщения
                    var xmlDoc = new XmlDocument();
                    xmlDoc.LoadXml(soapMessage);

                    // Получаем текущую дату и время в формате UTC
                    DateTime currentTime = DateTime.UtcNow;
                    // Преобразуем дату и время в нужный формат
                    string formattedDateTime = currentTime.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz");

                    // Создаем пространство имен для SOAP
                    XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable);
                    ns.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
                    ns.AddNamespace("ns3", "/AsyncChannel/v10/Types");

                    // Используем XPath, чтобы найти значения messageId, correlationId и sessionId
                    string messageId = xmlDoc.SelectSingleNode("//ns3:messageId", ns)?.InnerText;
                    string correlationId = xmlDoc.SelectSingleNode("//ns3:correlationId", ns)?.InnerText;
                    string sessionId = xmlDoc.SelectSingleNode("//ns3:sessionId", ns)?.InnerText;

                    Guid ResponseToken = Guid.NewGuid();
                    string xmlResponse = @"<?xml version='1.0'?><S:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'><S:Body   xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' wsu:Id='id-" + ResponseToken + "'><ns3:sendMessageResponse xmlns:ns3='/AsyncChannel/v10/Types'><response><messageId>"+ messageId + "</messageId><correlationId>"+ correlationId + "</correlationId><responseDate>" + formattedDateTime + "</responseDate><sessionId>{"+ sessionId + "}</sessionId></response></ns3:sendMessageResponse></S:Body></S:Envelope>";
                    var RepsonseSignedXml = await IndexLocalSign(new Reqmodel { code = "z@142,n!s,a@.,!#@", connectType = "Prod", signId = "id-" + ResponseToken.ToString(), xml = xmlResponse });

                    try
                    {
                        string url = "http://87.215.95.135/pis-async/"; //отправляем ответ о том что мы получили результат от ИС2
                        Guid token = Guid.NewGuid();
                        var httpContent = new StringContent(RepsonseSignedXml.ToString(), Encoding.UTF8, "text/xml");
                        var res = await url.WithHeader("Content-Type", "text/xml")
                        .WithHeader("Referer", "https://is1.com/integration/is2/service1").PostAsync(httpContent);

                        if (res.StatusCode == 200)
                        {
                            string xmlText = res.ResponseMessage.Content.ReadAsStringAsync().Result;
                            return new ContentResult
                            {
                                ContentType = "text",
                                Content = xmlText,
                                StatusCode = 200
                            };
                        }
                        else
                        {
                            return Content(res.StatusCode.ToString() + " SOAP: " + RepsonseSignedXml.ToString());
                        }
                    }
                    catch (Exception e)
                    {
                        return Content("Error: " + e + " SOAP: " + RepsonseSignedXml.ToString());
                    }

                }
            }
            catch (Exception ex)
            {
                string resp = @$"<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
                                            <soap:Body>
                                                  <soap:Fault>
                                                       <faultcode>soap:Server</faultcode>
                                                              <faultstring>{ex.Message}</faultstring>
                                                 </soap:Fault>
                                          </soap:Body>
                                       </soap:Envelope>";
                return new ContentResult
                {
                    ContentType = "text/xml",
                    Content = resp // Возвращает структурированный XML-документ в виде строки
                };
            }
        }


Теперь вопрос правильно ли я делаю? так как при отправке SOAP в ИС2 я получаю ответ что мой запрос принят. Но они не могут мне отправить ответ. Никто не обращается в сервис https://is1.com/integration/is2/service1. Ответ не приходит. хотя если попробовать отправить результат напрямую через SOAPUI или postman мой сервис срабатывает и записывает в файл. Может я не понимаю принцип работы асинхронного сервиса? или должен им вернуть другой ответ?
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы