{"id":223685,"date":"2014-05-27T12:01:03","date_gmt":"2014-05-27T08:01:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=223685"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=223685","title":{"rendered":"<span class=\"post_title\">\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 SOAP \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e WCF<\/span>"},"content":{"rendered":"<div class=\"content html_format\">       WCF \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u0435 \u043a\u0430\u043a \u0444\u0440\u044d\u0439\u043c\u0432\u043e\u0440\u043a, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f. \u041d\u043e WCF&#8217;s design style \u043c\u0435\u043d\u044f \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e DTO \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. <\/p>\n<p>  WCF \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:  <\/p>\n<ul>\n<li> \u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/li>\n<li> \u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e API.<\/li>\n<li> Service Contract \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.<\/li>\n<li> \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DataContract \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c.<\/li>\n<li> \u0414\u0440\u0443\u0433\u0438\u0435 \u043d\u0435 .NET \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 RPC (Remote Procedure Call) \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439. \u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c, \u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 API \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c:  <\/p>\n<ul>\n<li>\u041e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. <\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/dataTransferObject.html\">DTO<\/a>. <\/li>\n<\/ul>\n<p>  \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 WCF \u043f\u0443\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 SOAP \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 (\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435)<br \/>  <a name=\"habracut\"><\/a><\/p>\n<h2>\u0414\u0438\u0437\u0430\u0439\u043d \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 RPC, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 (Message based).<\/p>\n<h4>\u0414\u0438\u0437\u0430\u0439\u043d RPC<\/h4>\n<p>  \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u0442\u0438\u043b\u044f RPC \u2014 \u044d\u0442\u043e \u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u043a\u0430\u043a \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u0412 WCF ServiceContract \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cs\">[ServiceContract] public interface IRpcService {     [OperationContract]     void RegisterClient(Client client);      [OperationContract]     Client GetClientByName(string clientName);      [OperationContract]     List&lt;Client&gt; GetAllClients(); }  <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438). \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 10 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u043c.<\/p>\n<h4>\u0414\u0438\u0437\u0430\u0439\u043d, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445<\/h4>\n<p>  \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u043b\u0435\u0436\u0430\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/dataTransferObject.html\">Data Transfer Object<\/a> \u0438 <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/gateway.html\">Gateway<\/a>. DTO \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 Gateway \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435-\u043e\u0442\u0432\u0435\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442 API Amazon.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:  <\/p>\n<pre><code class=\"xml\">https:\/\/ec2.amazonaws.com\/?Action=AllocateAddress Domain=vpc &AUTHPARAMS <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430:  <\/p>\n<pre><code class=\"xml\">&lt;AllocateAddressResponse xmlns=&quot;http:\/\/ec2.amazonaws.com\/doc\/2013-02-01\/&quot;&gt;    &lt;requestId&gt;59dbff89-35bd-4eac-99ed-be587EXAMPLE&lt;\/requestId&gt;     &lt;publicIp&gt;198.51.100.1&lt;\/publicIp&gt;    &lt;domain&gt;vpc&lt;\/domain&gt;    &lt;allocationId&gt;eipalloc-5723d13e&lt;\/allocationId&gt; &lt;\/AllocateAddressResponse&gt; <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">public interface IMessageBasedService {     Response Execute(Request request); }  <\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>Request<\/code> \u0438 <code>Response<\/code> \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438 DTO, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 RPC \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e WCF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0438\u043b\u044c RPC.<\/p>\n<h2>\u0421\u0442\u0438\u043b\u044c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445<\/h2>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0434\u043b\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>Request<\/code> \u0438 <code>Response<\/code> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043b\u044e\u0431\u043e\u0433\u043e DTO. \u041d\u043e WCF \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d. \u0412\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0439 \u0432 WCF \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Message. \u0422\u043e \u0435\u0441\u0442\u044c WCF \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 DTO \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Message<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>Message<\/code> \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>Message<\/code> \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>Request<\/code> \u0438 <code>Response<\/code>.<br \/>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044e \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c <code>Response<\/code> \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.  <\/p>\n<pre><code class=\"cs\">[ServiceContract] public interface ISoapService {     [OperationContract(Action = ServiceMetadata.Action.ProcessOneWay)]     void ProcessOneWay(Message message);      [OperationContract(Action = ServiceMetadata.Action.Process,         ReplyAction = ServiceMetadata.Action.ProcessResponse)]     Message Process(Message message); }  <\/code><\/pre>\n<p><code>ISoapService<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430 \u043d\u0435\u043c. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044f, \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u2014 \u044d\u0442\u043e CRUD-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u0442\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>SoapServiceClient<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 DTO.<\/p>\n<h4>Soap service client<\/h4>\n<p>  <code>SoapServiceClient<\/code> \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>Message<\/code> \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e DTO. <code>SoapServiceClient<\/code> \u2014 \u044d\u0442\u043e \u0432\u0440\u0430\u043f\u043f\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 DTO \u0432 <code>Message<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:  <\/p>\n<ul>\n<li>DTO<\/li>\n<li>\u0422\u0438\u043f DTO, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/li>\n<li>\u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>\u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f SOAP \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\/\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\/\u043e\u0442\u0432\u0435\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 CRUD, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">var client = new SoapServiceClient(&quot;NeliburSoapService&quot;);  ClientResponse response = client.Post&lt;ClientResponse&gt;(createRequest);  response = client.Put&lt;ClientResponse&gt;(updateRequest); <\/code><\/pre>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Post<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>SoapServiceClient<\/code>.  <\/p>\n<pre><code class=\"cs\">public TResponse Post&lt;TResponse&gt;(object request) {     return Send&lt;TResponse&gt;(request, OperationTypeHeader.Post); }  private TResponse Send&lt;TResponse&gt;(object request, MessageHeader operationType) {     using (var factory = new ChannelFactory&lt;ISoapService&gt;(_endpointConfigurationName))     {         MessageVersion messageVersion = factory.Endpoint.Binding.MessageVersion;         Message message = CreateMessage(request, operationType, messageVersion);         ISoapService channel = factory.CreateChannel();         Message result = channel.Process(message);         return result.GetBody&lt;TResponse&gt;();     } }  private static Message CreateMessage(     object request, MessageHeader actionHeader, MessageVersion messageVersion) {     Message message = Message.CreateMessage(         messageVersion, ServiceMetadata.Operations.Process, request);     var contentTypeHeader = new ContentTypeHeader(request.GetType());     message.Headers.Add(contentTypeHeader);     message.Headers.Add(actionHeader);     return message; }  <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>CreateMessage<\/code> \u0438 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0442\u0438\u043f DTO \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>contentTypeHeader<\/code> and <code>actionHeader<\/code>.<br \/>  <code>SoapContentTypeHeader<\/code> \u0438 <code>SoapOperationTypeHeader<\/code> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b. The <code>SoapContentTypeHeader<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0442\u0438\u043f\u0430 DTO, \u0430 <code>SoapOperationTypeHeader<\/code> \u2014 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u0435\u043d\u044c\u0448\u0435 \u0441\u043b\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430:  <\/p>\n<pre><code class=\"cs\">internal sealed class SoapContentTypeHeader : MessageHeader {     private const string NameValue = &quot;nelibur-content-type&quot;;     private const string NamespaceValue = &quot;http:\/\/nelibur.org\/&quot; + NameValue;     private readonly string _contentType;      public SoapContentTypeHeader(Type contentType)     {         _contentType = contentType.Name;     }      public override string Name     {         get { return NameValue; }     }      public override string Namespace     {         get { return NamespaceValue; }     }      public static string ReadHeader(Message request)     {         int headerPosition = request.Headers.FindHeader(NameValue, NamespaceValue);         if (headerPosition == -1)         {             return null;         }         var content = request.Headers.GetHeader&lt;string&gt;(headerPosition);         return content;     }      protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)     {         writer.WriteString(_contentType);     } } <\/code><\/pre>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b <code>SoapServiceClient<\/code>:  <\/p>\n<pre><code class=\"cs\">public static TResponse Get&lt;TResponse&gt;(object request)  public static Task&lt;TResponse&gt; GetAsync&lt;TResponse&gt;(object request)  public static void Post(object request)  public static Task PostAsync(object request)  public static TResponse Post&lt;TResponse&gt;(object request)  public static Task&lt;TResponse&gt; PostAsync&lt;TResponse&gt;(object request)  public static void Put(object request)  public static Task PutAsync(object request)   public static TResponse Put&lt;TResponse&gt;(object request)  public static Task&lt;TResponse&gt; PutAsync&lt;TResponse&gt;(object request)  public static void Delete(object request)  public static Task DeleteAsync(object request) <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0432\u0441\u0435 CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<h4>SOAP \u0441\u0435\u0440\u0432\u0438\u0441<\/h4>\n<p>  SOAP \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 Request \u0438\u0437 Message<\/li>\n<li>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 Request<\/li>\n<li>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c Message \u0438\u0437 Response<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 CRUD-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e <code>Request<\/code>. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>Client<\/code> (\u043a\u043b\u0438\u0435\u043d\u0442\u0430).<\/p>\n<pre><code class=\"cs\">public sealed class ClientProcessor : IPut&lt;CreateClientRequest&gt;,      IGet&lt;GetClientRequest&gt; {     private readonly List&lt;Client&gt; _clients = new List&lt;Client&gt;();      public object Get(GetClientRequest request)     {         Client client = _clients.Single(x =&gt; x.Id == request.Id);         return new ClientResponse {Id = client.Id, Name = client.Name};     }      public object Put(CreateClientRequest request)     {         var client = new Client             {                 Id = Guid.NewGuid(),                 Name = request.Name             };         _clients.Add(client);         return new ClientResponse {Id = client.Id};     } } <\/code><\/pre>\n<p>  \u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <code>IGet<\/code> \u0438 <code>IPost<\/code>. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 CRUD. \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/cac\/d3f\/5cd\/cacd3f5cd354a8f339748f6795d1703e.jpg\" alt=\"\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432\"\/><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c <code>Request<\/code> \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 CRUD. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0443\u0442\u044c \u2014 \u0441\u0432\u044f\u0437\u0430\u0442\u044c <code>Request<\/code> \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (request <code>Processor<\/code>). \u0417\u0430 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442 <code>NeliburService<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e.  <\/p>\n<pre><code class=\"cs\">public abstract class NeliburService {     internal static readonly RequestMetadataMap _requests = new RequestMetadataMap();     protected static readonly Configuration _configuration = new Configuration();     private static readonly RequestProcessorMap _requestProcessors = new RequestProcessorMap();      protected static void ProcessOneWay(RequestMetadata requestMetaData)     {         IRequestProcessor processor = _requestProcessors.Get(requestMetaData.Type);         processor.ProcessOneWay(requestMetaData);     }      protected static Message Process(RequestMetadata requestMetaData)     {         IRequestProcessor processor = _requestProcessors.Get(requestMetaData.Type);         return processor.Process(requestMetaData);     }      protected sealed class Configuration : IConfiguration     {         public void Bind&lt;TRequest, TProcessor&gt;(Func&lt;TProcessor&gt; creator)             where TRequest : class             where TProcessor : IRequestOperation         {             if (creator == null)             {                 throw Error.ArgumentNull(&quot;creator&quot;);             }             _requestProcessors.Add&lt;TRequest, TProcessor&gt;(creator);             _requests.Add&lt;TRequest&gt;();         }          public void Bind&lt;TRequest, TProcessor&gt;()             where TRequest : class             where TProcessor : IRequestOperation, new()         {             Bind&lt;TRequest, TProcessor&gt;(() =&gt; new TProcessor());         }     } } <\/code><\/pre>\n<p>  <code>RequestMetadataMap<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Request<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e <code>Request<\/code> \u0438\u0437 <code>Message<\/code>.  <\/p>\n<pre><code class=\"cs\">internal sealed class RequestMetadataMap {     private readonly Dictionary&lt;string, Type&gt; _requestTypes =         new Dictionary&lt;string, Type&gt;();      internal void Add&lt;TRequest&gt;()         where TRequest : class     {         Type requestType = typeof(TRequest);         _requestTypes[requestType.Name] = requestType;     }      internal RequestMetadata FromRestMessage(Message message)     {         UriTemplateMatch templateMatch = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;         NameValueCollection queryParams = templateMatch.QueryParameters;         string typeName = UrlSerializer.FromQueryParams(queryParams).GetTypeValue();         Type targetType = GetRequestType(typeName);         return RequestMetadata.FromRestMessage(message, targetType);     }      internal RequestMetadata FromSoapMessage(Message message)     {         string typeName = SoapContentTypeHeader.ReadHeader(message);         Type targetType = GetRequestType(typeName);         return RequestMetadata.FromSoapMessage(message, targetType);     }      private Type GetRequestType(string typeName)     {         Type result;         if (_requestTypes.TryGetValue(typeName, out result))         {             return result;         }         string errorMessage = string.Format(             &quot;Binding on {0} is absent. Use the Bind method on an appropriate NeliburService&quot;, typeName);         throw Error.InvalidOperation(errorMessage);     } } <\/code><\/pre>\n<p>  <code>RequestProcessorMap<\/code> c\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Request<\/code> \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c.  <\/p>\n<pre><code class=\"cs\">internal sealed class RequestProcessorMap {     private readonly Dictionary&lt;Type, IRequestProcessor&gt; _repository =         new Dictionary&lt;Type, IRequestProcessor&gt;();      public void Add&lt;TRequest, TProcessor&gt;(Func&lt;TProcessor&gt; creator)         where TRequest : class         where TProcessor : IRequestOperation     {         Type requestType = typeof(TRequest);         IRequestProcessor context = new RequestProcessor&lt;TRequest, TProcessor&gt;(creator);         _repository[requestType] = context;     }      public IRequestProcessor Get(Type requestType)     {         return _repository[requestType];     } } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0448\u0430\u0433\u0430: \u0432\u044b\u0437\u043e\u0432\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e\u0442 \u043d\u0430\u0448 SOAP-\u0441\u0435\u0440\u0432\u0438\u0441:  <\/p>\n<pre><code class=\"cs\">[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public sealed class SoapService : ISoapService {     public Message Process(Message message)     {         return NeliburSoapService.Process(message);     }      public void ProcessOneWay(Message message)     {         NeliburSoapService.ProcessOneWay(message);     } }   <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/cd6\/55e\/020\/cd655e020c48aaa6d8f986f1c3a20d2c.jpg\" alt=\"\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\"\/><br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u0434 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c. <code>NeliburSoapService<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434, \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e.  <\/p>\n<pre><code class=\"cs\">public sealed class NeliburSoapService : NeliburService {     private NeliburSoapService()     {     }      public static IConfiguration Configure(Action&lt;IConfiguration&gt; action)     {         action(_configuration);         return _configuration;     }      public static Message Process(Message message)     {         RequestMetadata metadata = _requests.FromSoapMessage(message);         return Process(metadata);     }      public static void ProcessOneWay(Message message)     {         RequestMetadata metadata = _requests.FromSoapMessage(message);         ProcessOneWay(metadata);     } } <\/code><\/pre>\n<p>  <code>NeliburSoapService<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u0443\u0435\u0442 <code>RequestMetadataMap<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>RequestMetadata<\/code> \u0434\u043b\u044f SOAP <code>Message<\/code>.<br \/>  \u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0434\u0435\u0441\u044c:   <\/p>\n<ul>\n<li>\n<pre><code class=\"cs\">RequestMetadata requestMetaData = _requests.FromSoapMessage(message) <\/code><\/pre>\n<\/li>\n<li>\n<pre><code class=\"cs\">context.Process(requestMetaData). <\/code><\/pre>\n<\/li>\n<\/ul>\n<p>  SoapRequestMetadata \u2014 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0442\u0438\u043f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 CRUD, \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (Request), \u0435\u0433\u043e \u0442\u0438\u043f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.  <\/p>\n<pre><code class=\"cs\">internal sealed class SoapRequestMetadata : RequestMetadata {     private readonly MessageVersion _messageVersion;     private readonly object _request;      internal SoapRequestMetadata(Message message, Type targetType) : base(targetType)     {         _messageVersion = message.Version;         _request = CreateRequest(message, targetType);         OperationType = SoapOperationTypeHeader.ReadHeader(message);     }      public override string OperationType { get; protected set; }      public override Message CreateResponse(object response)     {         return Message.CreateMessage(_messageVersion, SoapServiceMetadata.Action.ProcessResponse, response);     }      public override TRequest GetRequest&lt;TRequest&gt;()     {         return (TRequest)_request;     }      private static object CreateRequest(Message message, Type targetType)     {         using (XmlDictionaryReader reader = message.GetReaderAtBodyContents())         {             var serializer = new DataContractSerializer(targetType);             return serializer.ReadObject(reader);         }     } } <\/code><\/pre>\n<p>  \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e CRUD-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <code>RequestProcessor<\/code>. <code>RequestProcessor<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>RequestMetadata<\/code> \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043b\u0430\u0441\u0441\u0443 <code>SoapServiceClient<\/code>.  <\/p>\n<pre><code class=\"cs\">internal sealed class RequestProcessor&lt;TRequest, TProcessor&gt; : IRequestProcessor     where TRequest : class     where TProcessor : IRequestOperation {     private readonly Func&lt;TProcessor&gt; _creator;      public RequestProcessor(Func&lt;TProcessor&gt; creator)     {         _creator = creator;     }      public Message Process(RequestMetadata metadata)     {         switch (metadata.OperationType)         {             case OperationType.Get:                 return Get(metadata);             case OperationType.Post:                 return Post(metadata);             case OperationType.Put:                 return Put(metadata);             case OperationType.Delete:                 return Delete(metadata);             default:                 string message = string.Format(&quot;Invalid operation type: {0}&quot;, metadata.OperationType);                 throw Error.InvalidOperation(message);         }     }      public void ProcessOneWay(RequestMetadata metadata)     {         switch (metadata.OperationType)         {             case OperationType.Get:                 GetOneWay(metadata);                 break;             case OperationType.Post:                 PostOneWay(metadata);                 break;             case OperationType.Put:                 PutOneWay(metadata);                 break;             case OperationType.Delete:                 DeleteOneWay(metadata);                 break;             default:                 string message = string.Format(&quot;Invalid operation type: {0}&quot;, metadata.OperationType);                 throw Error.InvalidOperation(message);         }     }      private Message Delete(RequestMetadata metadata)     {         var service = (IDelete&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.Delete(request);         return metadata.CreateResponse(result);     }      private void DeleteOneWay(RequestMetadata metadata)     {         var service = (IDeleteOneWay&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.DeleteOneWay(request);     }      private Message Get(RequestMetadata metadata)     {         var service = (IGet&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.Get(request);         return metadata.CreateResponse(result);     }      private void GetOneWay(RequestMetadata metadata)     {         var service = (IGetOneWay&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.GetOneWay(request);     }      private Message Post(RequestMetadata metadata)     {         var service = (IPost&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.Post(request);         return metadata.CreateResponse(result);     }      private void PostOneWay(RequestMetadata metadata)     {         var service = (IPostOneWay&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.PostOneWay(request);     }      private Message Put(RequestMetadata metadata)     {         var service = (IPut&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.Put(request);         return metadata.CreateResponse(result);     }      private void PutOneWay(RequestMetadata metadata)     {         var service = (IPutOneWay&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.PutOneWay(request);     } }<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/h2>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u0431\u044a\u044f\u0432\u0438\u043c data contracts:  <\/p>\n<ul>\n<li><code>CreateClientRequest<\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 <\/li>\n<li><code>UpdateClientRequest<\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 email \u043a\u043b\u0438\u0435\u043d\u0442\u0430 <\/li>\n<li><code>GetClientRequest<\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e id <\/li>\n<li><code>ClientResponse<\/code> \u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435 <\/li>\n<li><code>RemoveClientRequest<\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 <\/li>\n<\/ul>\n<h4>Server&#8217;s side<\/h4>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u0439:  <\/p>\n<pre><code class=\"xml\">&lt;configuration&gt;      &lt;!--WCF--&gt;     &lt;system.serviceModel&gt;         &lt;services&gt;             &lt;service name=&quot;Nelibur.ServiceModel.Services.Default.SoapServicePerCall&quot;&gt;                 &lt;endpoint address=&quot;http:\/\/localhost:5060\/service&quot; binding=&quot;basicHttpBinding&quot;                           bindingConfiguration=&quot;ServiceBinding&quot;                           contract=&quot;Nelibur.ServiceModel.Contracts.ISoapService&quot; \/&gt;             &lt;\/service&gt;         &lt;\/services&gt;         &lt;bindings&gt;             &lt;basicHttpBinding&gt;                 &lt;binding name=&quot;ServiceBinding&quot;&gt;                     &lt;security mode=&quot;None&quot;&gt;                         &lt;transport clientCredentialType=&quot;None&quot; \/&gt;                     &lt;\/security&gt;                 &lt;\/binding&gt;             &lt;\/basicHttpBinding&gt;         &lt;\/bindings&gt;     &lt;\/system.serviceModel&gt;      &lt;startup&gt;         &lt;supportedRuntime version=&quot;v4.0&quot; sku=&quot;.NETFramework,Version=v4.5&quot; \/&gt;     &lt;\/startup&gt; &lt;\/configuration&gt; <\/code><\/pre>\n<p>  WCF-\u0441\u0435\u0440\u0432\u0438\u0441 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0440\u043e\u0441\u0442:  <\/p>\n<pre><code class=\"cs\">[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public sealed class SoapServicePerCall : ISoapService {     \/\/\/ &lt;summary&gt;     \/\/\/     Process message with response.     \/\/\/ &lt;\/summary&gt;     \/\/\/ &lt;param name=&quot;message&quot;&gt;Request message.&lt;\/param&gt;     \/\/\/ &lt;returns&gt;Response message.&lt;\/returns&gt;     public Message Process(Message message)     {         return NeliburSoapService.Process(message);     }      \/\/\/ &lt;summary&gt;     \/\/\/     Process message without response.     \/\/\/ &lt;\/summary&gt;     \/\/\/ &lt;param name=&quot;message&quot;&gt;Request message.&lt;\/param&gt;     public void ProcessOneWay(Message message)     {         NeliburSoapService.ProcessOneWay(message);     } } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u044b \u043c\u043e\u0436\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435. \u0421\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/martinfowler.com\/bliki\/CQRS.html\">\u0441\u0442\u0430\u0442\u044c\u044e \u041c\u0430\u0440\u0442\u0438\u043d\u0430 \u0424\u0430\u0443\u043b\u0435\u0440\u0430 \u043e CQRS<\/a>. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440. \u041a\u043e\u0434 \u0441\u0432\u044f\u0437\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432:  <\/p>\n<pre><code class=\"cs\">private static void BindRequestToProcessors() {     NeliburSoapService.Configure(x =&gt;         {             x.Bind&lt;CreateClientRequest, ClientProcessor&gt;();             x.Bind&lt;UpdateClientRequest, ClientProcessor&gt;();             x.Bind&lt;DeleteClientRequest, ClientProcessor&gt;();             x.Bind&lt;GetClientRequest, ClientProcessor&gt;();         }); } <\/code><\/pre>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, <code>ClientProcessor<\/code>:  <\/p>\n<pre><code class=\"cs\">public sealed class ClientProcessor : IPost&lt;CreateClientRequest&gt;,                                         IGet&lt;GetClientRequest&gt;,                                         IDeleteOneWay&lt;DeleteClientRequest&gt;,                                         IPut&lt;UpdateClientRequest&gt; {     private static List&lt;Client&gt; _clients = new List&lt;Client&gt;();      public void DeleteOneWay(DeleteClientRequest request)     {         Console.WriteLine(&quot;Delete Request: {0}\\n&quot;, request);         _clients = _clients.Where(x =&gt; x.Id != request.Id).ToList();     }      public object Get(GetClientRequest request)     {         Console.WriteLine(&quot;Get Request: {0}&quot;, request);         Client client = _clients.Single(x =&gt; x.Id == request.Id);         return new ClientResponse { Id = client.Id, Email = client.Email };     }      public object Post(CreateClientRequest request)     {         Console.WriteLine(&quot;Post Request: {0}&quot;, request);         var client = new Client         {             Id = Guid.NewGuid(),             Email = request.Email         };         _clients.Add(client);         return new ClientResponse { Id = client.Id, Email = client.Email };     }      public object Put(UpdateClientRequest request)     {         Console.WriteLine(&quot;Put Request: {0}&quot;, request);         Client client = _clients.Single(x =&gt; x.Id == request.Id);         client.Email = request.Email;         return new ClientResponse { Id = client.Id, Email = client.Email };     } } <\/code><\/pre>\n<h4>Client&#8217;s side<\/h4>\n<p>  \u041a\u043e\u0434 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442:  <\/p>\n<pre><code class=\"cs\">private static void Main() {     var client = new SoapServiceClient(&quot;NeliburSoapService&quot;);      var createRequest = new CreateClientRequest         {             Email = &quot;email@email.com&quot;         };     Console.WriteLine(&quot;POST Request: {0}&quot;, createRequest);     ClientResponse response = client.Post&lt;ClientResponse&gt;(createRequest);     Console.WriteLine(&quot;POST Response: {0}\\n&quot;, response);      var updateRequest = new UpdateClientRequest         {             Email = &quot;new@email.com&quot;,             Id = response.Id         };      Console.WriteLine(&quot;PUT Request: {0}&quot;, updateRequest);     response = client.Put&lt;ClientResponse&gt;(updateRequest);     Console.WriteLine(&quot;PUT Response: {0}\\n&quot;, response);      var getClientRequest = new GetClientRequest         {             Id = response.Id         };     Console.WriteLine(&quot;GET Request: {0}&quot;, getClientRequest);     response = client.Get&lt;ClientResponse&gt;(getClientRequest);     Console.WriteLine(&quot;GET Response: {0}\\n&quot;, response);      var deleteRequest = new DeleteClientRequest         {             Id = response.Id         };     Console.WriteLine(&quot;DELETE Request: {0}&quot;, deleteRequest);     client.Delete(deleteRequest);      Console.ReadKey(); } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<br \/>  \u043a\u043b\u0438\u0435\u043d\u0442:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/df8\/366\/66e\/df836666e51ecd28c6e70f8c700950f6.jpg\" alt=\"\u043a\u043b\u0438\u0435\u043d\u0442\"\/><\/p>\n<p>  \u0441\u0435\u0440\u0432\u0438\u0441:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/2c2\/47b\/26b\/2c247b26b3d69de4e5c60965ada79fee.jpg\" alt=\"\u0441\u0435\u0440\u0432\u0438\u0441\"\/><\/p>\n<h2>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435<\/h2>\n<p>  \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c. \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c, <a href=\"http:\/\/habrahabr.ru\/post\/218149\/\">\u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u044c RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 WCF \u0438 Nelibur<\/a>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e (\u043f\u0435\u0440\u0435\u0432\u043e\u0434). \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u043e <a href=\"http:\/\/www.codeproject.com\/Articles\/598157\/Building-SOAP-Message-Based-Web-Services-with-WCF\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430<\/a> \u0438\u043b\u0438 \u0441 <a href=\"https:\/\/github.com\/Nelibur\/Nelibur\">GitHub<\/a>.   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/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=\"http:\/\/habrahabr.ru\/post\/223685\/\"> http:\/\/habrahabr.ru\/post\/223685\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">       WCF \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u0435 \u043a\u0430\u043a \u0444\u0440\u044d\u0439\u043c\u0432\u043e\u0440\u043a, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f. \u041d\u043e WCF&#8217;s design style \u043c\u0435\u043d\u044f \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e DTO \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. <\/p>\n<p>  WCF \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:  <\/p>\n<ul>\n<li> \u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/li>\n<li> \u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e API.<\/li>\n<li> Service Contract \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.<\/li>\n<li> \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DataContract \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c.<\/li>\n<li> \u0414\u0440\u0443\u0433\u0438\u0435 \u043d\u0435 .NET \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 RPC (Remote Procedure Call) \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439. \u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c, \u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 API \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c:  <\/p>\n<ul>\n<li>\u041e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. <\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/dataTransferObject.html\">DTO<\/a>. <\/li>\n<\/ul>\n<p>  \u0412\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445, \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 WCF \u043f\u0443\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 SOAP \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 (\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435)  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-223685","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/223685","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=223685"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/223685\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=223685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=223685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=223685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}