Добрый день! Стоит задача интеграции двух ИС через правительственный интеграционный сервис длаее ПИС.
Мы отправляем заявку на подключение в ПИС на определенный асинхронный сервис ИС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 мой сервис срабатывает и записывает в файл. Может я не понимаю принцип работы асинхронного сервиса? или должен им вернуть другой ответ?