{"id":320935,"date":"2021-04-06T03:00:21","date_gmt":"2021-04-06T03:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320935"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320935","title":{"rendered":"\u0423\u0447\u0438\u043c ASP.NET Core \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u044e\u043a\u0430\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Json Rpc 2.0"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0442 aspnet core? \u041c\u043d\u0435 \u0432\u043e\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e<\/em> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Json Rpc. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044f \u0438\u0441\u043a\u0430\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0445\u043e\u0442\u0435\u043b\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0448\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u0418\u043b\u0438 \u043e \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Json Rpc, \u0434\u0430\u0436\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0442\u0435\u043a\u0435\/\u044f\u0437\u044b\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Json Rpc, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 aspnet mvc.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"vvedenie\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0430\u0441\u043f\u043d\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0440\u0443\u0447\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439. \u0415\u0441\u043b\u0438 \u0438\u0445 \u043d\u0430\u0439\u0442\u0438 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0432\u0441\u044f\u043a\u0438\u0435 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u0440\u043e\u0439 \u044d\u0442\u0438 \u0440\u0443\u0447\u043a\u0438 \u2014 \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435. \u0427\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0435\u0449\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u0447\u0430\u0441\u0442\u043e \u0438 \u043d\u0435 \u043d\u0430 \u0441\u043b\u0443\u0445\u0443, \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u0433\u0430\u0439\u0434\u044b. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0430\u0440\u0430\u0445\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u0434 <strong>Aspnet<\/strong> \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f ASP.Net Core MVC, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u043d\u0430 2.2, \u0441 \u043f\u0440\u0438\u0446\u0435\u043b\u043e\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u0439\u0434\u0435\u0442 5.x \u0438 \u0434\u043e\u043f\u0438\u043b\u0438\u043c \u043f\u043e\u0434 \u043d\u0435\u0433\u043e.<\/p>\n<p>  \u0418 <strong>Json Rpc<\/strong> \u2014 <a href=\"https:\/\/www.jsonrpc.org\/specification\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b JSON RPC 2.0<\/a> \u043f\u043e\u0432\u0435\u0440\u0445 HTTP. <\/p><\/blockquote>\n<p>\u0415\u0449\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430: <code>method, params, request, notification<\/code>&#8230;<\/p>\n<p>  <\/p>\n<h2 id=\"zachem-vse-eto\">\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e?<\/h2>\n<p>  <\/p>\n<p>\u042f .NET \u0442\u0435\u0445\u043b\u0438\u0434 \u0432 \u0431\u0430\u043d\u043a\u0435 \u0422\u043e\u0447\u043a\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043d\u0430\u0434 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u043b\u044f \u0448\u0430\u0440\u043f\u043e\u0432\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0421\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0430 \u0431\u0438\u0437\u043d\u0435\u0441\u0443 \u2014 \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u0414\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u043f\u0440\u0438\u0447\u0435\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043c\u0435\u043d\u043e\u0432 \u043f\u043e\u0434 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u0438 \u0442\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c&#8230;<\/p>\n<p>  <\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e HTTP \u043f\u0440\u0438\u043d\u044f\u0442 Json Rpc 2.0. \u0410 \u0443 \u0448\u0430\u0440\u043f\u0438\u0441\u0442\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u2014 ASP.NET Core MVC, \u0438 \u043e\u043d \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043f\u043e\u0434 REST. \u0418 \u043d\u0430 \u043d\u0435\u043c \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e REST, JSON RPC, \u0438 \u043b\u044e\u0431\u043e\u0439 RPC \u0432\u043e\u043e\u0431\u0449\u0435 \u2014 \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435: \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0410 \u0435\u0449\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0432\u0441\u0435 \u043f\u043e HTTP. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c aspnet \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c? <strong>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e<\/strong>: \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0435\u043a\u043e\u0432, \u0438 \u0443 \u0432\u0441\u0435\u0445 Json Rpc \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e \u043d\u0430\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442 \u043f\u0438\u0442\u043e\u043d\u0438\u0441\u0442\u043e\u0432 \u043d\u0435 \u0437\u0430\u0445\u043e\u0434\u044f\u0442, \u0438 \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b aspnet-\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043b\u0438\u0448\u044c \u0431\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0443\u0436\u0435 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0410 \u0432\u0435\u0434\u044c \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u043b \u0441 \u0443\u043c\u0430, \u0447\u0438\u0442\u0430\u044f \u043a\u043e\u0434 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043a\u043e\u043b\u043b\u0435\u0433\u043e\u0439 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b <strong>\u043d\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 best practices, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0438<\/strong> \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u043e\u0442 \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430. \u041d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0442\u0435\u0440\u044f\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u044b\u0442 \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0435 \u0442\u0435\u0440\u044f\u043b \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c <strong>\u043d\u0435 \u0437\u0430\u0442\u0430\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438 \u0438 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438<\/strong>. \u0415\u0441\u043b\u0438 \u0442\u044b \u0442\u0440\u0438 \u0433\u043e\u0434\u0430 \u043f\u0438\u0448\u0435\u0448\u044c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 \u0448\u0430\u0440\u043f\u0435, \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0448\u044c \u043d\u0430 \u043c\u0438\u0434\u043b\u043e\u0441\u0435\u043d\u044c\u043e\u0440\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u0449\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0432 \u043f\u0443\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <code>if(cookie.Contains(userName))<\/code> \u2014 \u044d\u0442\u043e \u0431\u0435\u0434\u0430.<\/p>\n<p>  <\/p>\n<blockquote><p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 C#, \u0438 \u043d\u0435 \u0440\u0430\u0437. \u0418\u0449\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0412\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u043b\u0438\u0431\u043e \u0442\u0430\u0449\u0430\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e \u0432\u043d\u0438\u043a\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c. \u041b\u0438\u0431\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e\u0447\u0442\u0438 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0432 aspnet \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p><\/blockquote>\n<p>  <\/p>\n<h1 id=\"sobiraem-hotelki-i-pishem-kod\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0445\u043e\u0442\u0435\u043b\u043a\u0438 \u0438 \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h1>\n<p>  <\/p>\n<p>\u0427\u0435\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f? \u0427\u0442\u043e\u0431\u044b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043c\u0438\u0434\u043b\u0432\u0430\u0440\u0438, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 best practices \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f aspnet \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 as-is. \u0418 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 MVC \u043a\u043e\u0434\u0443. \u0422\u0430\u043a \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Json Rpc \u0442\u0435\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a!<\/p>\n<p>  <\/p>\n<h2 id=\"request-routing\">Request Routing<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, HTTP \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0438 \u043d\u0430\u043c \u043e\u0442 \u043d\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c POST \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 200 OK. \u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 JSON. \u0412\u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043f\u0438\u0448\u0435\u043c middleware \u0438 \u0437\u0430\u0436\u0438\u0432\u0435\u043c.<br \/>  \u041d\u043e \u043d\u0435 \u0442\u0443\u0442-\u0442\u043e \u0431\u044b\u043b\u043e! \u041c\u0438\u0434\u043b\u0432\u0430\u0440\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043e\u0434\u0438\u043d action, \u0430 \u0432 \u043d\u0435\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f <code>switch(request.Method)<\/code> \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u0438\u0437 DI \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043c. \u0410 \u043a\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043c\u0435\u0442\u043e\u0434\u0430? \u041f\u0435\u0440\u0435\u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u2014 \u044f\u0449\u0438\u043a \u041f\u0430\u043d\u0434\u043e\u0440\u044b: \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0441\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 \u0438 \u0434\u043b\u044f aspnet, \u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u041d\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435 \u0440\u043e\u043b\u0438 \u0438\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<br \/>  \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u043b\u0435\u0437\u0442\u044c \u0432 \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c controller \u0438 action, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0442\u0435\u043b\u043e HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 url.<\/p>\n<p>  <\/p>\n<h2 id=\"actionmethodselectorattribute\"><code>ActionMethodSelectorAttribute<\/code><\/h2>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u0415\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440, \u043d\u043e \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 \u043d\u0435\u043c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c. <code>IRouter<\/code> \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0438\u0441\u0430\u0442\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u043d\u0430\u0434\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 MVC \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0435\u0441\u0442\u044c Endpoint Routing, \u043d\u043e \u0432 2.2 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0448\u044c. \u041a\u043e\u0441\u0442\u044b\u043b\u0438 \u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0435ndpoint \u043d\u0430 \u0441\u0432\u043e\u0439 (\u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Endpoint Routing \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b) \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0432\u0437\u043b\u0435\u0442\u0435\u043b\u0438. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u044f\u043c\u043e \u0432 middleware \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 url, \u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e url \u0438\u0441\u043f\u043e\u0440\u0442\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d <code>ActionMethodSelectorAttribute<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>true\/false<\/code> \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 controller \u0438 action! \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430-\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0430 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0438 \u043a\u0430\u043a \u043d\u0435 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 &quot;\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c&quot; \u043c\u0435\u0442\u043e\u0434\u0430?<\/p>\n<p>  <\/p>\n<h2 id=\"conventions\">Conventions<\/h2>\n<p>  <\/p>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u043d\u043e \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e. \u0423 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435: <code>IControllerModelConvention<\/code>, <code>IActionModelConvention<\/code>. \u042d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043c\u043d\u043e\u0433\u0438\u043c Startup Filters: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0444\u0438\u043b\u044c\u0442\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e conventions \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c Json Rpc \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445. \u041d\u0435 \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u0438\u0434\u0435\u043c \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0443\u0442\u0438, \u0447\u0442\u043e \u0438 Microsoft: \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 <code>ControllerBase<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">public abstract class JsonRpcController : ControllerBase {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445. \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0430\u0447\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432 conventions \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u043b\u0438 \u043d\u0435\u0442. \u0412\u043e\u0442 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 ControllerConvention<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void Apply(ControllerModel controllerModel) {     if (!typeof(JsonRpcController).IsAssignableFrom(controllerModel.ControllerType))     {         return;     }      controllerModel.Selectors.Clear();     controllerModel.Filters.Insert(0, new ServiceFilterAttribute(typeof(JsonRpcFilter))); }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p><code>Selectors<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0438 \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u2014 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c MVC, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c. \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c <code>JsonRpcFilter<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 ActionResult.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0410 \u0432\u043e\u0442 ActionConvention<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void Apply(ActionModel actionModel) {     if (!typeof(JsonRpcController).IsAssignableFrom(actionModel.Controller.ControllerType))     {         return;     }      actionModel.Selectors.Clear();     actionModel.Selectors.Add(new SelectorModel()     {         AttributeRouteModel = new AttributeRouteModel() {Template = &quot;\/api\/jsonrpc&quot;},         ActionConstraints = {new JsonRpcAttribute()}     }); }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043d\u0430\u0448\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u043c\u044b \u043f\u043e\u0432\u0435\u0441\u0438\u043c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 route, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">class JsonRpcAttribute : ActionMethodSelectorAttribute {     public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)     {         var request = GetRequest();  \/\/ \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a          \/\/ return true \u0435\u0441\u043b\u0438 action \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:         return request.Method == action.DisplayName;     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u044f \u0432 \u044d\u0442\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435. \u041d\u0443 \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0441\u0435 \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 <code>Method<\/code>, \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"middleware\">Middleware<\/h2>\n<p>  <\/p>\n<p>\u041f\u0438\u0448\u0435\u043c middleware, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Json Rpc: \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 Content-Type, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e POST, \u0438 \u0442\u0435\u043b\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 JSON. \u0417\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <code>HttpContext.Items<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0437\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430: \u0443 middleware \u0435\u0449\u0435 \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0438\u043f\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>params<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 <code>JToken<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c middleware \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>IStartupFilter<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412\u043e\u043e\u0431\u0449\u0435, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043f\u043e\u0440\u043d\u043e\u0435, \u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u0435\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a middleware.<\/p>\n<p>  <\/p>\n<h2 id=\"parameter-binding\">Parameter Binding<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0441. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0430 middleware \u0438\u0437 <code>HttpContext.Items<\/code>, \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>JToken<\/code> \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442 \u0438 \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c JSON \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438\u0437 \u0442\u0435\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>[FromBody]<\/code>, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u201c\u0448\u0430\u043f\u043a\u0430\u201d \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430: id, \u0432\u0435\u0440\u0441\u0438\u044f, \u043c\u0435\u0442\u043e\u0434. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u201c\u0448\u0430\u043f\u043a\u043e\u0439\u201d: <code>Request&lt;MyModel&gt;<\/code> \u0438\u043b\u0438 <code>class MyModel: RequestBase<\/code>, \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0431\u044b \u0435\u0449\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u044b, \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u043f\u0430\u043b\u043e\u043a \u0432 \u043a\u043e\u043b\u0435\u0441\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"raznye-params\">\u0420\u0430\u0437\u043d\u044b\u0435 <code>params<\/code><\/h3>\n<p>  <\/p>\n<p>Json Rpc \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c <code>[]<\/code> \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c <code>{}<\/code>! \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0441\u043b\u0430\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432 \u0441\u0432\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u043b\u0430\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c. \u041d\u043e \u0432\u043e\u043e\u0431\u0449\u0435, \u043e\u0431\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 <code>params<\/code> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0431\u0438\u043d\u0434\u0438\u0442\u044c\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">{&quot;flag&quot;: true, &quot;data&quot;: &quot;value&quot;, &quot;user_id&quot;: 1} [1, &quot;value&quot;, true]<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cs\">public void DoSomething(int userId, string data, bool flag)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0437 \u043c\u044b \u0437\u0430\u043c\u0430\u0445\u043d\u0443\u043b\u0438\u0441\u044c \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0443\u0442\u0440\u0443\u0436\u0434\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u0438\u043c\u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"realizaciya\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u043c. \u0415\u0441\u0442\u044c <code>IModelBinder<\/code> \u0438 <code>IModelBinderProvider<\/code>, \u043d\u043e \u043e\u043d\u0438 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u043d\u0430 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0431\u0438\u043d\u0434\u0438\u0442\u044c. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, <code>int<\/code> \u0438\u043b\u0438 <code>DateTime<\/code>. \u041c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 aspnet, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u0438\u043d\u0434\u0435\u0440 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u043b\u044c\u0437\u044f. \u0415\u0441\u0442\u044c <code>IValueProvider<\/code>, \u043d\u043e \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b <code>FromBody<\/code>, <code>FromQuery<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IBinderTypeProviderMetadata<\/code>. \u041e\u043d \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 binder \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e!<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 FromParamsAttribute<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> [AttributeUsage(AttributeTargets.Parameter)] public class FromParamsAttribute : Attribute, IBindingSourceMetadata, IBinderTypeProviderMetadata {     public BindingSource BindingSource =&gt; BindingSource.Custom;     public Type BinderType =&gt; typeof(JsonRpcModelBinder); }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a conventions \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>IParameterModelConvention<\/code>. \u0422\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">`BindingInfo` \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void Apply(ParameterModel parameterModel) {     if (!typeof(JsonRpcController).IsAssignableFrom(parameterModel.Action.Controller.ControllerType))     {         return;     }      if (parameterModel.BindingInfo == null)     {         parameterModel.BindingInfo = new BindingInfo()         {             BinderType = typeof(JsonRpcModelBinder),             BindingSource = BindingSource.Custom         };     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 <code>BindingInfo == null<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c <code>FromParams<\/code> \u0438 \u0448\u0442\u0430\u0442\u043d\u044b\u0435 <code>FromQuery<\/code>, <code>FromServices<\/code>. \u041d\u0443 \u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e, convention \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442 <code>BindingInfo<\/code>, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 <code>FromParams<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"udobstva\">\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u0430<\/h3>\n<p>  <\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c <code>params<\/code> \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u0441\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 &quot;\u043a\u0430\u043a \u0435\u0441\u0442\u044c&quot;, \u0430 \u0432 \u043d\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0439? \u041d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0431\u0438\u043d\u0434\u0438\u0442\u044c <code>params<\/code> \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">{&quot;flag&quot;: true, &quot;data&quot;: &quot;value&quot;, &quot;user_id&quot;: 1}<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cs\">public void DoSomething(MyModel model)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0434\u0435\u0442 json-\u043c\u0430\u0441\u0441\u0438\u0432? \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a properties \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u0438 \u0431\u0438\u043d\u0434\u0438\u0442\u044c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u041d\u043e \u0438\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u044c, \u0442\u0430\u043a\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0431\u0438\u043d\u0434\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0442\u0438\u043f\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438\u2026 \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435: \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u0443 \u0444\u0438\u0447\u0443 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439. \u0414\u0430, \u043e\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u0447\u0442\u043e \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u043d\u0430\u0448 \u0430\u0442\u0440\u0438\u0431\u0443\u0442:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">BindingStyle<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public enum BindingStyle { Default, Object, Array }  ...  public FromParamsAttribute(BindingStyle bindingStyle) {     BindingStyle = bindingStyle; }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p><code>Default<\/code> \u2014 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 params \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. <code>Object<\/code> \u2014 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u0435\u043b json-\u043e\u0431\u044a\u0435\u043a\u0442, \u0438 \u043c\u044b \u0431\u0438\u043d\u0434\u0438\u043c \u0435\u0433\u043e \u0432 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. <code>Array<\/code> \u2014 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u0435\u043b json-\u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043c\u044b \u0431\u0438\u043d\u0434\u0438\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">\/\/ \u044d\u0442\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f: {&quot;flag&quot;: true, &quot;data&quot;: &quot;value&quot;, &quot;user_id&quot;: 1} \/\/ \u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u043e\u0439: [1, &quot;value&quot;, true] public void DoSomething1([FromParams(BindingStyle.Object)] MyModel model)  \/\/ \u044d\u0442\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f: [1, &quot;value&quot;, true] \/\/ \u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u043e\u0439: {&quot;flag&quot;: true, &quot;data&quot;: &quot;value&quot;, &quot;user_id&quot;: 1} public void DoSomething2([FromParams(BindingStyle.Array)] List&lt;object&gt; data)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u044e \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 <code>JsonRpcModelBinder<\/code>. \u041f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u0434 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430: \u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043e\u043d \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439. \u0420\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<h3 id=\"kak-sopostavit-imya-argumenta-i-klyuch-v-json-obekte\">\u041a\u0430\u043a \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u044e\u0447 \u0432 json-\u043e\u0431\u044a\u0435\u043a\u0442\u0435?<\/h3>\n<p>  <\/p>\n<p><code>JsonSerizlizer<\/code> \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 &quot;\u0432 \u043b\u043e\u0431&quot; \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 json \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u0430\u043a \u0448\u0430\u0440\u043f\u043e\u0432\u043e\u0435 \u0438\u043c\u044f property \u0438\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0417\u0430\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u0432 \u043a\u043b\u044e\u0447.<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">\/\/ \u0432\u043e\u0442 \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f {&quot;user_id&quot;: 1} =&gt; int userId  \/\/  \u0437\u0430\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0438 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 int userId =&gt; &quot;user_id&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0443\u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e &quot;json-\u0438\u043c\u044f&quot; \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c conventions, \u0442\u0430\u043c \u0438 \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>  <\/p>\n<h3 id=\"uchimsya-u-aspnet\">\u0423\u0447\u0438\u043c\u0441\u044f \u0443 aspnet<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u0434\u0430 \u0432 \u0431\u0438\u043d\u0434\u0435\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e, \u043a\u0430\u043a \u043d\u0438 \u043a\u0440\u0443\u0442\u0438. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <code>ModelBinder<\/code> \u0438 \u0432\u0437\u044f\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044b: \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<h3 id=\"registraciya-v-di-konteynere\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 DI-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435<\/h3>\n<p>  <\/p>\n<p>\u0411\u0438\u043d\u0434\u0435\u0440 \u2014 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 binder provider, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public Task BindModelAsync(ModelBindingContext context){     var service = context.HttpContext.RequestServices.GetServices&lt;IService&gt;();     \/\/ ... }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"error-handling\">Error handling<\/h2>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438. \u0415\u0449\u0435 \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0440\u0430\u0439\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f \u043d\u0438\u0445. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 exception-\u044b, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 Json Rpc \u043e\u0442\u0432\u0435\u0442, \u0443\u043c\u0435\u0442\u044c \u043f\u0440\u044f\u0442\u0430\u0442\u044c stack trace \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a (\u043c\u044b \u0436\u0435 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0441\u044b\u043f\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435?). \u0410 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u044e Json Rpc \u043e\u0448\u0438\u0431\u043a\u0443, \u0432\u0434\u0440\u0443\u0433 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445. <em>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0435\u0441\u044f\u0442\u043e\u0433\u043e <code>try\/catch \u0432\u043d\u0443\u0442\u0440\u0438 catch<\/code> \u043f\u043e\u043d\u0435\u0432\u043e\u043b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0441 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0435\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f exception-\u043e\u0432, \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439, \u0447\u0442\u043e \u0442\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e&#8230;<\/em><\/p>\n<p>  <\/p>\n<h3 id=\"action-vernul-plohoy-actionresult-ili-json-rpc-oshibku\">Action \u0432\u0435\u0440\u043d\u0443\u043b \u043f\u043b\u043e\u0445\u043e\u0439 ActionResult \u0438\u043b\u0438 Json Rpc \u043e\u0448\u0438\u0431\u043a\u0443<\/h3>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c <code>IActionFilter.OnResultExecuting<\/code> \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u0432 Json Rpc \u043e\u0442\u0432\u0435\u0442, \u043f\u043b\u043e\u0445\u043e\u0439 \u043e\u0442\u0432\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 404, \u0437\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u0432 Json Rpc \u043e\u0448\u0438\u0431\u043a\u0443. \u041d\u0443 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0443\u0436\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443.<\/p>\n<p>  <\/p>\n<h3 id=\"binding-failed\">Binding failed<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <code>IAlwaysRunResultFilter.OnActionExecuting<\/code>: \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c <code>context.ModelState.IsValid<\/code> \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u0443\u043f\u0430\u043b. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0435\u0440\u043d\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443 \u0431\u0438\u043d\u0434\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u0432 action \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u043a\u0440\u0438\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0430 <code>null<\/code> \u0438\u043b\u0438 <code>default<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>ApiControllerAttribute<\/code>: \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 400, \u0435\u0441\u043b\u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"chto-to-slomalos-v-pipeline\">\u0427\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c \u0432 pipeline<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 action \u0438\u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 pipeline \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 exception, \u0438\u043b\u0438 \u0440\u0435\u0448\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>HttpResponse<\/code>, \u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043c\u044b \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c, \u044d\u0442\u043e middleware. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438 \u0442\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: \u0435\u0441\u043b\u0438 HTTP \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0435 200 \u0438\u043b\u0438 \u0442\u0435\u043b\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043e\u0448\u0438\u0431\u043a\u0443. \u041a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 <code>HttpResponse.Body<\/code>, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"oshibki---eto-slozhno\">\u041e\u0448\u0438\u0431\u043a\u0438 \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u044b), \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435, \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c exception-\u044b, \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">class JsonRpcErrorFactory{     IError NotFound(object errorData){...}     IError InvalidRequest(object errorData){...}     IError Error(int code, string message, object errorData){...}     IError Exception(Exception e){...}     \/\/ \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"batch\">Batch<\/h2>\n<p>  <\/p>\n<p>Batch-\u0437\u0430\u043f\u0440\u043e\u0441\u044b aspnet \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a. \u0410 \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c. \u0418 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 \u0431\u0430\u0442\u0447\u0430 \u0431\u044b\u043b \u0441\u0432\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0447\u0442\u043e\u0431\u044b \u0432 \u0442\u0435\u0445 \u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445 \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043e\u0433\u043e\u0440\u043e\u0434. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0430\u0442\u0447 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 localhost, \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u041d\u043e \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u043c \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c \u0438\u0437-\u0437\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HTTP body \u0432 \u0431\u0430\u0439\u0442\u044b, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u2026 \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u043f\u043e issues \u0432 Github, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u0439 \u0442\u0440\u0435\u0434 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0430\u0442\u0447\u0438 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0431\u044b\u043b\u0438, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f. \u0410 \u0435\u0449\u0435 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432 <code>OData<\/code>, \u043d\u043e \u044d\u0442\u043e \u0446\u0435\u043b\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u0440, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e\u0432\u0435\u0440\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 <del>\u043f\u043e\u0433\u043e\u0434\u0438\u0442\u0435-\u043a\u0430, \u043c\u044b \u0436\u0435 \u0442\u043e\u0436\u0435 \u043f\u0438\u0448\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435!<\/del>. \u0422\u0430\u043c \u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u0434\u0435\u044e \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439: \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>HttpContext<\/code> \u0438 \u0432 middleware \u043f\u043e\u0437\u0432\u0430\u0442\u044c <code>next()<\/code> \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0443\u0436\u0435 \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <code>HttpContext<\/code>. \u042d\u0442\u043e \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u043e\u043c\u0430\u0435\u0442 \u043c\u043e\u0437\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u043a \u043c\u0430\u043d\u0442\u0440\u0435: <em>\u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>next(context)<\/code><\/em>, \u0438 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0438\u043a\u0442\u043e \u044d\u0442\u0443 \u0448\u0442\u0443\u043a\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, middleware \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c Json Rpc \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0430\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0440\u0435\u0448\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 <code>HttpResponse.Body<\/code>: \u043c\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e body \u043f\u043e\u0434\u0441\u0443\u043d\u0435\u043c <code>MemoryStream<\/code> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON.<\/p>\n<p>  <\/p>\n<p>\u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0443\u0441: \u043c\u044b \u043b\u043e\u043c\u0430\u0435\u043c \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\/\u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u041d\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, JSON \u043d\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u043e\u043d\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b, \u0447\u0435\u043c <code>Json.NET<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"id\">ID<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043b\u0435 <code>id<\/code> \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u043f\u0440\u0438 \u0447\u0435\u043c \u0442\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 <code>null<\/code>. \u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 <code>id<\/code>. \u0427\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043f\u043e\u043b\u0435 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u043e \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b-\u043e\u0431\u0435\u0440\u0442\u043a\u0438, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IRpcId<\/code> \u0438 <code>JsonConverter<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f \u043f\u043e\u043b\u044f \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442, \u0438\u0437 <code>HttpContext.Items<\/code> \u0434\u043e\u0441\u0442\u0430\u0435\u043c <code>IRpcId<\/code> \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e <code>JToken<\/code>-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c <code>id<\/code> \u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>id<\/code>, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"notification\">Notification<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 <code>id<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 (notification). \u041d\u0430 notification \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442: \u043d\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439, \u043d\u0438 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439. \u041d\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e HTTP-\u0442\u043e \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c 200, \u043d\u043e \u0431\u0435\u0437 \u0442\u0435\u043b\u0430. \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u043d\u0430\u0434 \u043d\u0438\u043c\u0438, \u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0437\u0430\u043f\u0440\u043e\u0441 \u043b\u0438 \u044d\u0442\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>  <\/p>\n<h2 id=\"serializaciya\">\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>Aspnet \u0443\u043c\u0435\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c JSON. \u0422\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0430 \u0443 \u043d\u0430\u0441 \u2014 \u0441\u0432\u043e\u0438. \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Formatters<\/code>, \u043d\u043e \u043e\u043d\u0438 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 <code>Content-Type<\/code>. \u0423 Json Rpc \u043e\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c JSON, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u0435\u0440 \u043d\u0435\u043b\u044c\u0437\u044f. \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u0435\u0440\u044b \u0438\u043b\u0438 \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f \u0438\u0437-\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c: \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c ActionResult \u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0435, \u0442\u0430\u043c \u0436\u0435 \u043c\u043e\u0436\u043d\u043e <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u0435\u0440<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">... var result = new ObjectResult(response) {     StatusCode = 200, }; result.Formatters.Add(JsonRpcFormatter); result.ContentTypes.Add(JsonRpcConstants.ContentType); ...<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>JsonRpcFormatter<\/code> \u2014 \u044d\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a <code>JsonOutputFormatter<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"configuration\">Configuration<\/h2>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0430\u0437\u043d\u044b\u0435 &quot;\u0440\u0443\u0447\u043a\u0438&quot;. \u041f\u0440\u0438 \u0447\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 route) \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0439\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c: \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u0439 route.<\/p>\n<p>  <\/p>\n<h3 id=\"imya-metoda\">\u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430<\/h3>\n<p>  <\/p>\n<p>\u0423 Json Rpc \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <code>method<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0418 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430. \u0415\u0439 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">public enum MethodStyle {ControllerAndAction, ActionOnly}<\/code><\/pre>\n<p>  <\/p>\n<p><code>ControllerAndAction<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>method<\/code> \u043a\u0430\u043a <code>class_name.method_name<\/code>.<\/p>\n<p>  <\/p>\n<p><code>ActionOnly<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e <code>method_name<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0433\u0434\u0430 \u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0432 conventions.<\/p>\n<p>  <\/p>\n<h3 id=\"serializaciya-1\">\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u0432\u0441\u0442\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 JSON-\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0424\u043e\u0440\u043c\u0430\u0442 &quot;\u0448\u0430\u043f\u043a\u0438&quot; \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u0410 \u0432\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u043b\u0435\u0439 <code>params<\/code>, <code>result<\/code> \u0438 <code>error.data<\/code> \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0441\u043e\u0431\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u041d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0430\u043f\u043a\u0438 \u0438 \u043d\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0448\u0430\u043f\u043a\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0445\u0438\u0442\u0440\u044b\u0435 <code>JsonConverter<\/code>\u044b, \u0438 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043a\u0430\u043a-\u0442\u043e \u0442\u043e\u0440\u0447\u0430\u043b\u0438 \u043d\u0430\u0440\u0443\u0436\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 <code>JsonSeralizer<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 DI \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438 \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0442\u044c REST\/MVC.<\/p>\n<p>  <\/p>\n<h3 id=\"nestandartnye-otvety\">\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b<\/h3>\n<p>  <\/p>\n<p>\u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u043e HTTP, \u0438\u043b\u0438 Redirect \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u044f\u0432\u043d\u043e \u0438\u0434\u0435\u0442 \u0432 \u0440\u0430\u0437\u0440\u0435\u0437 \u0441 Json Rpc, \u043d\u043e <em>\u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e<\/em>. \u0422\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"obedinyaem-vse-vmeste\">\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u043e\u043f\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0443\u043b\u0438\u0442\u044c \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044f\u043c\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class JsonRpcOptions {     public bool AllowRawResponses { get; set; }  \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0435 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443?     public bool DetailedResponseExceptions { get; set; }  \/\/ \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c StackTrace \u0443 \u043e\u0448\u0438\u0431\u043e\u043a?     public JsonRpcMethodOptions DefaultMethodOptions { get; set; }  \/\/ \u0441\u043c. \u043d\u0438\u0436\u0435     public BatchHandling BatchHandling { get; set; }  \/\/ \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0442\u0447\u0435\u0439 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c }  public class JsonRpcMethodOptions {         public Type RequestSerializer { get; set; }  \/\/ \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440     public PathString Route { get; set; }  \/\/ \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \/api\/jsonrpc     public MethodStyle MethodStyle { get; set; }  \/\/ \u0441\u043c. \u0432\u044b\u0448\u0435 }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0418 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>FromParams<\/code> \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b\u043e \u0432\u044b\u0448\u0435<\/li>\n<li><code>JsonRpcMethodStyle<\/code> \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>MethodStyle<\/code><\/li>\n<li><code>JsonRpcSerializerAttribute<\/code> \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0441\u0432\u043e\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c <code>[Route]<\/code>.<\/p>\n<p>  <\/p>\n<h1 id=\"podklyuchaem\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0438\u0447\u0438. \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043d\u0430 aspnet!<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Startup.cs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">services.AddMvc()     .AddJsonRpcServer()     .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);  \/\/ \u0438\u043b\u0438 \u0441 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 services.AddMvc()     .AddJsonRpcServer(options =&gt;     {         options.DefaultMethodOptions.Route = &quot;\/rpc&quot;;         options.AllowRawResponses = true;     })     .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class MyController : JsonRpcController {     public ObjectResult Foo(object value, bool flag)     {         return Ok(flag ? value : null);     }      public void BindObject([FromParams(BindingStyle.Object)] MyModel model)     {     }      [Route(&quot;\/test&quot;)]     public string Test()     {         return &quot;test&quot;;     }      [JsonRpcMethodStyle(MethodStyle.ActionOnly)]     public void SpecialAction()     {     }      [JsonRpcSerializer(typeof(CamelCaseJsonRpcSerializer))]     public void CamelCaseAction(int myParam)     {     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h1 id=\"klient\">\u041a\u043b\u0438\u0435\u043d\u0442<\/h1>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0438\u0435\u043d\u0442. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 \u0442\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0438: \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 (\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 json-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b).<\/p>\n<p>  <\/p>\n<h2 id=\"httpclient\"><code>HttpClient<\/code><\/h2>\n<p>  <\/p>\n<p>\u0412 .net core <code>HttpClient<\/code> <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/fundamentals\/http-requests?view=aspnetcore-3.1\" rel=\"nofollow noopener noreferrer\">\u043d\u0430\u0443\u0447\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 DI, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435<\/a>. \u0413\u0440\u0435\u0445 \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f! <\/p>\n<p>  <\/p>\n<h2 id=\"batch-1\">Batch<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0431\u0430\u0442\u0447-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u0438\u0445 <code>id<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0430\u0442\u0447-\u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c <code>id<\/code>, \u0438 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0438\u0445. \u0410 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445, \u0438 \u0438\u0437 \u0431\u0430\u0442\u0447-\u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>  <\/p>\n<h2 id=\"obrabotka-oshibok\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h2>\n<p>  <\/p>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443: \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438, \u043a\u0430\u043a \u0432 &quot;\u0448\u0430\u043f\u043a\u0435&quot;, \u0438\u043b\u0438 \u0441 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>camelCase<\/code>, \u043d\u043e \u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c \u0432 middleware \u0438 \u0434\u0435\u043b\u043e \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e action \u043d\u0435 \u0434\u043e\u0448\u043b\u043e \u0432\u043e\u043e\u0431\u0449\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0442\u0430\u043a, \u0438 \u0442\u0430\u043a. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 response \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">T GetResponseOrThrow&lt;T&gt;();  \/\/ \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 - \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0435 \u043a\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 T AsResponse&lt;T&gt;(); \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 Error&lt;JToken&gt; AsAnyError(); \/\/ \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u043d\u0435 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044f \u0435\u0435 Error&lt;T&gt; AsTypedError&lt;T&gt;(); \/\/ \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0438\u043b\u0438 \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c Error&lt;ExceptionInfo&gt; AsErrorWithExceptionInfo(); \/\/ \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0441 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438 exception-\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c <code>GetResponseOrThrow()<\/code> \u2014 \u0438\u043b\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p>  <\/p>\n<h1 id=\"developer-experience\">Developer Experience<\/h1>\n<p>  <\/p>\n<p>\u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e Json Rpc. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 aspnet, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0438 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043c\u0430\u043b\u043e \u043b\u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442. \u0427\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0448\u0442\u0443\u043a\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e: \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c. \u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<h1 id=\"todo\">TODO<\/h1>\n<p>  <\/p>\n<p>\u0412 \u043f\u043b\u0430\u043d\u0430\u0445: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 aspnetcore 5.x, \u0434\u043e\u0431\u0438\u0442\u044c \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0434\u043e 100%, \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0442\u0447\u0435\u0439. \u041d\u0443 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 open source: \u043b\u044e\u0431\u043e\u0439 \u0444\u0438\u0434\u0431\u0435\u043a, \u043f\u0443\u043b\u043b\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u0438 issues \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f!<\/p>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u0432\u0435\u0447\u0443 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441 \u0438 production: \u0443\u0436\u0435 \u0433\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0430 <strong>\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0443\u043f\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0440\u044f\u043b\u0438, \u0438 \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0438 \u0441 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u043c\u0438. \u0412 \u043a\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0433\u043e\u043d\u044f\u0442\u044c JSON-\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<p>  <\/p>\n<h1 id=\"ssylki\">\u0421\u0441\u044b\u043b\u043a\u0438<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/tochka-public\/Tochka.JsonRpc\" rel=\"nofollow noopener noreferrer\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/tochka-public.github.io\/Tochka.JsonRpc\/\" rel=\"nofollow noopener noreferrer\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<p>  <\/p>\n<h1 id=\"bonus\">\u0411\u043e\u043d\u0443\u0441<\/h1>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043b\u0435\u0436\u0430\u043b\u0430 \u0432 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430\u0445 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434, \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0432\u0442\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <strong>Swagger \u0438 OpenRpc<\/strong>. \u0410 \u0435\u0449\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 <strong>OpenTelemetry<\/strong>. \u041a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438? \u0422\u0430\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0442\u0430\u043a\u0430\u044f \u0436\u0443\u0442\u044c&#8230;<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/509986\/\"> https:\/\/habr.com\/ru\/post\/509986\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0442 aspnet core? \u041c\u043d\u0435 \u0432\u043e\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e<\/em> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Json Rpc. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044f \u0438\u0441\u043a\u0430\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0445\u043e\u0442\u0435\u043b\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0448\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u0418\u043b\u0438 \u043e \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Json Rpc, \u0434\u0430\u0436\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0442\u0435\u043a\u0435\/\u044f\u0437\u044b\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Json Rpc, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 aspnet mvc.<\/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-320935","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320935","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=320935"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320935\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}