{"id":492703,"date":"2026-08-28T16:46:00","date_gmt":"2026-08-28T16:46:00","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=492703"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=492703","title":{"rendered":"SOAP \u0432 .NET \u0431\u0435\u0437 WCF: WS-Security, MTOM \u0438 ?wsdl \u043a\u0430\u043a \u0448\u0430\u0433 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/68c\/ac6\/f2e\/68cac6f2e7f7344dc6052b536e0c9342.png\" alt=\"redb.Route.SOAP\" title=\"redb.Route.SOAP\" width=\"1200\" height=\"630\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/68c\/ac6\/f2e\/68cac6f2e7f7344dc6052b536e0c9342.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/68c\/ac6\/f2e\/68cac6f2e7f7344dc6052b536e0c9342.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>redb.Route.SOAP<\/figcaption><\/div>\n<\/figure>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>SOAP <\/strong>\u0441 WS-Security, MTOM \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 WSDL \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 redb.Route: \u0431\u0435\u0437 WCF, \u0431\u0435\u0437 CoreWCF, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>SOAP \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0441\u044f. \u041f\u0440\u043e\u0434\u0430\u0451\u0442\u0435 \u0430\u0432\u0438\u0430\u0431\u0438\u043b\u0435\u0442\u044b, \u0437\u043d\u0430\u0447\u0438\u0442 \u0445\u043e\u0434\u0438\u0442\u0435 \u0432 Amadeus, Sabre \u0438 Travelport \u043f\u043e SOAP. \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0435\u0441\u044c \u0441 \u0431\u0430\u043d\u043a\u043e\u043c, \u0433\u043e\u0441\u043f\u043e\u0440\u0442\u0430\u043b\u043e\u043c, \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u043c \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c, \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u043c \u0434\u043e 2015-\u0433\u043e: \u0442\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u044d\u0442\u043e WSDL, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0435\u00a0<code>&lt;soap:Envelope&gt;<\/code>. \u041f\u043e\u0434\u043f\u0438\u0441\u0438 WS-Security, \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f MTOM, SOAP 1.1 \u0440\u044f\u0434\u043e\u043c \u0441 1.2,\u00a0<code>soap:Fault<\/code>\u00a0\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435: \u044d\u0442\u043e\u0442 \u043c\u0438\u0440 \u0436\u0438\u0432, \u043e\u043d \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430 REST \u043f\u043e \u0432\u0430\u0448\u0435\u0439 \u0432\u0435\u0436\u043b\u0438\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u044c\u0431\u0435.<\/p>\n<p>\u0412 .NET \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. WCF \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0443\u0448\u0451\u043b. CoreWCF \u0435\u0441\u0442\u044c, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0432\u0438\u0441\u0438\u0442 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e-\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0437\u0430\u0442\u0430\u0449\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e.\u00a0<code>dotnet-svcutil<\/code>\u00a0\u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0437 WSDL \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u043e \u044d\u0442\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u0438\u043a\u043b\u0435\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u043a\u0443, \u0430 \u043d\u0435 \u0448\u0430\u0433 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438. \u0410 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430, WS-Security \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0430 MTOM \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0443\u0447\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u00a0<code>System.ServiceModel<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c.<\/p>\n<p><code>redb.Route.Soap<\/code>\u00a0\u0438\u0434\u0451\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c. SOAP \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0436\u0435 .NET-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u0412\u044b\u0437\u0432\u0430\u043b \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041f\u043e\u0434\u043d\u044f\u043b \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043e\u0442\u0434\u0430\u043b \u0442\u0435\u043b\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443, \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0442\u0432\u0435\u0442. \u0412\u0441\u0451 in-box:\u00a0<code>HttpClient<\/code>, \u043e\u0431\u0449\u0438\u0439 Kestrel-\u0445\u043e\u0441\u0442 \u0438\u00a0<a href=\"http:\/\/System.Security\" rel=\"noopener nofollow\"><code>System.Security<\/code><\/a><code>.Cryptography.Xml<\/code>\u00a0\u0434\u043b\u044f WS-Security. \u041d\u0438 WCF, \u043d\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u00a0<code>System.ServiceModel<\/code>, \u043d\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 ESB \u0431\u044c\u0451\u0442 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443.<\/p>\n<h3>SOAP \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443<\/h3>\n<pre><code>services.AddRedbRoute(route =&gt;{    route.Services.AddRedbRouteSoap();    route.AddRouteBuilder&lt;MyRoutes&gt;();});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>\/\/ \u0412\u044b\u0437\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430From(\"direct:\/\/get-fares\")    .To(Soap.Call(\"https:\/\/gds\/air.svc\").ConnectionFactory(\"amadeus\").Operation(\"GetFares\"));\/\/ \u0425\u043e\u0441\u0442\u0438\u043d\u0433 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430From(Soap.Listen(\"\/svc\/orders\").Host(\"0.0.0.0\").Port(4090))    .Process(HandleOrder);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>AddRedbRouteSoap()<\/code>\u00a0\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0445\u0435\u043c\u044b\u00a0<code>soap<\/code>\u00a0\u0438\u00a0<code>soaps<\/code>\u00a0\u0438 \u0434\u0435\u043b\u0438\u0442 \u043e\u0434\u0438\u043d Kestrel-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u0451\u043c\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 HTTP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0<strong>Payload<\/strong>\u00a0\u0442\u0435\u043b\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u044d\u0442\u043e XML\u00a0<code>&lt;soap:Body&gt;<\/code>: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u0431\u0435\u0437 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<h3>\u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 (\u0438\u043b\u0438 \u0444\u043b\u044e\u0435\u043d\u0442\u043d\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440)<\/h3>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0432\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041a\u043e\u043c\u0443-\u0442\u043e \u043c\u0438\u043b\u0435\u0435 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440, \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 URI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435.<\/p>\n<pre><code>\/\/ \u0424\u043b\u044e\u0435\u043d\u0442\u043d\u043e.To(Soap.Call(\"https:\/\/gds\/air.svc\").ConnectionFactory(\"amadeus\").Operation(\"GetFares\"))\/\/ \u0421\u0442\u0440\u043e\u043a\u043e\u0439 (\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e).To(\"soaps:\/\/gds\/air.svc?connectionFactory=amadeus&amp;operation=GetFares\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u0430 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:<\/p>\n<pre><code>From(Soap.Listen(\"\/svc\/orders\").Host(\"0.0.0.0\").Port(4090).ConnectionFactory(\"orders\"))\/\/ \u0438\u043b\u0438From(\"soap:\/svc\/orders?host=0.0.0.0&amp;port=4090&amp;connectionFactory=orders\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>soap<\/code>\u00a0\u044d\u0442\u043e HTTP,\u00a0<code>soaps<\/code>\u00a0\u044d\u0442\u043e HTTPS. \u0410\u0434\u0440\u0435\u0441 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430\u00a0<code>soap[s]:\/\/host\/path<\/code>, \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u00a0<code>soap:\/path?host=&amp;port=<\/code>, \u043f\u0443\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0420\u0430\u0437 URI \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437\u00a0<code>appsettings.json<\/code>\u00a0\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<h3>\u0411\u0438\u043d\u0434\u0438\u043d\u0433 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043d\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h3>\n<p>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0443\u0447\u0451\u0442\u043a\u0438, \u0432\u0435\u0440\u0441\u0438\u044f SOAP \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0436\u0438\u0432\u0443\u0442 \u0432 URI. \u041e\u043d\u0438 \u043d\u0430\u00a0<code>SoapConnectionFactory<\/code>, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<code>.ConnectionFactory(\"name\")<\/code>.<\/p>\n<pre><code>context.AddToRegistry(\"amadeus\", new SoapConnectionFactory{    EndpointUrl = \"https:\/\/gds\/air.svc\",    SoapVersion = SoapVersion.Soap11,    DefaultAction = \"urn:GetFares\",    \/\/ \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b WS-Security, \u0432\u0441\u0451 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e    SigningCert = ourPfx,      \/\/ \u043d\u0430\u0448 \u0441\u0435\u0440\u0442 + \u041f\u0420\u0418\u0412\u0410\u0422\u041d\u042b\u0419 \u043a\u043b\u044e\u0447: \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435    EncryptCert = partnerCer,  \/\/ \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430: \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c    Username = \"svc\", Password = \"secret\",   \/\/ UsernameToken    Mtom = true,               \/\/ \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f MTOM\/XOP    Wsdl = \"contracts\/air.wsdl\",              \/\/ \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 GET ?wsdl (\u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440)});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u043e \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0438\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430. \u041f\u0435\u0440\u0435\u0435\u0437\u0434 \u0438\u0437 \u0441\u0442\u0435\u0439\u0434\u0436\u0430 \u0432 \u043f\u0440\u043e\u0434 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0440\u0430\u0432\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432.<\/p>\n<h3>\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432\u0438\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0423\u00a0<code>camel-cxf<\/code>\u00a0\u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u043e\u0436\u0435, \u043d\u0430\u00a0<code>SoapConnectionFactory.DataFormat<\/code>.<\/p>\n<p><code><strong>Payload<\/strong><\/code>\u00a0(\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e). \u0422\u0435\u043b\u043e \u044d\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 XML\u00a0<code>&lt;soap:Body&gt;<\/code>. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0431\u0435\u0437 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p><code><strong>Message<\/strong><\/code>. \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438: \u0442\u0435\u043b\u043e \u044d\u0442\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442, \u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c SOAP-\u0442\u0440\u0430\u0444\u0438\u043a, \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c, \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p><code><strong>Pojo<\/strong><\/code>. \u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437\u00a0<code>XmlSerializer<\/code>, .NET-\u0430\u043d\u0430\u043b\u043e\u0433 JAXB document\/literal. DTO \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 XML-\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0438\u0437 WSDL \u0447\u0435\u0440\u0435\u0437\u00a0<code>dotnet-svcutil<\/code>.<\/p>\n<pre><code>context.AddToRegistry(\"air\", new SoapConnectionFactory {    EndpointUrl = \"https:\/\/gds\/air.svc\",    DataFormat  = SoapDataFormat.Pojo,    ResponseType = typeof(GetFaresResponse),});From(\"direct:\/\/q\")    .Process(e =&gt; e.In.Body = new GetFaresRequest { Route = \"JFK-LHR\" })    .To(Soap.Call(\"https:\/\/gds\/air.svc\").ConnectionFactory(\"air\"));\/\/ e.Out.Body \u0442\u0435\u043f\u0435\u0440\u044c GetFaresResponse<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0432\u044b. \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0432\u043e\u0437\u043d\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 Payload; \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0438\u0434\u0451\u0442 \u0432 Pojo \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<h3>WS-Security, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442, in-box<\/h3>\n<p>WS-Security \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u044e\u0442. \u0417\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0435, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u00a0<a href=\"http:\/\/System.Security\" rel=\"noopener nofollow\"><code>System.Security<\/code><\/a><code>.Cryptography.Xml<\/code>, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e CoreWCF \u0440\u044f\u0434\u043e\u043c.<\/p>\n<ul>\n<li>\n<p><strong>UsernameToken<\/strong>: \u0437\u0430\u0434\u0430\u0439\u0442\u0435\u00a0<code>Username<\/code>\u00a0(\u0438\u00a0<code>Password<\/code>); \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u00a0<code>&lt;wsse:Security&gt;<\/code>, \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0443\u0447\u0451\u0442\u043a\u0443 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>XML-Signature<\/strong>: \u0441\u00a0<code>SigningCert<\/code>\u00a0\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u00a0<code>&lt;soap:Body&gt;<\/code>\u00a0(Exclusive C14N, SHA-256, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 X.509); \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>XML-Encryption<\/strong>: \u0441\u00a0<code>EncryptCert<\/code>\u00a0\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 Body \u043d\u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430; \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u043d \u0441\u0435\u0440\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430, \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0430\u044f: \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c Body, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430 \u0441\u0432\u043e\u0438\u043c self-signed-\u0441\u0435\u0440\u0442\u043e\u043c \u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0434 \u0434\u0435\u043a\u043e\u0439-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00abXML \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b\u0438\u00bb \u0438 \u00ab\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430\u00bb, \u0430 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0443\u0442 \u043b\u0435\u0433\u043a\u043e.<\/p>\n<p>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438 \u0436\u0434\u0443\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 WS-Security-\u0441\u0442\u0435\u043a\u0438:\u00a0<code>EncryptedKey<\/code>\u00a0\u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435\u00a0<code>&lt;wsse:Security&gt;<\/code>, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439\u00a0<code>ReferenceList<\/code>\u00a0\u0441\u00a0<code>EncryptedData<\/code>\u00a0\u0432 Body, AES-256 \u043f\u043e\u0434 RSA-OAEP-\u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043a\u043b\u044e\u0447\u0430. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u0435\u043a\u0442. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u0440\u0438\u043f\u0442\u043e-\u0441\u0442\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043a\u0432\u043e\u0437\u044c (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).<\/p>\n<h3>\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f: MTOM<\/h3>\n<p>\u041a\u0440\u0443\u043f\u043d\u044b\u043c \u0431\u0438\u043d\u0430\u0440\u044f\u043c \u043d\u0435 \u043c\u0435\u0441\u0442\u043e base64-\u0440\u0430\u0437\u0434\u0443\u0442\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 XML. \u041f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435\u00a0<code>Mtom = true<\/code>, \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u0434\u0443\u0442 \u043a\u0430\u043a\u00a0<code>multipart\/related<\/code>\u00a0\u0441 XOP, \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0442\u0435\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0447\u0438\u0441\u0442\u044b\u043c, \u0440\u043e\u0432\u043d\u043e \u043a\u0430\u043a Camel \u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0445 \u043d\u0430\u00a0<code>AttachmentMessage<\/code>.<\/p>\n<pre><code>var msg = new Message(    \"&lt;Upload xmlns=\\\"urn:svc\\\"&gt;&lt;file&gt;\" +    \"&lt;xop:Include xmlns:xop=\\\"http:\/\/www.w3.org\/2004\/08\/xop\/include\\\" href=\\\"cid:doc-1\\\"\/&gt;&lt;\/file&gt;&lt;\/Upload&gt;\");msg.Headers[SoapHeaders.Attachments] =    new List&lt;SoapAttachment&gt; { new(\"doc-1\", \"application\/pdf\", pdfBytes) };await producer.Process(new Exchange(msg));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043f\u0440\u0438\u0451\u043c\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u00a0<code>redbSoap.attachments<\/code>\u00a0\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c. \u0427\u0443\u0436\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043c\u043e\u043b\u0447\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0451\u0442.<\/p>\n<h3>\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 WSDL \u043d\u0430 ?wsdl<\/h3>\n<p>\u0412 .NET Core \u043d\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0438\u043c\u043f\u043e\u0440\u0442\u0430 WSDL, by design, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438 \u043d\u0435 \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442: \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442. \u0423\u043a\u0430\u0436\u0438\u0442\u0435\u00a0<code>SoapConnectionFactory.Wsdl<\/code>\u00a0\u043d\u0430 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 inline-XML \u0443 \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u0430, \u0438 \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u00a0<code>GET {path}?wsdl<\/code>\u00a0\u0441 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u00a0<code>&lt;soap:address&gt;<\/code>\u00a0\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e \u0432\u0430\u0441 \u0434\u043e\u0437\u0432\u043e\u043d\u0438\u043b\u0438\u0441\u044c. \u0421\u043b\u043e\u0436\u0438\u0442\u0435 \u0441 \u0440\u0435\u0436\u0438\u043c\u043e\u043c\u00a0<code>Pojo<\/code>\u00a0\u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442-first SOAP-\u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<h3>SOAP \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/h3>\n<p>\u0412\u043e\u0442 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0443 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u0430. SOAP \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 controller-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 redb.Route, \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441 HTTP, gRPC \u0438 SignalR. \u041f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0438\u0442\u0435 \u043f\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code>[Route(\"air\")]public class AirController : RedbController{    \/\/ \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 = SOAP-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f; XML-\u0442\u0435\u043b\u043e \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0440\u0443\u0436\u0443.    public Task&lt;GetFaresResponse&gt; GetFares([FromBody] GetFares req)        =&gt; Task.FromResult(new GetFaresResponse { Price = Quote(req.Route) });    [SoapOperation(\"HealthCheck\")]           \/\/ \u044f\u0432\u043d\u043e\u0435 \u0438\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043e\u0434\u0430    public string Health() =&gt; \"ok\";}\/\/ \u0417\u0430 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c:From(Soap.Listen(\"\/svc\/air\").Host(\"0.0.0.0\").Port(4090))    .RedbSoapController&lt;AirController&gt;();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e SOAP-\u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u0432\u044b\u0442\u0430\u0449\u0438\u043b \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043c\u0430\u043f\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0442\u043e\u0434, XML-\u0442\u0435\u043b\u043e \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u0411\u0435\u0437 HTTP-\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u0432\u043e\u0437\u043d\u0438 \u0441 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u043c,\u00a0<code>soap:Fault<\/code>\u00a0\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435. \u0422\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \u043b\u044e\u0431\u044b\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043e\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 SOAP \u0438 REST \u0441\u0440\u0430\u0437\u0443, \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<h3>\u0413\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0431\u044c\u0451\u0442 \u0448\u043b\u044e\u0437<\/h3>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0441\u043a\u0443\u0447\u043d\u044b\u0435 \u0438 \u043d\u0435\u0441\u0443\u0449\u0438\u0435. \u0422\u0440\u0435\u0432\u0435\u043b-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0442\u044f\u043d\u0435\u0442 \u0442\u0430\u0440\u0438\u0444\u044b \u0438\u0437 GDS \u043f\u043e SOAP \u0438 \u043f\u0435\u0440\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0438\u0445 \u043a\u0430\u043a JSON. \u0411\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 SOAP-\u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440. \u0413\u043e\u0441\u043f\u043e\u0440\u0442\u0430\u043b \u0438\u043b\u0438 \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u0442\u0430\u043b \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u0438\u043c WSDL-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041b\u0435\u0433\u0430\u0441\u0438-ERP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e SOAP 1.1 \u0441 UsernameToken.<\/p>\n<p>\u0421 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0448\u043b\u044e\u0437\u043e\u043c SOAP \u0436\u0438\u0432\u0451\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439. \u0413\u0435\u043d\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043b\u0438 \u0433\u043e\u043d\u044f\u0435\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0435 fault, \u0441\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u0442\u0440\u0435\u0439\u0441 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u00a0<code>redb.Route.Soap<\/code>\u00a0\u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430:<\/p>\n<pre><code>From(Soap.Listen(\"\/svc\/orders\").Host(\"0.0.0.0\").Port(8443).ConnectionFactory(\"self\"))    .Validate(Body().Matches(orderSchema))    .Unmarshal(\"xml\").Marshal(\"json\")    .To(\"kafka:\/\/orders\")    .Process(e =&gt; e.Out.Body = \"&lt;Ack xmlns=\\\"urn:svc\\\"&gt;accepted&lt;\/Ack&gt;\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043e\u0434\u0438\u043d \u0434\u0435\u043f\u043b\u043e\u0439, \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u0439\u0441. SOAP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b, \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043b\u0451\u0433 \u0432 Kafka, \u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0443 \u0443\u0448\u0451\u043b \u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c OpenTelemetry-\u0434\u0435\u0440\u0435\u0432\u0435 \u0441\u043f\u0430\u043d\u043e\u0432, \u0447\u0442\u043e \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0448\u0430\u0433.\u00a0<code>Client<\/code>-\u0441\u043f\u0430\u043d \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0435,\u00a0<code>Server<\/code>-\u0441\u043f\u0430\u043d \u043d\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435, \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430, \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432: \u0442\u043e \u0436\u0435 \u0441\u043a\u0432\u043e\u0437\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430.<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0440\u043e\u043f \u0434\u043e\u043a\u0430\u0437\u0430\u043d, \u0430 \u043d\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d<\/h3>\n<p>SOAP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0441 \u0441\u043e\u0431\u043e\u0439, \u044d\u0442\u043e \u043d\u0435 SOAP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Node.js\u00a0<code>soap<\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441 \u043d\u0438\u043c \u043d\u0435\u0442 \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u043d\u0430\u0448 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043f\u0440\u043e\u0442\u0438\u0432 \u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u0430, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SOAP \u0438 MTOM. \u0410 WS-Security-\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0432\u043e\u0437\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043a\u0440\u0438\u043f\u0442\u043e-\u0441\u0442\u0435\u043a\u043e\u043c (OpenSSL \u0432 Node) \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430: RSA-OAEP-\u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u043a\u043b\u044e\u0447\u0430, AES-256-CBC, \u043f\u0430\u0434\u0434\u0438\u043d\u0433 XML-Encryption \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043f\u0435\u043a\u0430. \u041f\u0440\u043e\u0432\u043e\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439, \u0438 \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u0430 \u043d\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043e.<\/p>\n<h3>\u0427\u0435\u0441\u0442\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/h3>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c-\u0438\u043c\u043f\u043e\u0440\u0442 WSDL (\u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0442\u0438\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 WSDL \u043d\u0430 \u043b\u0435\u0442\u0443) \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 .NET Core by design; \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 WSDL-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 Pojo-\u0442\u0438\u043f\u0430\u043c\u0438. WSDL \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 CLR-\u0442\u0438\u043f\u043e\u0432 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439; \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442-first. \u041f\u0430\u0440\u0430 \u0440\u0435\u0434\u043a\u0438\u0445 WS-* \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 (\u0432\u043d\u0435\u0448\u043d\u0438\u0439\u00a0<code>CipherReference<\/code>, \u043d\u0435-OAEP key transport, UsernameToken\u00a0<code>PasswordDigest<\/code>) \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0430. \u041d\u0438\u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043c\u0430\u0433\u0438\u0441\u0442\u0440\u0430\u043b\u0438: SOAP 1.1 \u0438 1.2, faults, \u0434\u0432\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, WS-Security \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044f\u043c\u0438 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c layout \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, MTOM, \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f WSDL \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b.<\/p>\n<h3>FAQ<\/h3>\n<p><strong>\u041d\u0443\u0436\u0435\u043d CoreWCF \u0438\u043b\u0438 System.ServiceModel?<\/strong>\u00a0\u041d\u0435\u0442. \u0411\u0430\u0437\u0430 \u044d\u0442\u043e\u00a0<code>HttpClient<\/code>, \u043e\u0431\u0449\u0438\u0439 Kestrel-\u0445\u043e\u0441\u0442 \u0438\u00a0<a href=\"http:\/\/System.Security\" rel=\"noopener nofollow\"><code>System.Security<\/code><\/a><code>.Cryptography.Xml<\/code>. CoreWCF \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u0439\u0434\u0451\u043d: \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0432\u0438\u0441\u0438\u0442 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e-\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<p><strong>SOAP 1.1 \u0438\u043b\u0438 1.2?<\/strong>\u00a0\u041e\u0431\u0430.\u00a0<code>SoapVersion<\/code>\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Content-Type \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c SOAPAction; faults \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 namespace, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 WCF- \u0438\u043b\u0438 CXF-\u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a.<\/p>\n<p><strong>\u041c\u043e\u0436\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0438 SOAP, \u0438 REST?<\/strong>\u00a0\u0414\u0430, \u0447\u0435\u0440\u0435\u0437 controller-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435\u00a0<code>RedbController<\/code>\u00a0\u0441\u0442\u043e\u0438\u0442 \u0438 \u0437\u0430\u00a0<code>Soap.Listen(...)<\/code>, \u0438 \u0437\u0430\u00a0<code>Http.Listen(...)<\/code>.<\/p>\n<p><strong>\u041a\u0443\u0434\u0430 \u043a\u043b\u0430\u0434\u0443\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b?<\/strong>\u00a0\u041d\u0430\u00a0<code>SoapConnectionFactory<\/code>, \u043a\u0430\u043a\u00a0<code>X509Certificate2<\/code>. \u041f\u0430\u0440\u043e\u043b\u044c \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h3>\n<pre><code class=\"bash\">dotnet add package redb.Route.Soap<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442:\u00a0<a href=\"https:\/\/www.nuget.org\/packages\/redb.Route.Soap\/\" rel=\"noopener nofollow\">redb.Route.Soap \u043d\u0430 NuGet<\/a>; \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e DSL \u0432\u00a0<a href=\"https:\/\/github.com\/redbase-app\/redb-route\/tree\/main\/redb.Route.Soap\" rel=\"noopener nofollow\">README \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430<\/a>. SOAP \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0435 redb.Route, \u0440\u044f\u0434\u043e\u043c \u0441 Kafka, RabbitMQ, AS2, IBM MQ \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438: \u0442\u043e\u0442 \u0436\u0435\u00a0<code>From \u2192 \u2026 \u2192 To<\/code>, \u0442\u0435 \u0436\u0435 EIP, \u0442\u0430 \u0436\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0435\u00a0<code>&lt;soap:Envelope&gt;<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0436\u0434\u0451\u0442 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u0438\u043b\u0435\u0442\u043d\u044f\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430.<\/p>\n<p><strong><em>\u0415\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u2b50 \u043d\u0430\u00a0<\/em><\/strong><a href=\"https:\/\/github.com\/redbase-app\" rel=\"noopener nofollow\"><strong><em>GitHub<\/em><\/strong><\/a><strong><em>\u00a0\u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u044d\u0442\u043e \u043d\u0430\u0439\u0442\u0438.<\/em><\/strong><\/p>\n<hr\/>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014\u00a0<a href=\"https:\/\/redb.ru\/articles\" rel=\"noopener nofollow\">redb.ru\/articles<\/a>, \u0435\u0449\u0451 \u2014 \u043d\u0430\u00a0<a href=\"https:\/\/habr.com\/ru\/users\/grelikt\/articles\/\" rel=\"noopener nofollow\">\u0425\u0430\u0431\u0440\u0435<\/a>.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1075966\/\">https:\/\/habr.com\/ru\/articles\/1075966\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>redb.Route.SOAPSOAP \u0441 WS-Security, MTOM \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 WSDL \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 redb.Route: \u0431\u0435\u0437 WCF, \u0431\u0435\u0437 CoreWCF, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430.SOAP \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0441\u044f. \u041f\u0440\u043e\u0434\u0430\u0451\u0442\u0435 \u0430\u0432\u0438\u0430\u0431\u0438\u043b\u0435\u0442\u044b, \u0437\u043d\u0430\u0447\u0438\u0442 \u0445\u043e\u0434\u0438\u0442\u0435 \u0432 Amadeus, Sabre \u0438 Travelport \u043f\u043e SOAP. \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0435\u0441\u044c \u0441 \u0431\u0430\u043d\u043a\u043e\u043c, \u0433\u043e\u0441\u043f\u043e\u0440\u0442\u0430\u043b\u043e\u043c, \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u043c \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c, \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u043c \u0434\u043e 2015-\u0433\u043e: \u0442\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u044d\u0442\u043e WSDL, \u0430 \u043d\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0435\u00a0&lt;soap:Envelope&gt;. \u041f\u043e\u0434\u043f\u0438\u0441\u0438 WS-Security, \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f MTOM, SOAP 1.1 \u0440\u044f\u0434\u043e\u043c \u0441 1.2,\u00a0soap:Fault\u00a0\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435: \u044d\u0442\u043e\u0442 \u043c\u0438\u0440 \u0436\u0438\u0432, \u043e\u043d \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430 REST \u043f\u043e \u0432\u0430\u0448\u0435\u0439 \u0432\u0435\u0436\u043b\u0438\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u044c\u0431\u0435.\u0412 .NET \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. WCF \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0443\u0448\u0451\u043b. CoreWCF \u0435\u0441\u0442\u044c, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0432\u0438\u0441\u0438\u0442 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e-\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0437\u0430\u0442\u0430\u0449\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e.\u00a0dotnet-svcutil\u00a0\u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0437 WSDL \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u043e \u044d\u0442\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u0438\u043a\u043b\u0435\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u043a\u0443, \u0430 \u043d\u0435 \u0448\u0430\u0433 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438. \u0410 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430, WS-Security \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0430 MTOM \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0443\u0447\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u00a0System.ServiceModel, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c.redb.Route.Soap\u00a0\u0438\u0434\u0451\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c. SOAP \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0436\u0435 .NET-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u0412\u044b\u0437\u0432\u0430\u043b \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041f\u043e\u0434\u043d\u044f\u043b \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043e\u0442\u0434\u0430\u043b \u0442\u0435\u043b\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443, \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0442\u0432\u0435\u0442. \u0412\u0441\u0451 in-box:\u00a0HttpClient, \u043e\u0431\u0449\u0438\u0439 Kestrel-\u0445\u043e\u0441\u0442 \u0438\u00a0System.Security.Cryptography.Xml\u00a0\u0434\u043b\u044f WS-Security. \u041d\u0438 WCF, \u043d\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u00a0System.ServiceModel, \u043d\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 ESB \u0431\u044c\u0451\u0442 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443.SOAP \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443services.AddRedbRoute(route =&gt;{    route.Services.AddRedbRouteSoap();    route.AddRouteBuilder&lt;MyRoutes&gt;();});\/\/ \u0412\u044b\u0437\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430From(&#171;direct:\/\/get-fares&#187;)    .To(Soap.Call(&#171;https:\/\/gds\/air.svc&#187;).ConnectionFactory(&#171;amadeus&#187;).Operation(&#171;GetFares&#187;));\/\/ \u0425\u043e\u0441\u0442\u0438\u043d\u0433 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430From(Soap.Listen(&#171;\/svc\/orders&#187;).Host(&#171;0.0.0.0&#187;).Port(4090))    .Process(HandleOrder);AddRedbRouteSoap()\u00a0\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0445\u0435\u043c\u044b\u00a0soap\u00a0\u0438\u00a0soaps\u00a0\u0438 \u0434\u0435\u043b\u0438\u0442 \u043e\u0434\u0438\u043d Kestrel-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u0451\u043c\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 HTTP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0Payload\u00a0\u0442\u0435\u043b\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u044d\u0442\u043e XML\u00a0&lt;soap:Body&gt;: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u0431\u0435\u0437 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.\u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 (\u0438\u043b\u0438 \u0444\u043b\u044e\u0435\u043d\u0442\u043d\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440)\u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0432\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041a\u043e\u043c\u0443-\u0442\u043e \u043c\u0438\u043b\u0435\u0435 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0431\u0438\u043b\u0434\u0435\u0440, \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 URI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435.\/\/ \u0424\u043b\u044e\u0435\u043d\u0442\u043d\u043e.To(Soap.Call(&#171;https:\/\/gds\/air.svc&#187;).ConnectionFactory(&#171;amadeus&#187;).Operation(&#171;GetFares&#187;))\/\/ \u0421\u0442\u0440\u043e\u043a\u043e\u0439 (\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e).To(&#171;soaps:\/\/gds\/air.svc?connectionFactory=amadeus&amp;operation=GetFares&#187;)\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u0430 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:From(Soap.Listen(&#171;\/svc\/orders&#187;).Host(&#171;0.0.0.0&#187;).Port(4090).ConnectionFactory(&#171;orders&#187;))\/\/ \u0438\u043b\u0438From(&#171;soap:\/svc\/orders?host=0.0.0.0&amp;port=4090&amp;connectionFactory=orders&#187;)soap\u00a0\u044d\u0442\u043e HTTP,\u00a0soaps\u00a0\u044d\u0442\u043e HTTPS. \u0410\u0434\u0440\u0435\u0441 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430\u00a0soap[s]:\/\/host\/path, \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u00a0soap:\/path?host=&amp;port=, \u043f\u0443\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0420\u0430\u0437 URI \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437\u00a0appsettings.json\u00a0\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0434\u0430.\u0411\u0438\u043d\u0434\u0438\u043d\u0433 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043d\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0443\u0447\u0451\u0442\u043a\u0438, \u0432\u0435\u0440\u0441\u0438\u044f SOAP \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0436\u0438\u0432\u0443\u0442 \u0432 URI. \u041e\u043d\u0438 \u043d\u0430\u00a0SoapConnectionFactory, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0.ConnectionFactory(&#171;name&#187;).context.AddToRegistry(&#171;amadeus&#187;, new SoapConnectionFactory{    EndpointUrl = &#171;https:\/\/gds\/air.svc&#187;,    SoapVersion = SoapVersion.Soap11,    DefaultAction = &#171;urn:GetFares&#187;,    \/\/ \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b WS-Security, \u0432\u0441\u0451 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e    SigningCert = ourPfx,      \/\/ \u043d\u0430\u0448 \u0441\u0435\u0440\u0442 + \u041f\u0420\u0418\u0412\u0410\u0422\u041d\u042b\u0419 \u043a\u043b\u044e\u0447: \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435    EncryptCert = partnerCer,  \/\/ \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430: \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c    Username = &#171;svc&#187;, Password = &#171;secret&#187;,   \/\/ UsernameToken    Mtom = true,               \/\/ \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f MTOM\/XOP    Wsdl = &#171;contracts\/air.wsdl&#187;,              \/\/ \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 GET ?wsdl (\u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440)});\u041f\u043e\u043b\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u043e \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0438\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430. \u041f\u0435\u0440\u0435\u0435\u0437\u0434 \u0438\u0437 \u0441\u0442\u0435\u0439\u0434\u0436\u0430 \u0432 \u043f\u0440\u043e\u0434 \u044d\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0440\u0430\u0432\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432.\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432\u0438\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u0423\u00a0camel-cxf\u00a0\u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u043e\u0436\u0435, \u043d\u0430\u00a0SoapConnectionFactory.DataFormat.Payload\u00a0(\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e). \u0422\u0435\u043b\u043e \u044d\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 XML\u00a0&lt;soap:Body&gt;. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0431\u0435\u0437 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.Message. \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438: \u0442\u0435\u043b\u043e \u044d\u0442\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442, \u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c SOAP-\u0442\u0440\u0430\u0444\u0438\u043a, \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c, \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.Pojo. \u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437\u00a0XmlSerializer, .NET-\u0430\u043d\u0430\u043b\u043e\u0433 JAXB document\/literal. DTO \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 XML-\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0438\u0437 WSDL \u0447\u0435\u0440\u0435\u0437\u00a0dotnet-svcutil.context.AddToRegistry(&#171;air&#187;, new SoapConnectionFactory {    EndpointUrl = &#171;https:\/\/gds\/air.svc&#187;,    DataFormat  = SoapDataFormat.Pojo,    ResponseType = typeof(GetFaresResponse),});From(&#171;direct:\/\/q&#187;)    .Process(e =&gt; e.In.Body = new GetFaresRequest { Route = &#171;JFK-LHR&#187; })    .To(Soap.Call(&#171;https:\/\/gds\/air.svc&#187;).ConnectionFactory(&#171;air&#187;));\/\/ e.Out.Body \u0442\u0435\u043f\u0435\u0440\u044c GetFaresResponse\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0432\u044b. \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0432\u043e\u0437\u043d\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 Payload; \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0438\u0434\u0451\u0442 \u0432 Pojo \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.WS-Security, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442, in-boxWS-Security \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u044e\u0442. \u0417\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0435, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u00a0System.Security.Cryptography.Xml, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e CoreWCF \u0440\u044f\u0434\u043e\u043c.UsernameToken: \u0437\u0430\u0434\u0430\u0439\u0442\u0435\u00a0Username\u00a0(\u0438\u00a0Password); \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u00a0&lt;wsse:Security&gt;, \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0443\u0447\u0451\u0442\u043a\u0443 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443.XML-Signature: \u0441\u00a0SigningCert\u00a0\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u00a0&lt;soap:Body&gt;\u00a0(Exclusive C14N, SHA-256, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 X.509); \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442.XML-Encryption: \u0441\u00a0EncryptCert\u00a0\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 Body \u043d\u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430; \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u043d \u0441\u0435\u0440\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430, \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0430\u044f: \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c Body, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430 \u0441\u0432\u043e\u0438\u043c self-signed-\u0441\u0435\u0440\u0442\u043e\u043c \u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0434 \u0434\u0435\u043a\u043e\u0439-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00abXML \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b\u0438\u00bb \u0438 \u00ab\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430\u00bb, \u0430 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0443\u0442 \u043b\u0435\u0433\u043a\u043e.\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438 \u0436\u0434\u0443\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 WS-Security-\u0441\u0442\u0435\u043a\u0438:\u00a0EncryptedKey\u00a0\u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435\u00a0&lt;wsse:Security&gt;, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439\u00a0ReferenceList\u00a0\u0441\u00a0EncryptedData\u00a0\u0432 Body, AES-256 \u043f\u043e\u0434 RSA-OAEP-\u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043a\u043b\u044e\u0447\u0430. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u0435\u043a\u0442. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u0440\u0438\u043f\u0442\u043e-\u0441\u0442\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043a\u0432\u043e\u0437\u044c (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f: MTOM\u041a\u0440\u0443\u043f\u043d\u044b\u043c \u0431\u0438\u043d\u0430\u0440\u044f\u043c \u043d\u0435 \u043c\u0435\u0441\u0442\u043e base64-\u0440\u0430\u0437\u0434\u0443\u0442\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 XML. \u041f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435\u00a0Mtom = true, \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u0434\u0443\u0442 \u043a\u0430\u043a\u00a0multipart\/related\u00a0\u0441 XOP, \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0442\u0435\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0447\u0438\u0441\u0442\u044b\u043c, \u0440\u043e\u0432\u043d\u043e \u043a\u0430\u043a Camel \u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0445 \u043d\u0430\u00a0AttachmentMessage.var msg = new Message(    &#171;&lt;Upload xmlns=\\&#187;urn:svc\\&#187;&gt;&lt;file&gt;&#187; +    &#171;&lt;xop:Include xmlns:xop=\\&#187;http:\/\/www.w3.org\/2004\/08\/xop\/include\\&#187; href=\\&#187;cid:doc-1\\&#187;\/&gt;&lt;\/file&gt;&lt;\/Upload&gt;&#187;);msg.Headers[SoapHeaders.Attachments] =    new List&lt;SoapAttachment&gt; { new(&#171;doc-1&#187;, &#171;application\/pdf&#187;, pdfBytes) };await producer.Process(new Exchange(msg));\u041d\u0430 \u043f\u0440\u0438\u0451\u043c\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u00a0redbSoap.attachments\u00a0\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c. \u0427\u0443\u0436\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043c\u043e\u043b\u0447\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0451\u0442.\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 WSDL \u043d\u0430 ?wsdl\u0412 .NET Core \u043d\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0438\u043c\u043f\u043e\u0440\u0442\u0430 WSDL, by design, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438 \u043d\u0435 \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442: \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442. \u0423\u043a\u0430\u0436\u0438\u0442\u0435\u00a0SoapConnectionFactory.Wsdl\u00a0\u043d\u0430 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 inline-XML \u0443 \u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440\u0430, \u0438 \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u00a0GET {path}?wsdl\u00a0\u0441 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u00a0&lt;soap:address&gt;\u00a0\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e \u0432\u0430\u0441 \u0434\u043e\u0437\u0432\u043e\u043d\u0438\u043b\u0438\u0441\u044c. \u0421\u043b\u043e\u0436\u0438\u0442\u0435 \u0441 \u0440\u0435\u0436\u0438\u043c\u043e\u043c\u00a0Pojo\u00a0\u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442-first SOAP-\u0441\u0435\u0440\u0432\u0438\u0441.SOAP \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0412\u043e\u0442 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0443 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u0430. SOAP \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 controller-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 redb.Route, \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441 HTTP, gRPC \u0438 SignalR. \u041f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0438\u0442\u0435 \u043f\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.[Route(&#171;air&#187;)]public class AirController : RedbController{    \/\/ \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 = SOAP-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f; XML-\u0442\u0435\u043b\u043e \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0440\u0443\u0436\u0443.    public Task&lt;GetFaresResponse&gt; GetFares([FromBody] GetFares req)        =&gt; Task.FromResult(new GetFaresResponse { Price = Quote(req.Route) });    [SoapOperation(&#171;HealthCheck&#187;)]           \/\/ \u044f\u0432\u043d\u043e\u0435 \u0438\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043e\u0434\u0430    public string Health() =&gt; &#171;ok&#187;;}\/\/ \u0417\u0430 SOAP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u043c:From(Soap.Listen(&#171;\/svc\/air&#187;).Host(&#171;0.0.0.0&#187;).Port(4090))    .RedbSoapController&lt;AirController&gt;();\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e SOAP-\u043a\u043e\u043d\u0441\u044e\u043c\u0435\u0440 \u0432\u044b\u0442\u0430\u0449\u0438\u043b \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043c\u0430\u043f\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0442\u043e\u0434, XML-\u0442\u0435\u043b\u043e \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u0411\u0435\u0437 HTTP-\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u0432\u043e\u0437\u043d\u0438 \u0441 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u043c,\u00a0soap:Fault\u00a0\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435. \u0422\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \u043b\u044e\u0431\u044b\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043e\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 SOAP \u0438 REST \u0441\u0440\u0430\u0437\u0443, \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439.\u0413\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0431\u044c\u0451\u0442 \u0448\u043b\u044e\u0437\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0441\u043a\u0443\u0447\u043d\u044b\u0435 \u0438 \u043d\u0435\u0441\u0443\u0449\u0438\u0435. \u0422\u0440\u0435\u0432\u0435\u043b-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0442\u044f\u043d\u0435\u0442 \u0442\u0430\u0440\u0438\u0444\u044b \u0438\u0437 GDS \u043f\u043e SOAP \u0438 \u043f\u0435\u0440\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0438\u0445 \u043a\u0430\u043a JSON. \u0411\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 SOAP-\u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440. \u0413\u043e\u0441\u043f\u043e\u0440\u0442\u0430\u043b \u0438\u043b\u0438 \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u0442\u0430\u043b \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u0438\u043c WSDL-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041b\u0435\u0433\u0430\u0441\u0438-ERP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e SOAP 1.1 \u0441 UsernameToken.\u0421 codegen-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0448\u043b\u044e\u0437\u043e\u043c SOAP \u0436\u0438\u0432\u0451\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439. \u0413\u0435\u043d\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043b\u0438 \u0433\u043e\u043d\u044f\u0435\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0435 fault, \u0441\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u0442\u0440\u0435\u0439\u0441 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u00a0redb.Route.Soap\u00a0\u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430:From(Soap.Listen(&#171;\/svc\/orders&#187;).Host(&#171;0.0.0.0&#187;).Port(8443).ConnectionFactory(&#171;self&#187;))    .Validate(Body().Matches(orderSchema))    .Unmarshal(&#171;xml&#187;).Marshal(&#171;json&#187;)    .To(&#171;kafka:\/\/orders&#187;)    .Process(e =&gt; e.Out.Body = &#171;&lt;Ack xmlns=\\&#187;urn:svc\\&#187;&gt;accepted&lt;\/Ack&gt;&#187;);\u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043e\u0434\u0438\u043d \u0434\u0435\u043f\u043b\u043e\u0439, \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u0439\u0441. SOAP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b, \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043b\u0451\u0433 \u0432 Kafka, \u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0443 \u0443\u0448\u0451\u043b \u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c OpenTelemetry-\u0434\u0435\u0440\u0435\u0432\u0435 \u0441\u043f\u0430\u043d\u043e\u0432, \u0447\u0442\u043e \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0448\u0430\u0433.\u00a0Client-\u0441\u043f\u0430\u043d \u043d\u0430&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-492703","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/492703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=492703"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/492703\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=492703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=492703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=492703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}