{"id":218149,"date":"2014-04-09T16:14:13","date_gmt":"2014-04-09T12:14:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=218149"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=218149","title":{"rendered":"<span class=\"post_title\">\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 RESTful Message Based \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 WCF<\/span>"},"content":{"rendered":"<div class=\"content html_format\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043e \u0442\u043e\u043c, <a href=\"http:\/\/www.codeproject.com\/Articles\/598157\/Building-SOAP-Message-Based-Web-Services-with-WCF\">\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c SOAP Message Based \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 WCF<\/a>. \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 RESTful Message Based \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 WCF. \u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043e <a href=\"http:\/\/en.wikipedia.org\/wiki\/Representational_state_transfer\">REST<\/a> \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 WCF. \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd203052.aspx\">A Guide to Designing and Building RESTful Web Services with WCF 3.5<\/a>.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u0438\u0437\u0430\u0439\u043d\u0430 RESTful. \u0412\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:  <\/p>\n<ul>\n<li>\u041e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \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\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \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>  <a name=\"habracut\"><\/a><br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c WCF \u0432\u0435\u0431 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0421\u0430\u043d\u0442\u044b \u041a\u043b\u0430\u0443\u0441\u0430. \u0421\u0430\u043d\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c REST \u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u044e\u0431\u0438\u0442 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Open_Data_Protocol\">Open Data Protocol (OData)<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0432\u044b\u0434\u0432\u0438\u043d\u0443\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<ul>\n<li>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c RESTful API<\/li>\n<li>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c:\n<ul>\n<li>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043e\u043a.<\/li>\n<li>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043e\u043a.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043e\u043a\u043f\u043e \u0421\u0442\u0430\u0442\u0443\u0441\u0443 \u0438 \u0421\u0442\u0440\u0430\u043d\u0435.<\/li>\n<li>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043e\u043a\u043f\u043e Id.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0441\u0442\u0438\u043b\u0435 RESTful, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <b>\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043e\u043a <\/b>(\u0434\u0430\u043b\u0435\u0435 PresentRequest). PresentRequest \u2014 \u044d\u0442\u043e <a href=\"http:\/\/martinfowler.com\/bliki\/DDD_Aggregate.html\">\u0430\u0433\u0440\u0435\u0433\u0430\u0442<\/a> \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">PresentRequest<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class PresentRequest {     public Address Address { get; set; }     public Guid Id { get; set; }     public PresentRequestStatus Status { get; set; }     public string Wish { get; set; } }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Address<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class Address {     public string Country { get; set; }     public string Recipient { get; set; }     public string StreetAddress { get; set; }     public int ZipCode { get; set; } }   <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">PresentRequestStatus<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public enum PresentRequestStatus {     Pending,     Accepted,     Rejected,     Completed }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<h3>RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 WCF: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Save<\/code>.<\/p>\n<h5>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 PresentRequest<\/h5>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">public void Save(PresentRequest request)  <\/code><\/pre>\n<p>  \u041a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441. \u041c\u0435\u0442\u043e\u0434 <code>Save<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>void<\/code>, \u0442.\u043a. \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e <code>Id <\/code>\u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u043b\u0435\u0447\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f RESTful, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>Save<\/code> \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>WebInvoke<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP-\u043c\u0435\u0442\u043e\u0434. \u0412\u043e\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e HTTP \u043c\u0435\u0442\u043e\u0434\u0430\u043c:  <\/p>\n<table>\n<tbody>\n<tr>\n<td> <b>Operation<\/b>   <\/td>\n<td> <b>HTTP<\/b>   <\/td>\n<\/tr>\n<tr>\n<td> Create   <\/td>\n<td> PUT \/ POST   <\/td>\n<\/tr>\n<tr>\n<td> Read   <\/td>\n<td> GET   <\/td>\n<\/tr>\n<tr>\n<td> Update   <\/td>\n<td> PUT \/ PATCH   <\/td>\n<\/tr>\n<tr>\n<td> Delete   <\/td>\n<td> DELETE   <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 <i>ServiceContract<\/i>:  <\/p>\n<pre><code class=\"cs\">[ServiceContract] public interface IPresentRequestService {     [WebInvoke(Method = &quot;POST&quot;, UriTemplate = &quot;requests&quot;)]     [OperationContract]     void Save(PresentRequest request); }  <\/code><\/pre>\n<p>  <i>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: ServiceContract \u2014 \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e. \u0412\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 ServiceContract, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u043b\u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435.<\/i><\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 Save \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a \u043f\u043b\u044e\u0441\u044b, \u0442\u0430\u043a \u0438 \u043c\u0438\u043d\u0443\u0441\u044b.<br \/>  <b>\u041f\u043b\u044e\u0441\u044b<\/b>:  <\/p>\n<ul>\n<li>\u041c\u0435\u0442\u043e\u0434 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044f \u0432 <code>PresentRequest<\/code><\/li>\n<li>\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b URL<\/li>\n<\/ul>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0437\u043d\u0430\u044e\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 <a href=\"http:\/\/en.wikipedia.org\/wiki\/The_Mythical_Man-Monthhttp:\/\/\">\u00ab\u041c\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u043c\u0435\u0441\u044f\u0446\u00bb<\/a> \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u041f\u041e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u0430. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a <i>ServiceContract<\/i>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0433\u0438\u0431\u043a\u0438\u043c \u043d\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<br \/>  <b>\u041c\u0438\u043d\u0443\u0441\u044b<\/b>:  <\/p>\n<ul>\n<li>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>Save<\/code>, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 <code>PresentRequest <\/code> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442. \u041d\u043e \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Object-oriented_programming\">\u041e\u041e\u041f<\/a>?<\/li>\n<\/ul>\n<p>  \u042f \u0437\u043d\u0430\u044e \u043e <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.runtime.serialization.knowntypeattribute.aspxhttp:\/\/\">KnownTypeAttribute<\/a>, \u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0439\u0434\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>Create<\/code>, <code>Update <\/code>\u0438 <code>Delete <\/code>\u0438\u043c\u0435\u044e\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f Get \u2014 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u044f\u0432\u0437\u044f\u0435\u0442\u0441\u044f, \u0438\u043c\u0445\u043e, \u0441\u0430\u043c\u044b\u043c \u0442\u0440\u0443\u0434\u043d\u044b\u043c \u0432 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c.<\/p>\n<h5>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 PresentRequests<\/h5>\n<p>  \u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Get \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Query_string\">\u0441\u0442\u0440\u043e\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>PresentRequest<\/code> \u043f\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0443 \u0438 \u0441\u0442\u0440\u0430\u043d\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435  <\/p>\n<pre><code class=\"cs\">[WebGet(UriTemplate = &quot;requests?country={country}&status={status}&quot;)] [OperationContract] List&lt;PresentRequest&gt; Get(string country, string status); <\/code><\/pre>\n<p>  <b>\u041f\u043b\u044e\u0441\u044b<\/b>:  <\/p>\n<ul>\n<li>\u0427\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 URL, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"http:\/\/SantaClaus.org\/requests?country=sheldonopolis&#038;status=pending\">SantaClaus.org\/requests?country=sheldonopolis&#038;status=pending<\/a>.<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>Get<\/code>. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0431\u0435\u0437 WCF.  <\/p>\n<pre><code class=\"cs\">public interface IPresentRequestService {     List&lt;PresentRequest&gt; Get(string country, string status); }  <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u2014 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u2014 \u0445\u0440\u0443\u043f\u043a\u0438\u0439 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u043f\u0430\u0448\u043e\u043a. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>Get<\/code> \u0432 \u0441\u0442\u0438\u043b\u0435 RESTful \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0443\u0434\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u043e\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<br \/>  \u0412\u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:  <\/p>\n<pre><code class=\"cs\">public interface IPresentRequestService {     List&lt;PresentRequest&gt; Get(PresentRequestQuery query); } <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 <code>PresentRequestQuery<\/code>:  <\/p>\n<pre><code class=\"cs\">public class PresentRequestQuery {     public string Country { get; set; }     public string Status { get; set; } }  <\/code><\/pre>\n<p>  <b>\u041c\u0438\u043d\u0443\u0441\u044b<\/b>:<br \/>  \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u043c\u0435\u0442\u043e\u0434 <code>Get<\/code> \u0438\u043c\u0435\u0435\u0442 \u0445\u0440\u0443\u043f\u043a\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437 breaking changes \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Get \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Query_string\">\u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a> \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Get<\/code>. \u0421\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442.\u043a. WCF \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440: URL <a href=\"http:\/\/SantaClaus.org\/requests?country=sheldonopolis&#038;status=pending\">SantaClaus.org\/requests?country=sheldonopolis&#038;status=pending<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>PresentReuqest<\/code>s \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0435 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0443.<br \/>  \u0412\u043e\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 WCF-\u0441\u0435\u0440\u0432\u0438\u0441\u0435:  <\/p>\n<pre><code class=\"cs\">public List&lt;PresentRequest&gt; Get(string country, string status) {     throw new NotImplementedException(); }  <\/code><\/pre>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 country \u0438 status \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 <code>country<\/code> \u0438 <code>status<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, WCF \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:  <\/p>\n<pre><code class=\"cs\">public class PresentRequestQuery {     public string Country { get; set; }     public string Status { get; set; } } <\/code><\/pre>\n<p>   \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 <code>country=sheldonopolis&status=pending<\/code>, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>PresentRequestQuery<\/code> \u0438 \u043c\u0435\u0442\u043e\u0434 <code>Get<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cs\">public List&lt;PresentRequest&gt; Get(PresentRequestQuery query) {     throw new NotImplementedException(); }  <\/code><\/pre>\n<p>  \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Get, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u044b \u0438\u043c\u0435\u0435\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0438\u0437 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd203052.aspx\">WCF&#8217;s Guide to Designing and Building RESTful Web Services<\/a>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">BookmarkService<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[ServiceContract] public partial class BookmarkService {     [WebGet(UriTemplate = &quot;?tag={tag}&quot;)]     [OperationContract]     Bookmarks GetPublicBookmarks(string tag) {...}          [WebGet(UriTemplate = &quot;{username}?tag={tag}&quot;)]     [OperationContract]     Bookmarks GetUserPublicBookmarks(string username, string tag) {...}          [WebGet(UriTemplate = &quot;users\/{username}\/bookmarks?tag={tag}&quot;)]     [OperationContract]     Bookmarks GetUserBookmarks(string username, string tag) {...}          [WebGet(UriTemplate = &quot;users\/{username}\/profile&quot;)]     [OperationContract]     UserProfile GetUserProfile(string username) {...}          [WebGet(UriTemplate = &quot;users\/{username}&quot;)]     [OperationContract]     User GetUser(string username) {...}          [WebGet(UriTemplate = &quot;users\/{username}\/bookmarks\/{bookmark_id}&quot;)]     [OperationContract]     Bookmark GetBookmark(string username, string bookmark_id) {...}     ... }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 WCF \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0440\u044e\u043a \u043c\u043e\u0433 \u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043c\u0435\u0442\u043e\u0434 Get \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443. \u0422\u0430\u043a \u0432\u0438\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0438 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Polymorphism_(computer_science)\">\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c<\/a>.  <\/p>\n<pre><code class=\"cs\">Message Get (Message request); <\/code><\/pre>\n<p>  <b>\u041c\u0438\u043d\u0443\u0441\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>Get<\/code><\/b>:  <\/p>\n<ul>\n<li>\u041c\u0435\u0442\u043e\u0434\u044b \u0442\u0440\u0443\u0434\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>Get<\/code><\/li>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u043c\u0435\u0439\u0442\u0435 \u0432\u0432\u0438\u0434\u0443, \u0447\u0442\u043e WCF SOAP \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c, \u0442\u043e\u0447\u043d\u0435\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Ad_hoc_polymorphism\">ad hoc polymorphism<\/a>), \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 <code>KnownTypeAttribute<\/code>, \u043d\u043e, \u043f\u043e-\u043c\u043e\u0435\u043c\u0443, WCF \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Parametric_polymorphism\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/a>.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  WCF \u043a\u0430\u043a RESTful \u0444\u0440\u044d\u0439\u043c\u0432\u043e\u0440\u043a \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, WCF \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<h3>RESTful Web Service \u043d\u0430 WCF: \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d<\/h3>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Get<\/code>. \u042f \u0434\u0443\u043c\u0430\u044e, \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 \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c.<\/p>\n<h4>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f URL<\/h4>\n<p>  \u041c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 <code>PresentRequestQuery<\/code>, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0433\u043e.  <\/p>\n<pre><code class=\"cs\">public class PresentRequestQuery {     public string Country { get; set; }     public string Status { get; set; } } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, <code>Get<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: <code>country=sheldonopolis&status=pending<\/code> \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c URL \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041d\u0430\u0448 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0448\u0438\u0442\u044c \u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb: <code>key1=value1&key2=value2&key3=value3 <\/code>.<br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0432\u0430 \u043a\u043b\u044e\u0447\u0430:<\/p>\n<ul>\n<li>\u0422\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/li>\n<\/ul>\n<p>  \u042f \u0432\u0438\u0436\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:  <\/p>\n<ol>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/li>\n<li>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 JSON<\/li>\n<li>\u0417\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c JSON <\/li>\n<\/ol>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0435: <code>type={request type}&data={request data}<\/code><br \/>  \u0412\u043e\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:  <\/p>\n<pre><code class=\"cs\">var query = new PresentRequestQuery {     Country = &quot;sheldonopolis&quot;,     Status = &quot;pending&quot; }; <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: <code>type=PresentRequestQuery&data=%7B%22Country%22%3A%22sheldonopolis%22%2C%22Status%22%3A%22pending%22%7D<\/code><br \/>  \u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>PresentRequestQuery<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CreateQueryParams&lt;T&gt;(T value)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private static NameValueCollection CreateQueryParams&lt;T&gt;(T value) {     string data = JsonDataSerializer.ToString(value);     var result = new NameValueCollection         {             { RestServiceMetadata.ParamName.Type, UrlEncode(typeof(T).Name) },             { RestServiceMetadata.ParamName.Data, UrlEncode(data) }         };     return result; }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>, \u0433\u0434\u0435 <code>UrlEncode<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u044c <code>Uri.EscapeDataString<\/code> \u0438 <code>JsonDataContractSerializer<\/code> \u2014 \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>DataContractJsonSerializer<\/code>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ToString&lt;T&gt;(T value)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public static string ToString&lt;T&gt;(T value) {     using (var stream = new MemoryStream())     {         var serializer = new DataContractJsonSerializer(typeof(T));         serializer.WriteObject(stream, value);         return Encoding.UTF8.GetString(stream.ToArray());     } }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e <a href=\"http:\/\/www.codeproject.com\/Articles\/598157\/Building-SOAP-Message-Based-Web-Services-with-WCF\">\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<\/a>. \u0414\u043b\u044f SOAP \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442: <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ISoapService<\/b><\/p>\n<div class=\"spoiler_text\"><code>SeriviceContract<\/code>:  <\/p>\n<pre><code class=\"cs\">[ServiceContract] public interface ISoapService {     [OperationContract(Action = ServiceMetadata.Action.Process)]     void Process(Message message);       [OperationContract(Action = ServiceMetadata.Action.ProcessWithResponse,         ReplyAction = ServiceMetadata.Action.ProcessResponse)]     Message ProcessWithResponse(Message message); }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0421\u0442\u0438\u043b\u044c RESTful \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: <code>Get, Post, Put, Delete<\/code> and <code>ServiceContract<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IJsonService<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[ServiceContract] public interface IJsonService {     [OperationContract]     [WebInvoke(Method = OperationType.Delete,         UriTemplate = RestServiceMetadata.Path.Delete,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     void Delete(Message message);       [OperationContract]     [WebInvoke(Method = OperationType.Delete,         UriTemplate = RestServiceMetadata.Path.DeleteWithResponse,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     Message DeleteWithResponse(Message message);       [OperationContract]     [WebGet(UriTemplate = RestServiceMetadata.Path.Get,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     void Get(Message message);       [OperationContract]     [WebGet(UriTemplate = RestServiceMetadata.Path.GetWithResponse,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     Message GetWithResponse(Message message);       [OperationContract]     [WebInvoke(Method = OperationType.Post,         UriTemplate = RestServiceMetadata.Path.Post,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     void Post(Message message);       [OperationContract]     [WebInvoke(Method = OperationType.Post,         UriTemplate = RestServiceMetadata.Path.PostWithResponse,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     Message PostWithResponse(Message message);       [OperationContract]     [WebInvoke(Method = OperationType.Put,         UriTemplate = RestServiceMetadata.Path.Put,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     void Put(Message message);       [OperationContract]     [WebInvoke(Method = OperationType.Put,         UriTemplate = RestServiceMetadata.Path.PutWithResponse,         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]     Message PutWithResponse(Message message); }  <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <code>IJsonService<\/code> \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Message<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f WCF(<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms734675.aspx\">MSDN<\/a>). \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u044d\u0442\u043e CRUD. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f IJsonService \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 URL \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 RESTful \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Parametric_polymorphism\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c<\/a>.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f RESTful \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h3>\n<p>  \u042f \u043d\u0435 \u0441\u0442\u0430\u043d\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u0442.\u043a. \u043e\u043d \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0441\u044f <a href=\"http:\/\/www.codeproject.com\/Articles\/598157\/Building-SOAP-Message-Based-Web-Services-with-WCF\">\u0440\u0430\u043d\u0435\u0435<\/a>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ClientProcessor<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public sealed class ClientProcessor : IPostWithResponse&lt;CreateClientRequest&gt;,                                       IGetWithResponse&lt;GetClientRequest&gt;,                                       IDelete&lt;DeleteClientRequest&gt;,                                       IPutWithResponse&lt;UpdateClientRequest&gt; {     private static List&lt;Client&gt; _clients = new List&lt;Client&gt;();       public void Delete(DeleteClientRequest request)     {         _clients = _clients.Where(x =&gt; x.Id != request.Id).ToList();     }       public object GetWithResponse(GetClientRequest request)     {         Client client = _clients.Single(x =&gt; x.Id == request.Id);         return new ClientResponse { Id = client.Id, Email = client.Email };     }       public object PostWithResponse(CreateClientRequest 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 PutWithResponse(UpdateClientRequest 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<\/div>\n<\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/9c2\/df1\/289\/9c2df128928166f4efee9d2abec3b120.jpg\" alt=\"image\"\/><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 CRUD-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ServiceProcessor<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public abstract class ServiceProcessor {     internal static readonly RequestMetadataMap _requests = new RequestMetadataMap();     protected static readonly Configuration _configuration = new Configuration();     private static readonly RequestProcessorMap _requestProcessors = new RequestProcessorMap();      protected static void Process(RequestMetadata requestMetaData)     {         IRequestProcessor processor = _requestProcessors.Get(requestMetaData.Type);         processor.Process(requestMetaData);     }      protected static Message ProcessWithResponse(RequestMetadata requestMetaData)     {         IRequestProcessor processor = _requestProcessors.Get(requestMetaData.Type);         return processor.ProcessWithResponse(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 new ArgumentNullException(&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<\/div>\n<\/div>\n<p>  \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 <code>ServiceProcessor<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RestServiceProcessor<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public sealed class RestServiceProcessor : ServiceProcessor {     private RestServiceProcessor()     {     }      public static IConfiguration Configure(Action&lt;IConfiguration&gt; action)     {         action(_configuration);         return _configuration;     }      public static void Process(Message message)     {         RequestMetadata metadata = _requests.FromRestMessage(message);         Process(metadata);     }      public static Message ProcessWithResponse(Message message)     {         RequestMetadata metadata = _requests.FromRestMessage(message);         return ProcessWithResponse(metadata);     } } <\/code><\/pre>\n<\/div>\n<\/div>\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\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 <code>Message<\/code>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RequestMetadataMap<\/b><\/p>\n<div class=\"spoiler_text\">\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 ServiceProcessor&quot;, typeName);         throw new InvalidOperationException(errorMessage);     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>IJsonService<\/code>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">JsonServicePerCall<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public sealed class JsonServicePerCall : IJsonService {     public void Delete(Message message)     {         RestServiceProcessor.Process(message);     }       public Message DeleteWithResponse(Message message)     {         return RestServiceProcessor.ProcessWithResponse(message);     }       public void Get(Message message)     {         RestServiceProcessor.Process(message);     }       public Message GetWithResponse(Message message)     {         return RestServiceProcessor.ProcessWithResponse(message);     }       public void Post(Message message)     {         RestServiceProcessor.Process(message);     }       public Message PostWithResponse(Message message)     {         return RestServiceProcessor.ProcessWithResponse(message);     }       public void Put(Message message)     {         RestServiceProcessor.Process(message);     }       public Message PutWithResponse(Message message)     {         return RestServiceProcessor.ProcessWithResponse(message);     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 RESTful.<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 \u0432 <code>RestRequestMetadata<\/code>, \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 URL. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>RestRequestMetadata<\/code>, \u044f \u0445\u043e\u0447\u0443 \u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f. <code>RestRequestMetadata<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>WebOperationContext<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RestRequestMetadata<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">internal sealed class RestRequestMetadata : RequestMetadata {     private readonly object _request;     private readonly WebOperationContext _webOperationContext;       internal RestRequestMetadata(Message message, Type targetType) : base(targetType)     {         _webOperationContext = WebOperationContext.Current;         OperationType = GetOperationType(message);         _request = CreateRequest(message, targetType);     }       public override string OperationType { get; protected set; }       public override Message CreateResponse(object response)     {         var serializer = new DataContractJsonSerializer(response.GetType());         return _webOperationContext.CreateJsonResponse(response, serializer);     }       public override TRequest GetRequest&lt;TRequest&gt;()     {         return (TRequest)_request;     }       private static object CreateRequestFromContent(Message message, Type targetType)     {         using (var stream = new MemoryStream())         {             XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream);             message.WriteMessage(writer);             writer.Flush();             var serializer = new DataContractJsonSerializer(targetType);             stream.Position = 0;             return serializer.ReadObject(stream);         }     }       private static string GetOperationType(Message message)     {         var httpReq = (HttpRequestMessageProperty)message.Properties[HttpRequestMessageProperty.Name];         return httpReq.Method;     }       private object CraeteRequestFromUrl(Type targetType)     {         UriTemplateMatch templateMatch = _webOperationContext.IncomingRequest.UriTemplateMatch;         NameValueCollection queryParams = templateMatch.QueryParameters;         return UrlSerializer.FromQueryParams(queryParams).GetRequestValue(targetType);     }       private object CreateRequest(Message message, Type targetType)     {         if (IsRequestByUrl())         {             return CraeteRequestFromUrl(targetType);         }           return CreateRequestFromContent(message, targetType);     }       private bool IsRequestByUrl()     {         return OperationType == Operations.OperationType.Get ||             OperationType == Operations.OperationType.Delete;     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412\u0441\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c RequestProcessor.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RequestProcessor&lt;TRequest, TProcessor&gt;<\/b><\/p>\n<div class=\"spoiler_text\">\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 void Process(RequestMetadata metadata)     {         switch (metadata.OperationType)         {             case OperationType.Get:                 Get(metadata);                 break;             case OperationType.Post:                 Post(metadata);                 break;             case OperationType.Put:                 Put(metadata);                 break;             case OperationType.Delete:                 Delete(metadata);                 break;             default:                 string message = string.Format(&quot;Invalid operation type: {0}&quot;, metadata.OperationType);                 throw new InvalidOperationException(message);         }     }       public Message ProcessWithResponse(RequestMetadata metadata)     {         switch (metadata.OperationType)         {             case OperationType.Get:                 return GetWithResponse(metadata);             case OperationType.Post:                 return PostWithResponse(metadata);             case OperationType.Put:                 return PutWithResponse(metadata);             case OperationType.Delete:                 return DeleteWithResponse(metadata);             default:                 string message = string.Format(&quot;Invalid operation type: {0}&quot;, metadata.OperationType);                 throw new InvalidOperationException(message);         }     }       private void Delete(RequestMetadata metadata)     {         var service = (IDelete&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.Delete(request);     }       private Message DeleteWithResponse(RequestMetadata metadata)     {         var service = (IDeleteWithResponse&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.DeleteWithResponse(request);         return metadata.CreateResponse(result);     }       private void Get(RequestMetadata metadata)     {         var service = (IGet&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.Get(request);     }       private Message GetWithResponse(RequestMetadata metadata)     {         var service = (IGetWithResponse&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.GetWithResponse(request);         return metadata.CreateResponse(result);     }       private void Post(RequestMetadata metadata)     {         var service = (IPost&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.Post(request);     }       private Message PostWithResponse(RequestMetadata metadata)     {         var service = (IPostWithResponse&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.PostWithResponse(request);         return metadata.CreateResponse(result);     }       private void Put(RequestMetadata metadata)     {         var service = (IPut&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         service.Put(request);     }       private Message PutWithResponse(RequestMetadata metadata)     {         var service = (IPutWithResponse&lt;TRequest&gt;)_creator();         var request = metadata.GetRequest&lt;TRequest&gt;();         object result = service.PutWithResponse(request);         return metadata.CreateResponse(result);     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<h3>\u041a\u043b\u0438\u0435\u043d\u0442 RESTful \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h3>\n<p>  \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.net.http.httpclient.aspx\">HttpClient<\/a>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void Delete&lt;TRequest&gt;(TRequest request)     where TRequest : class   public TResponse Delete&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public Task DeleteAsync&lt;TRequest&gt;(TRequest request)     where TRequest : class   public Task&lt;TResponse&gt; DeleteAsync&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public void Get&lt;TRequest&gt;(TRequest request)     where TRequest : class   public TResponse Get&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public Task GetAsync&lt;TRequest&gt;(TRequest request)     where TRequest : class   public Task&lt;TResponse&gt; GetAsync&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public void Post&lt;TRequest&gt;(TRequest request)     where TRequest : class   public TResponse Post&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public Task&lt;TResponse&gt; PostAsync&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public Task PostAsync&lt;TRequest&gt;(TRequest request)     where TRequest : class   public void Put&lt;TRequest&gt;(TRequest request)     where TRequest : class   public TResponse Put&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class   public Task PutAsync&lt;TRequest&gt;(TRequest request)     where TRequest : class   public Task&lt;TResponse&gt; PutAsync&lt;TRequest, TResponse&gt;(TRequest request)     where TRequest : class <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0421\u0430\u043d\u0442\u0443 \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u043c \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b\u0435\u043c RESTful \u2014 \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.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 RESTful \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h3>\n<p>  \u0421\u0430\u043d\u0442\u0430 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 RESTful \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043a\u0438 \u043f\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0443.  <\/p>\n<h4>\u0421\u0435\u0440\u0432\u0438\u0441<\/h4>\n<p>  \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u0439:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;   &lt;configuration&gt;       &lt;system.serviceModel&gt;         &lt;services&gt;             &lt;service name=&quot;Nelibur.ServiceModel.Services.JsonServicePerCall&quot;&gt;                 &lt;host&gt;                     &lt;baseAddresses&gt;                         &lt;add baseAddress=&quot;http:\/\/localhost:9090\/requests&quot; \/&gt;                     &lt;\/baseAddresses&gt;                 &lt;\/host&gt;                 &lt;endpoint binding=&quot;webHttpBinding&quot;                           contract=&quot;Nelibur.ServiceModel.Contracts.IJsonService&quot; \/&gt;             &lt;\/service&gt;         &lt;\/services&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<\/div>\n<\/div>\n<p>  <code>JsonServicePerCall<\/code> \u0438 <code>IJsonService<\/code> \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0434\u0435\u043d\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0411\u0438\u043d\u0434\u0438\u043d\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e <code>PresentRequestProcessor<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c <code>PresentRequest<\/code> \u0438 <code>PresentRequestQuery<\/code>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private static void Main() {     RestServiceProcessor.Configure(x =&gt;     {         x.Bind&lt;PresentRequest, PresentRequestProcessor&gt;();         x.Bind&lt;PresentRequestQuery, PresentRequestProcessor&gt;();         x.Bind&lt;UpdatePresentRequestStatus, PresentRequestProcessor&gt;();         x.Bind&lt;DeletePresentRequestsByStatus, PresentRequestProcessor&gt;();     });      using (var serviceHost = new WebServiceHost(typeof(JsonServicePerCall)))     {         serviceHost.Open();          Console.WriteLine(&quot;Santa Clause Service has started&quot;);         Console.ReadKey();          serviceHost.Close();     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, <code>PresentRequestProcessor<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a Get, Post, Put and Delete \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0434\u0430\u0440\u043a\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">PresentRequestProcessor<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public sealed class PresentRequestProcessor : IPost&lt;PresentRequest&gt;,                                               IPost&lt;UpdatePresentRequestStatus&gt;,                                               IGetWithResponse&lt;PresentRequestQuery&gt;,                                               IDelete&lt;DeletePresentRequestsByStatus&gt; {     private static List&lt;PresentRequest&gt; _requests = new List&lt;PresentRequest&gt;();      public void Delete(DeletePresentRequestsByStatus request)     {         var status = (PresentRequestStatus)Enum.Parse(typeof(PresentRequestStatus), request.Status);         _requests = _requests.Where(x =&gt; x.Status != status).ToList();         Console.WriteLine(&quot;Request list was updated, current count: {0}&quot;, _requests.Count);     }      public object GetWithResponse(PresentRequestQuery request)     {         Console.WriteLine(&quot;Get Present Requests by: {0}&quot;, request);         var status = (PresentRequestStatus)Enum.Parse(typeof(PresentRequestStatus), request.Status);         return _requests.Where(x =&gt; x.Status == status)                         .Where(x =&gt; x.Address.Country == request.Country)                         .ToList();     }      public void Post(PresentRequest request)     {         request.Status = PresentRequestStatus.Pending;         _requests.Add(request);         Console.WriteLine(&quot;Request was added, Id: {0}&quot;, request.Id);     }      public void Post(UpdatePresentRequestStatus request)     {         Console.WriteLine(&quot;Update requests on status: {0}&quot;, request.Status);         var status = (PresentRequestStatus)Enum.Parse(typeof(PresentRequestStatus), request.Status);         _requests.ForEach(x =&gt; x.Status = status);     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<h4>\u041a\u043b\u0438\u0435\u043d\u0442<\/h4>\n<p>  \u041a\u043e\u0434 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0430\u043c\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0438\u0435\u043d\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private static void Main() {     var client = new JsonServiceClient(&quot;http:\/\/localhost:9090\/requests&quot;);      var presentRequest = new PresentRequest         {             Id = Guid.NewGuid(),             Address = new Address                 {                     Country = &quot;sheldonopolis&quot;,                 },             Wish = &quot;Could you please help developers to understand, &quot; +                    &quot;WCF is awesome only with Nelibur&quot;         };     client.Post(presentRequest);      var requestQuery = new PresentRequestQuery         {             Country = &quot;sheldonopolis&quot;,             Status = PresentRequestStatus.Pending.ToString()         };     List&lt;PresentRequest&gt; pendingRequests = client.Get&lt;PresentRequestQuery, List&lt;PresentRequest&gt;&gt;(requestQuery);     Console.WriteLine(&quot;Pending present requests count: {0}&quot;, pendingRequests.Count);      var updatePresentRequestStatus = new UpdatePresentRequestStatus         {             Status = PresentRequestStatus.Accepted.ToString()         };     client.Post(updatePresentRequestStatus);      var deleteByStatus = new DeletePresentRequestsByStatus         {             Status = PresentRequestStatus.Accepted.ToString()         };     client.Delete(deleteByStatus);      Console.WriteLine(&quot;Press any key for Exit&quot;);     Console.ReadKey(); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b <a href=\"http:\/\/www.telerik.com\/download\/fiddler\">Fiddler<\/a>:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/53f\/ebf\/986\/53febf9862733ac39b5db8b009251171.png\" alt=\"image\"\/><\/p>\n<h3>\u041a\u043e\u043d\u0435\u0446<\/h3>\n<p>  \u041f\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 \u2014 \u044d\u0442\u043e \u043c\u0435\u0433\u0430 \u043c\u043e\u0449\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c RESTful \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0421\u0430\u043d\u0442\u0430 \u0441\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 RESTful \u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u0430\u0440\u043a\u0430 \u043d\u0430 \u0420\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043e.<\/p>\n<p>  \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\/712689\/Building-RESTful-Message-Based-Web-Services-with-W\">\u0441\u0442\u0430\u0442\u044c\u0438-\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430<\/a> \u0438\u043b\u0438 \u0441 <a href=\"http:\/\/nelibur.org\/\">\u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>.<br \/>  \u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u0430\u043a\u0436\u0435 <a href=\"http:\/\/www.nuget.org\/packages\/Nelibur\/\">nuget package<\/a>.<\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0442\u0435\u043c\u0435: <a href=\"https:\/\/github.com\/ServiceStack\/ServiceStack\/wiki\/Advantages-of-message-based-web-services\">Advantages of message based web services<\/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\/218149\/\"> http:\/\/habrahabr.ru\/post\/218149\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043e \u0442\u043e\u043c, <a href=\"http:\/\/www.codeproject.com\/Articles\/598157\/Building-SOAP-Message-Based-Web-Services-with-WCF\">\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c SOAP Message Based \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 WCF<\/a>. \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 RESTful Message Based \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 WCF. \u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043e <a href=\"http:\/\/en.wikipedia.org\/wiki\/Representational_state_transfer\">REST<\/a> \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 WCF. \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd203052.aspx\">A Guide to Designing and Building RESTful Web Services with WCF 3.5<\/a>.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u0438\u0437\u0430\u0439\u043d\u0430 RESTful. \u0412\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c RESTful \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:  <\/p>\n<ul>\n<li>\u041e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \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\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \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>  <\/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-218149","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/218149","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=218149"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/218149\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=218149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=218149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=218149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}