<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[ZZnOB Blog]]></title><description><![CDATA[Словоблудие и отвага!]]></description><link>https://zznob.ru/</link><image><url>https://zznob.ru/favicon.png</url><title>ZZnOB Blog</title><link>https://zznob.ru/</link></image><generator>Ghost 5.75</generator><lastBuildDate>Thu, 30 Jul 2026 01:11:25 GMT</lastBuildDate><atom:link href="https://zznob.ru/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Рефракторим HttpClient в типизированный HttpClient]]></title><description><![CDATA[Поговорим, как правильно использовать HttpClient в приложениях на .NET. Почему не стоит создавать новый экземпляр HttpClient для каждого запроса, а также как избежать проблем с DNS и портами. Как использовать фабрику IHttpClientFactory для создания и управления клиентами. ]]></description><link>https://zznob.ru/riefraktorim-httpclient-v-tipizirovannyi/</link><guid isPermaLink="false">64e1927b148acf0001002959</guid><category><![CDATA[.Net]]></category><category><![CDATA[API]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 20 Aug 2023 07:12:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1518316974705-e5c4a6ee2374?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHx0eXBlfGVufDB8fHx8MTY5MjUwNDc1NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1518316974705-e5c4a6ee2374?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHx0eXBlfGVufDB8fHx8MTY5MjUwNDc1NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x420;&#x435;&#x444;&#x440;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x43C; HttpClient &#x432; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; HttpClient"><p>&#x414;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x441; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x43C;&#x438; (REST) API &#x43F;&#x43E; &#x43F;&#x440;&#x43E;&#x442;&#x43E;&#x43A;&#x43E;&#x43B;&#x443; HTTP. &#x412; &#x441;&#x440;&#x435;&#x434;&#x435; .NET &#x435;&#x441;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x44D;&#x442;&#x43E;&#x433;&#x43E;, &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x436;&#x443;, &#x43A;&#x430;&#x43A; &#x44F; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x44E; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C;.</p>
<p>&#x420;&#x430;&#x43D;&#x44C;&#x448;&#x435; &#x432; .NET framework &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x44B; &#x431;&#x44B;&#x43B;&#x43E; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;, &#x447;&#x435;&#x43C; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441;. &#x41F;&#x43E;&#x43F;&#x443;&#x43B;&#x44F;&#x440;&#x43D;&#x44B;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x431;&#x44B;&#x43B;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438; RestSharp, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x43B;&#x430; &#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438;.</p>
<p>&#x412; dotnet (Core) &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x435;&#x431;-&#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x43E;&#x432; &#x441;&#x442;&#x430;&#x43B;&#x43E; &#x43D;&#x430;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x449;&#x435;, &#x438; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C; &#x432; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x43D;&#x438;&#x445; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A; &#x43E;&#x442;&#x43F;&#x430;&#x43B;&#x430;. &#x425;&#x43E;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x438; &#x437;&#x434;&#x43E;&#x440;&#x43E;&#x432;&#x43E;, &#x43D;&#x43E; &#x432;&#x441;&#x435; &#x436;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;, &#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x437;&#x43D;&#x430;&#x442;&#x44C;.</p>
<h2 id="%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-httpclient">&#x41E;&#x441;&#x43E;&#x431;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; HttpClient</h2>
<p>&#x421;&#x435;&#x439;&#x447;&#x430;&#x441;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x435; dotnet-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x441; API, &#x432;&#x44B;, &#x441;&#x43A;&#x43E;&#x440;&#x435;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441; HttpClient &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;.</p>
<p>&#x412; &#x441;&#x438;&#x43B;&#x443; &#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x438;&#x43C; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x437;&#x43B;&#x43E;&#x443;&#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x43B;&#x44F;&#x442;&#x44C;. &#x427;&#x430;&#x441;&#x442;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x435;&#x447;&#x430;&#x44E;&#x449;&#x430;&#x44F;&#x441;&#x44F; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; HttpClient &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x442;&#x435;&#x43D;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x441;&#x442;&#x438; <a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines?WT.mc_id=DT-MVP-5004452&amp;ref=zznob.ru">&#x43A; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;&#x43C;</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x430; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x435;&#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x44B; &#x438; &#x442;&#x440;&#x443;&#x434;&#x43D;&#x43E; &#x43E;&#x442;&#x43B;&#x430;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;. &#x41A; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x443;, &#x432; &#x43E;&#x434;&#x438;&#x43D; &#x43F;&#x440;&#x435;&#x43A;&#x440;&#x430;&#x441;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; &#x443; &#x432;&#x430;&#x441; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E;&#x440;&#x442;&#x44B;, &#x438; &#x432;&#x44B; &#x43D;&#x435; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x438;&#x442;&#x44C; Http &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p>
<p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x443;&#x431;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x439; <a href="https://swapi.dev/?ref=zznob.ru">API Star Wars</a> &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x432; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441; HttpClient. &#x41D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x441; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x432; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x44B; HttpClient.</p>
<figure class="kg-card kg-code-card"><pre><code class="language-chsarp">var builder = WebApplication.CreateBuilder(args);
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId) =&gt;
{
    var httpClient = new HttpClient(); // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x43B;&#x438; &#x43E;&#x434;&#x438;&#x43D; HttpClient
    var people = await httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;https://swapi.dev/api/people/{peopleId}&quot;);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;, async (string speciesId) =&gt;
{
    var httpClient = new HttpClient(); // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x43B;&#x438; &#x435;&#x449;&#x451; &#x43E;&#x434;&#x438;&#x43D; HttpClient
    var species = await httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;https://swapi.dev/api/species/{speciesId}&quot;);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;, async (string planetId) =&gt;
{
    var httpClient = new HttpClient(); // &#x418; &#x435;&#x449;&#x451; &#x43E;&#x434;&#x438;&#x43D; HttpClient
    var planet = await httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;https://swapi.dev/api/planets/{planetId}&quot;);
    return Results.Ok(planet);
});
 
app.Run();</code></pre><figcaption><p dir="ltr"><span>Program.cs</span></p></figcaption></figure>
<p>&#x418;&#x442;&#x430;&#x43A;, &#x43C;&#x44B; &#x443;&#x437;&#x43D;&#x430;&#x43B;&#x438; &#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;&#x445;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43A;&#x440;&#x43E;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x430;&#x43A;&#x43E;&#x43C; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; HttpClient, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x438;&#x442;&#x44C; &#x43D;&#x430;&#x448; &#x43A;&#x43E;&#x434;.</p>
<h2 id="%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-singleton-%D0%BD%D0%B5-%D0%BF%D0%B0%D0%BD%D0%B0%D1%86%D0%B5%D1%8F">&#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; Singleton &#x43D;&#x435; &#x43F;&#x430;&#x43D;&#x430;&#x446;&#x435;&#x44F;?</h2>
<p>&#x41F;&#x435;&#x440;&#x432;&#x43E;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x443;, - &#x43D;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; HttpClient, &#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x434;&#x438;&#x43D; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; (singleton) &#x43D;&#x430; &#x432;&#x441;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;.</p>
<p>&#x42D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C;, &#x43D;&#x43E; &#x43E;&#x43D;&#x43E; &#x43D;&#x435; &#x43B;&#x443;&#x447;&#x448;&#x435;&#x435;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x432;&#x430;&#x43C; &#x432;&#x441;&#x435; &#x440;&#x430;&#x432;&#x43D;&#x43E; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x430;&#x43C;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x435;&#x43C; &#x436;&#x438;&#x437;&#x43D;&#x438; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x442;&#x43E;&#x43B;&#x43A;&#x43D;&#x443;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;&#x43C;&#x438; DNS, &#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x442;&#x441;&#x44F; &#x432; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435; &#x432;&#x44B;&#x448;&#x435;.</p>
<p>Singleton &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x43C;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x448;&#x435;&#x43C;&#x443; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F; &#x441; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x43C;&#x438; API. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x442;&#x440;&#x443;&#x434;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43F;&#x43E;-&#x440;&#x430;&#x437;&#x43D;&#x43E;&#x43C;&#x443;.</p>
<h2 id="ihttpclientfactory">IHttpClientFactory</h2>
<p>&#x411;&#x43E;&#x43B;&#x435;&#x435; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; IHttpClientFactory. IHttpClientFactory &#x2014; &#x44D;&#x442;&#x43E; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x438; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430;&#x43C;&#x438; HttpClient. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, dotnet &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438; &#x437;&#x430; &#x432;&#x430;&#x441;, &#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x438; &#x43A;&#x43E;&#x434;&#x430;, &#x43D;&#x435; &#x43E;&#x442;&#x432;&#x43B;&#x435;&#x43A;&#x430;&#x44F;&#x441;&#x44C; &#x43D;&#x430; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438; HttpClient. &#x41D;&#x43E; &#x442;&#x443;&#x442; &#x43C;&#x44B; &#x441;&#x442;&#x43E;&#x43B;&#x43A;&#x43D;&#x451;&#x43C;&#x441;&#x44F; &#x441; &#x432;&#x44B;&#x431;&#x43E;&#x440;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x438;&#x437; &#x442;&#x440;&#x451;&#x445; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; HttpClient &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C;. &#x41F;&#x440;&#x43E;&#x439;&#x434;&#x435;&#x43C;&#x441;&#x44F; &#x43F;&#x43E; &#x432;&#x441;&#x435;&#x43C; &#x43E;&#x442; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x435;&#x433;&#x43E; &#x43A; &#x441;&#x430;&#x43C;&#x43E;&#x43C;&#x443; &#x43B;&#x443;&#x447;&#x448;&#x435;&#x43C;&#x443;!</p>
<h2 id="%D1%80%D0%B5%D1%84%D1%80%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BC-%D0%B4%D0%BE-ihttpclientfactory">&#x420;&#x435;&#x444;&#x440;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x43C; &#x434;&#x43E; IHttpClientFactory</h2>
<p>&#x421;&#x430;&#x43C;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; - &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; IHttpClientFactory &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43E;&#x43D; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x435;&#x43D;.</p>
<p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x437;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443; IHttpClientFactory &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435; &#x438;&#x43D;&#x44A;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x435;&#x439; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; AddHttpClient. &#x417;&#x430;&#x442;&#x435;&#x43C; &#x438;&#x43D;&#x436;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443; &#x442;&#x443;&#x434;&#x430;, &#x433;&#x434;&#x435; &#x43D;&#x443;&#x436;&#x435;&#x43D; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; CreateClient &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p>
<figure class="kg-card kg-code-card"><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(); //&#x420;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443;
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(); //&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;
    var people = await httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;https://swapi.dev/api/people/{peopleId}&quot;);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;,  async (string speciesId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(); //&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;
    var species = await httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;https://swapi.dev/api/species/{speciesId}&quot;);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;,  async (string planetId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(); //&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;
    var planet = await httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;https://swapi.dev/api/planets/{planetId}&quot;);
    return Results.Ok(planet);
});
 
app.Run();</code></pre><figcaption><p dir="ltr"><span>&#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; Program.cs</span></p></figcaption></figure>
<p>&#x42D;&#x442;&#x43E; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;, &#x438; &#x43C;&#x44B; &#x438;&#x437;&#x431;&#x430;&#x432;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x43E;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x431;&#x44B;&#x43B;&#x438; , &#x43D;&#x43E; &#x43E;&#x43D;&#x43E; &#x43D;&#x435; &#x438;&#x434;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;.</p>
<p>&#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x430; - &#x43D;&#x430;&#x43C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x443;&#x43C;&#x430;&#x442;&#x44C; &#x43E;&#x431; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x438; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x435;&#x43C; &#x436;&#x438;&#x437;&#x43D;&#x438; HttpClient. &#x41D;&#x43E;, &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x43D;&#x443;&#x432; &#x43D;&#x430; &#x43A;&#x43E;&#x434;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x434;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43E;&#x43A;.</p>
<p>&#x41D;&#x430; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434;, &#x437;&#x434;&#x435;&#x441;&#x44C; &#x441;&#x440;&#x430;&#x437;&#x443; &#x432;&#x438;&#x434;&#x43D;&#x43E; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x441; (&#x43F;&#x435;&#x440;&#x435;)&#x43E;&#x431;&#x44A;&#x44F;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x430; API &#x432; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;&#x445; (<a href="https://swapi.dev/?ref=zznob.ru">https://swapi.dev/</a>).</p>
<p>&#x412;&#x442;&#x43E;&#x440;&#x43E;&#x435;, &#x447;&#x442;&#x43E; &#x43C;&#x43D;&#x435; &#x43D;&#x435; &#x43D;&#x440;&#x430;&#x432;&#x438;&#x442;&#x441;&#x44F;, &#x44D;&#x442;&#x43E; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x443; &#x43D;&#x430;&#x441; &#x43D;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x411;&#x43E;&#x43B;&#x435;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x43C;&#x438; HTTP API, &#x43C;&#x44B; &#x432;&#x441;&#x435; &#x440;&#x430;&#x432;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x43E;&#x434;&#x438;&#x43D; &#x438; &#x442;&#x43E;&#x442; &#x436;&#x435; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;.</p>
<p>&#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x43C;&#x44B; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x44F;&#x43C; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43E;&#x43D; &#x43F;&#x43E;&#x441;&#x44B;&#x43B;&#x430;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x438;&#x43B;&#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442;. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x432; &#x431;&#x443;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43C;&#x44B; &#x437;&#x430;&#x445;&#x43E;&#x442;&#x438;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x443;&#x44E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x438; &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x431;&#x44B; &#x43D;&#x435; &#x43F;&#x43E;&#x437;&#x430;&#x431;&#x43E;&#x442;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x431; &#x44D;&#x442;&#x43E;&#x43C; &#x437;&#x430;&#x440;&#x430;&#x43D;&#x435;&#x435;. &#x418; &#x441;&#x43F;&#x43E;&#x439;&#x43B;&#x435;&#x440;: &#x443;&#x43B;&#x443;&#x447;&#x448;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x441;&#x43B;&#x430;&#x431;&#x43E; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x433;&#x43E;.</p>
<h2 id="%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-httpclient%60%D1%8B">&#x418;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; HttpClient`&#x44B;</h2>
<p>&#x411;&#x43E;&#x43B;&#x435;&#x435; &#x443;&#x434;&#x430;&#x447;&#x43D;&#x44B;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x430;&#x43A; &#x43D;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;. &#x414;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x451;&#x43C; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434; AddHttpClient &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x441; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x414;&#x430;&#x43B;&#x435;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x439;&#x442;&#x435; &#x442;&#x43E; &#x436;&#x435; &#x438;&#x43C;&#x44F; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434; CreateClient.</p>
<p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442; &#x441; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C; &quot;starwars&quot;.</p>
<figure class="kg-card kg-code-card"><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(&quot;starwars&quot;);
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var people = await httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;https://swapi.dev/api/people/{peopleId}&quot;);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;,  async (string speciesId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var species = await httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;https://swapi.dev/api/species/{speciesId}&quot;);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;,  async (string planetId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var planet = await httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;https://swapi.dev/api/planets/{planetId}&quot;);
    return Results.Ok(planet);
});
 
app.Run();</code></pre><figcaption><p dir="ltr"><span>&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; HttpClient</span></p></figcaption></figure>
<p>&#x41F;&#x440;&#x43E;&#x441;&#x442;&#x43E;, &#x43D;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x434;&#x430; &#x43B;&#x438;? :)</p>
<h2 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-httpclient">&#x41D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x435;&#x43C; HttpClient</h2>
<p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x434; &#x435;&#x449;&#x435; &#x43B;&#x443;&#x447;&#x448;&#x435;, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; AddHttpClient, &#x447;&#x442;&#x43E; &#x434;&#x430;&#x441;&#x442; &#x43D;&#x430;&#x43C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x443; HttpClient. &#x41F;&#x440;&#x435;&#x438;&#x43C;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432;&#x435;&#x437;&#x434;&#x435; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;.</p>
<p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; AddHttpClient &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x435;&#x439;, &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43F;&#x440;&#x435;&#x434;&#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D; &#x434;&#x43B;&#x44F; &#x441;&#x432;&#x43E;&#x438;&#x445; &#x446;&#x435;&#x43B;&#x435;&#x439;.</p>
<p>&#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x43D;&#x438;&#x436;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x432;&#x435;&#x440;&#x441;&#x438;&#x438; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; BaseAddress &#x432; callback &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435;. &#x41F;&#x43E;&#x43C;&#x438;&#x43C;&#x43E; BaseAddress  &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x432; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;.</p>
<p>&#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x443;&#x434;&#x430;&#x43B;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x44B;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x430; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x435;&#x439;.</p>
<pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(&quot;starwars&quot;, (client) =&gt; {
        // &#x417;&#x430;&#x434;&#x430;&#x451;&#x43C; &#x431;&#x430;&#x437;&#x43E;&#x432;&#x44B;&#x439; &#x430;&#x434;&#x440;&#x435;&#x441; &#x432; &#x43E;&#x434;&#x43D;&#x43E;&#x43C; &#x43C;&#x435;&#x441;&#x442;&#x435;
        client.BaseAddress = new Uri(&quot;https://swapi.dev/api/&quot;);
    });
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var people = await httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;people/{peopleId}&quot;);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;, async (string speciesId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var species = await httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;species/{speciesId}&quot;);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;, async (string planetId, IHttpClientFactory httpClientFactory) =&gt;
{
    var httpClient = httpClientFactory.CreateClient(&quot;starwars&quot;);
    var planet = await httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;planets/{planetId}&quot;);
    return Results.Ok(planet);
});
 
app.Run();</code></pre>
<p>&#x41C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43D;&#x435; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x44D;&#x442;&#x438;&#x43C;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; HttpMessageHandlers &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0&amp;WT.mc_id=DT-MVP-5004452&amp;ref=zznob.ru#outgoing-request-middleware">DelegatingHandler</a>.</p>
<p>&#x41D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432; &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x44B;&#x445; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x435; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C; &#x441;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; (rate limiter), &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x435; &#x441;&#x43B;&#x43E;&#x439; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x438;&#x43B;&#x438; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x432;&#x44B;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x432; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;. &#x41A; &#x441;&#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E;, &#x43D;&#x430;&#x43C; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E;, &#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E;&#x43F;&#x443;&#x43B;&#x44F;&#x440;&#x43D;&#x44B;&#x43C; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x43E;&#x43C; <a href="http://www.thepollyproject.org/?ref=zznob.ru">Polly</a>. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; Polly, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x43E;&#x443;&#x441;&#x442;&#x43E;&#x439;&#x447;&#x438;&#x432;&#x44B;&#x435; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x44B;.</p>
<pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(&quot;starwars&quot;, (client) =&gt; {
        client.BaseAddress = new Uri(&quot;https://swapi.dev/api/&quot;);
    })
    .AddHttpMessageHandler&lt;MyCustomHttpMessageHandler&gt;() // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;
    .AddPolicyHandler(GetRetryPolicy()); // &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Polly &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;</code></pre>
<p>&#x41C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; DelegatingHandler &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x438;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;&#x43C;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;&#x432;. &#x411;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x443;&#x44E; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E;&#x431; &#x44D;&#x442;&#x43E;&#x43C;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44F; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;&#x432; &#x430;&#x443;&#x442;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x432; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x414;&#x436;&#x438;&#x43C;&#x43C;&#x438; &#x411;&#x43E;&#x433;&#x430;&#x440;&#x434; (<a href="https://jimmybogard.com/securing-web-apis-with-azure-ad-connecting-external-clients/?ref=zznob.ru">Securing Web APIs with Azure AD: Connecting External Clients</a>).</p>
<h2 id="%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2">&#x420;&#x430;&#x441;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;&#x432;.</h2>
<p>&#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x438; &#x432; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x438;&#x435; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B;, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x438; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x430; <a href="https://www.nuget.org/packages/Microsoft.AspNetCore.HeaderPropagation?ref=zznob.ru">Microsoft.AspNetCore.HeaderPropagation</a>.</p>
<p>&#x422;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x443; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;&#x432;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43C;&#x44B; &#x43D;&#x435; &#x445;&#x43E;&#x442;&#x438;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x438; &#x432;&#x441;&#x435;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;&#x43C;, &#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x438; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43D;&#x430;&#x434;&#x43B;&#x435;&#x436;&#x430;&#x442; &#x43D;&#x430;&#x43C;. &#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x434;&#x435;&#x43D;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x43D;&#x438;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430;&#x43C;.</p>
<pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(&quot;starwars&quot;, (client) =&gt; {
        client.BaseAddress = new Uri(&quot;https://swapi.dev/api/&quot;);
    })
    .AddHeaderPropagation();
</code></pre>
<p>&#x411;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x432; <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?WT.mc_id=DT-MVP-5004452&amp;ref=zznob.ru#header-propagation-middleware">&#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438;</a>.</p>
<h2 id="%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-httpclient%60%D1%8B">&#x422;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; HttpClient`&#x44B;</h2>
<p>&#x41D;&#x430;&#x448; &#x43A;&#x43E;&#x434; &#x443;&#x436;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43D;&#x430;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435;, &#x447;&#x435;&#x43C; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;, &#x43D;&#x43E; &#x43C;&#x44B; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x438;&#x442;&#x44C;. &#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x448;&#x430;&#x433; - &#x440;&#x435;&#x444;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x43D;&#x433; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439;.</p>
<p>&#x41F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x43E;&#x439; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x440;&#x435;&#x444;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x43D;&#x433;&#x430;, &#x43A;&#x430;&#x43A; &#x438; &#x440;&#x430;&#x43D;&#x435;&#x435;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x436;&#x434;&#x430;&#x435;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43A;&#x43E;&#x434;&#x430;. &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43C;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x43C; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x438; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; API. &#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438; &#x43D;&#x430; &#x432;&#x441;&#x435; &#x43C;&#x435;&#x441;&#x442;&#x430; &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;, &#x433;&#x434;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x447;&#x43A;&#x430;.</p>
<p>&#x41F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x43D;&#x430;&#x43C; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x443;&#x44E; &#x442;&#x43E;&#x447;&#x43A;&#x443;, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x445; &#x43C;&#x435;&#x441;&#x442;&#x430;&#x445;, &#x430; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x43C;&#x435;&#x441;&#x442;&#x430;, &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x438;&#x441;&#x43A; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E;.</p>
<p>&#x412;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43B;&#x43E;&#x439; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x446;&#x438;&#x438; &#x43F;&#x43E;&#x432;&#x435;&#x440;&#x445; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x438; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x43C;&#x430; &#x441; &#x435;&#x449;&#x435; &#x43E;&#x434;&#x43D;&#x438;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x43C;. &#x41C;&#x43D;&#x435; &#x43D;&#x440;&#x430;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43A;&#x430;&#x436;&#x434;&#x430;&#x44F; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x431;&#x44B;&#x43B;&#x430; &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x430; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;. &#x42D;&#x442;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &quot;&#x43D;&#x430;&#x439;&#x442;&#x438; &#x432;&#x441;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438;&quot;.</p>
<p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;, &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x438;&#x442;&#x435; HTTP-&#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442; &#x432; &#x43A;&#x43B;&#x430;&#x441;&#x441;. &#x412; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; HttpClient, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; DI-&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;. &#x412;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x430; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</p>
<p>&#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43D;&#x438;&#x436;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; StarWarsHttpClient &#x432;&#x44B;&#x441;&#x442;&#x443;&#x43F;&#x430;&#x435;&#x442; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x438; &#x434;&#x43B;&#x44F; API &quot;&#x417;&#x432;&#x435;&#x437;&#x434;&#x43D;&#x44B;&#x445; &#x432;&#x43E;&#x439;&#x43D;&quot;.</p>
<pre><code class="language-csharp">public class StarWarsHttpClient : IStarWarsService
{
    private readonly HttpClient _httpClient;
 
    public StarWarsHttpClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri(&quot;https://swapi.dev/api/&quot;);
    }
 
    public async ValueTask&lt;StarWarsPeople&gt; GetPeople(string peopleId)
    {
        return await _httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;people/{peopleId}&quot;);
    }
 
    public async ValueTask&lt;StarWarsPlanet&gt; GetPlanet(string planetId)
    {
        return await _httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;planets/{planetId}&quot;);
    }
 
    public async ValueTask&lt;StarWarsSpecies&gt; GetSpecies(string speciesId)
    {
        return await _httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;species/{speciesId}&quot;);
    }
}
 
public interface IStarWarsService
{
    ValueTask&lt;StarWarsPeople&gt; GetPeople(string peopleId);
    ValueTask&lt;StarWarsPlanet&gt; GetPlanet(string planetId);
    ValueTask&lt;StarWarsSpecies&gt; GetSpecies(string speciesId);
}</code></pre>
<p>&#x417;&#x430;&#x442;&#x435;&#x43C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; AddHttpClient &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x432;&#x43D;&#x435;&#x434;&#x440;&#x438;&#x442;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x44F; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; IHttpClientFactory. &#x41F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x44E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x43E; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x43E;&#x447;&#x43A;&#x430;&#x445;, &#x438; &#x43E;&#x43D; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</p>
<pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient&lt;IStarWarsService, StarWarsHttpClient&gt;();
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId, IStarWarsService starwarsService) =&gt;
{
    var people = await starwarsService.GetPeople(peopleId);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;, async (string speciesId, IStarWarsService starwarsService) =&gt;
{
    var species = await starwarsService.GetSpecies(speciesId);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;, async (string planetId, IStarWarsService starwarsService) =&gt;
{
    var planet = await starwarsService.GetPlanet(planetId);
    return Results.Ok(planet);
});
 
app.Run();</code></pre>
<h2 id="%D0%B7%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5">&#x417;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;.</h2>
<p>&#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43E;&#x432;, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x43C; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;.</p>
<figure class="kg-card kg-code-card"><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId) =&gt;
{
    var httpClient = new HttpClient();
    var people = await httpClient.GetFromJsonAsync&lt;StarWarsPeople&gt;($&quot;https://swapi.dev/api/people/{peopleId}&quot;);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;, async (string speciesId) =&gt;
{
    var httpClient = new HttpClient();
    var species = await httpClient.GetFromJsonAsync&lt;StarWarsSpecies&gt;($&quot;https://swapi.dev/api/species/{speciesId}&quot;);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;, async (string planetId) =&gt;
{
    var httpClient = new HttpClient();
    var planet = await httpClient.GetFromJsonAsync&lt;StarWarsPlanet&gt;($&quot;https://swapi.dev/api/planets/{planetId}&quot;);
    return Results.Ok(planet);
});
 
app.Run();</code></pre><figcaption><p dir="ltr"><span>&#x411;&#x44B;&#x43B; &#x442;&#x430;&#x43A;&#x43E;&#x439; Program.cs</span></p></figcaption></figure>
<figure class="kg-card kg-code-card"><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient&lt;IStarWarsService, StarWarsHttpClient&gt;()
    .AddHttpMessageHandler&lt;MyCustomHttpMessageHandler&gt;() 
    .AddPolicyHandler(GetRetryPolicy());
 
var app = builder.Build();
 
var starwarsGroup = app.MapGroup(&quot;starwars&quot;);
starwarsGroup.MapGet(&quot;people/{peopleId}&quot;, async (string peopleId, IStarWarsService starwarsService) =&gt;
{
    var people = await starwarsService.GetPeople(peopleId);
    return Results.Ok(people);
});
 
starwarsGroup.MapGet(&quot;species/{speciesId}&quot;, async (string speciesId, IStarWarsService starwarsService) =&gt;
{
    var species = await starwarsService.GetSpecies(speciesId);
    return Results.Ok(species);
});
 
starwarsGroup.MapGet(&quot;planets/{planetId}&quot;, async (string planetId, IStarWarsService starwarsService) =&gt;
{
    var planet = await starwarsService.GetPlanet(planetId);
    return Results.Ok(planet);
});
 
app.Run();</code></pre><figcaption><p dir="ltr"><span>&#x421;&#x442;&#x430;&#x43B; &#x442;&#x430;&#x43A;&#x43E;&#x439; Program.cs</span></p></figcaption></figure>
<p>&#x421;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x432;&#x430;&#x44F; &#x44D;&#x442;&#x438; &#x434;&#x432;&#x430; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F;, &#x43C;&#x44B; &#x432;&#x438;&#x434;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x433;&#x43E;&#x440;&#x430;&#x437;&#x434;&#x43E; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x447;&#x438;&#x442;&#x430;&#x431;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x438; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x44F;.</p>
<p>&#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x431;&#x430;&#x437;&#x43E;&#x432;&#x44B;&#x439; &#x430;&#x434;&#x440;&#x435;&#x441; &#x438; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x43E;&#x447;&#x43A;&#x438;, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x443;&#x44E; &#x442;&#x43E;&#x447;&#x43A;&#x443; &#x432; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x435; &#x438; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x435; &#x432;&#x43E; &#x432;&#x441;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;. &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441;, &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x432;&#x441;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438; &#x43D;&#x430; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x443;&#x44E; &#x442;&#x43E;&#x447;&#x43A;&#x443;. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441; &#x43A; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C;&#x443; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x443;, &#x43C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x43C;&#x438;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43D;&#x430;&#x448;&#x438;&#x445; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x44B;&#x445; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;&#x445;, &#x43A;&#x430;&#x43A; &#x438; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;.</p>
<p>&#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x442;&#x44C;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44F; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x438;&#x43B;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x43D;&#x438;&#x435; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; Polly.</p>
<p>&#x41F;&#x43E;&#x43C;&#x438;&#x43C;&#x43E; &#x442;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x435;&#x438;&#x43C;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432; &#x440;&#x435;&#x444;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x438;&#x43D;&#x433;&#x430;, &#x43C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x440;&#x435;&#x448;&#x430;&#x435;&#x43C; &#x438;&#x43D;&#x444;&#x440;&#x430;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B;. &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x436;&#x438;&#x437;&#x43D;&#x438; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x43E;&#x439; IHttpClientFactory, &#x43C;&#x44B; &#x438;&#x437;&#x431;&#x435;&#x433;&#x430;&#x435;&#x43C; &#x438;&#x441;&#x447;&#x435;&#x440;&#x43F;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x440;&#x442;&#x43E;&#x432; &#x438; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C; &#x441; DNS.</p>
<p>&#x427;&#x442;&#x43E; &#x435;&#x449;&#x435; &#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; &#x442;&#x435;&#x43C;&#x435;?</p>
<ul><li><a href="https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests?WT.mc_id=DT-MVP-5004452&amp;ref=zznob.ru">Use IHttpClientFactory to implement resilient HTTP requests</a></li><li><a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?WT.mc_id=DT-MVP-5004452&amp;ref=zznob.ru">Make HTTP requests using IHttpClientFactory in ASP.NET Core</a></li></ul>]]></content:encoded></item><item><title><![CDATA[C# record: with и ссылочные типы]]></title><description><![CDATA[<p>&#x41A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x43E; record &#x432; C# &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x441;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D; C# 9, &#x438; &#x432;&#x44B; &#x43B;&#x438;&#x431;&#x43E; &#x43B;&#x44E;&#x431;&#x438;&#x442;&#x435; &#x435;</p>]]></description><link>https://zznob.ru/c-record-with-i-ssylochnyie-tipy/</link><guid isPermaLink="false">64d46178422c440001350f95</guid><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Thu, 10 Aug 2023 04:18:04 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1583521214690-73421a1829a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHBhcGVyJTIwcmVjb3Jkc3xlbnwwfHx8fDE2OTE2NDAyNzJ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1583521214690-73421a1829a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHBhcGVyJTIwcmVjb3Jkc3xlbnwwfHx8fDE2OTE2NDAyNzJ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="C# record: with &#x438; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;"><p>&#x41A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x43E; record &#x432; C# &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x441;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D; C# 9, &#x438; &#x432;&#x44B; &#x43B;&#x438;&#x431;&#x43E; &#x43B;&#x44E;&#x431;&#x438;&#x442;&#x435; &#x435;&#x433;&#x43E;, &#x43B;&#x438;&#x431;&#x43E; &#x43D;&#x435;&#x43D;&#x430;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;. &#x41D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43C;&#x43D;&#x435;&#x43D;&#x438;&#x44F;, &#x43F;&#x440;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x441; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x44B;&#x43C; &#x441;&#x43B;&#x43E;&#x432;&#x43E;&#x43C; with &#x432;&#x44B;, &#x441;&#x43A;&#x43E;&#x440;&#x435;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E;, &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x435; &#x43D;&#x435; &#x441;&#x43E;&#x432;&#x441;&#x435;&#x43C; &#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x443;&#x44E; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443;. &#x42D;&#x442;&#x430; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43A; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x43E;&#x43C;&#x443; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44E; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B; &#x438; &#x442;&#x440;&#x443;&#x434;&#x43D;&#x43E; &#x434;&#x438;&#x430;&#x433;&#x43D;&#x43E;&#x441;&#x442;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x43C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x43C;. &#x410; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438; &#x43D;&#x438;&#x43A;&#x43E;&#x43C;&#x443; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x44B;, &#x432;&#x435;&#x440;&#x43D;&#x43E;?!</p>
<p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x443; &#x438; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x435;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F;.</p>
<h3 id="%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-with-%D1%81-records">&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; with &#x441; records</h3>
<p>&#x414;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x442;&#x438;&#x43F;&#x43E;&#x432; record &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43E; &#x43D;&#x430; &#x43D;&#x435;&#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C;&#x43E;&#x441;&#x442;&#x438;, &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443; &#x438;&#x43D;&#x43A;&#x430;&#x43F;&#x441;&#x443;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x438;&#x445;, &#x43D;&#x435; &#x43E;&#x43F;&#x430;&#x441;&#x430;&#x44F;&#x441;&#x44C; &#x432;&#x43D;&#x435;&#x441;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435;&#x436;&#x435;&#x43B;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439;. &#x41A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x43E; with &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C;, &#x43D;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x44F; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x438; &#x442;&#x435;&#x43C; &#x441;&#x430;&#x43C;&#x44B;&#x43C; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x442;&#x44C; &#x447;&#x435;&#x442;&#x43A;&#x43E;&#x435; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x431;&#x44B;&#x43B;&#x43E;, &#x438; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C;. &#x420;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;.</p>
<pre><code class="language-csharp">var one = new Simple(1);
var copy = one with { Number = one.Number + 1 };

Console.WriteLine(copy);</code></pre>
<p>&#x41F;&#x440;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435; &#x43A;&#x43E;&#x434;&#x430; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x432;&#x44B;&#x432;&#x43E;&#x434;.</p>
<pre><code class="language-chsarp">Simple { Number = 2 }</code></pre>
<p>&#x41F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; Number &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x43D;&#x43E;&#x432;&#x435;&#x43D;&#x438;&#x44E; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438; &#x441; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435;&#x43C;.</p>
<pre><code class="language-bash">Init-only property &apos;Simple.Number&apos; can only be assigned in an object initializer, or on &apos;this&apos; or &apos;base&apos; in an instance constructor or an &apos;init&apos; accessor</code></pre>
<p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x432;&#x435;&#x441;&#x435;&#x43B;&#x44C;&#x435;. &#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x43B;&#x438; &#x442;&#x438;&#x43F;&#x44B; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F;. &#x410; &#x43A;&#x430;&#x43A; &#x43D;&#x430;&#x441;&#x447;&#x435;&#x442; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;? &#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x432; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C;.</p>
<pre><code class="language-csharp">var item = new Item();

var newItem = item with { };
item.State.Add(1);
newItem.State.Add(2);

Console.WriteLine(item);
Console.WriteLine(newItem);

public record Item(List&lt;int&gt; State)
{
    public Item() : this(new List&lt;int&gt;())
    {
    }

    public override string ToString()
    {
        return $&quot;Item {{ State = {string.Join(&quot;, &quot;, State)} }}&quot;;
    }
}</code></pre>
<p>&#x427;&#x442;&#x43E; &#x432;&#x44B; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442;&#x435; &#x43E;&#x442; State (&#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x433;&#x43B;&#x44F;&#x434;&#x44B;&#x432;&#x430;&#x439;&#x442;&#x435;)? &#x412;&#x44B; &#x431;&#x44B;&#x43B;&#x438; &#x431;&#x44B; &#x43F;&#x440;&#x430;&#x432;&#x44B;, &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x438;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x432; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; &#x44D;&#x442;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; 1, 2.</p>
<pre><code class="language-csharp">Item { State = 1, 2 }
Item { State = 1, 2 }</code></pre>
<p>&#x41A;&#x430;&#x43A; &#x432;&#x44B;, &#x43D;&#x430;&#x432;&#x435;&#x440;&#x43D;&#x43E;&#x435;, &#x437;&#x43D;&#x430;&#x435;&#x442;&#x435;, &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B; &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x43D;&#x430; &#x43C;&#x435;&#x441;&#x442;&#x43E; &#x432; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438;. &#x41F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x432;&#x430; with &#x434;&#x43B;&#x44F; record &#x441;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438; &#x441;&#x440;&#x435;&#x434;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x432; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; record. &#x422;&#x430;&#x43A;&#x43E;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x43E; &#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x441;&#x440;&#x435;&#x434;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x434; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E;, &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x443;&#x44E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F;. &#x422;&#x430;&#x43A;&#x43E;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x435;&#x439; &#x438;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x44F;&#x43C;.</p>
<p>&#x41A;&#x430;&#x43A; &#x436;&#x435; &#x440;&#x435;&#x448;&#x438;&#x442;&#x44C; &#x44D;&#x442;&#x443; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x443;? &#x415;&#x441;&#x442;&#x44C; &#x434;&#x432;&#x430; &#x43F;&#x443;&#x442;&#x438;.</p>
<h3 id="%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%82%D1%82%D0%B5%D1%80%D0%BE%D0%B2-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2-%D0%BF%D1%80%D0%B8-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8">&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x435;&#x442;&#x442;&#x435;&#x440;&#x43E;&#x432; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432; &#x43F;&#x440;&#x438; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438;.</h3>
<p>&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x43E; &#x432;&#x441;&#x435;&#x445; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x430;&#x445; &#x432; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x438; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C; &#x438;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x430; &#x440;&#x430;&#x43D;&#x43D;&#x438;&#x445; &#x44D;&#x442;&#x430;&#x43F;&#x430;&#x445; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F;.</p>
<pre><code class="language-csharp">var item = new Item();

var newItem = item with { State = item.State.Append(2).ToList() };
item.State.Add(1);

Console.WriteLine(item);
Console.WriteLine(newItem);</code></pre>
<p>&#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x43C;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x438; &#x434;&#x432;&#x435; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;.</p>
<pre><code class="language-csharp">Item { State = 1 }
Item { State = 2 }</code></pre>
<p>&#x422;&#x430;&#x43A;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;, &#x43D;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x443;&#x441;&#x438;&#x43B;&#x438;&#x439; &#x43F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x432;&#x430; with.</p>
<p>&#x414;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; - &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &quot;&#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x430; &#x43A;&#x43E;&#x43F;&#x438;&#x439;&quot;. &#x41A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x2014; &#x44D;&#x442;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x435;&#x440;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x432; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x43E;&#x439; &#x438;&#x435;&#x440;&#x430;&#x440;&#x445;&#x438;&#x438; &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x438; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F;. &#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x43C; &#x43D;&#x430;&#x448;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;. &#x41A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x43E; with &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x441;&#x440;&#x435;&#x434;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x438;&#x441;&#x43A;&#x430; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x430; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x432; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;.</p>
<pre><code class="language-csharp">var item = new Item();

var newItem = item with { };
item.State.Add(1);
newItem.State.Add(2);
Console.WriteLine(item);
Console.WriteLine(newItem);

public record Item(List&lt;int&gt; State)
{
    public Item() : this(new List&lt;int&gt;())
    {
    }

    // &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;
    protected Item(Item oldItem)
    {
        State = new List&lt;int&gt;(oldItem.State);
    }

    public override string ToString()
    {
        return $&quot;Item {{ State = {string.Join(&quot;, &quot;, State)} }}&quot;;
    }
}</code></pre>
<p>&#x41F;&#x440;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x434;&#x432;&#x435; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x434;&#x432;&#x443;&#x445; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x43E;&#x432; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x435;&#x439;.</p>
<pre><code class="language-csharp">Item { State = 1 }
Item { State = 2 }</code></pre>
<p>&#x423; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x432;&#x430; &#x43F;&#x440;&#x438;&#x435;&#x43C;&#x43B;&#x435;&#x43C;&#x44B;&#x445; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438; &#x432; record.</p>
<p>&#x414;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;, &#x2014; &#x44D;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C;&#x44B;&#x445; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x441; &#x441;&#x430;&#x43C;&#x43E;&#x433;&#x43E; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430;. &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; IReadOnlyList &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; List &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438;.</p>
<h3 id="%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4">&#x412;&#x44B;&#x432;&#x43E;&#x434;</h3>
<p>&#x425;&#x43E;&#x442;&#x44F; &#x442;&#x438;&#x43F; record &#x438;&#x43C;&#x435;&#x435;&#x442; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; C#, &#x43F;&#x43E;&#x434; &#x43A;&#x430;&#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x43E;&#x43D; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;. &#x41A;&#x43E;&#x43D;&#x446;&#x435;&#x43F;&#x446;&#x438;&#x438; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x438; &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x43E;-&#x43F;&#x440;&#x435;&#x436;&#x43D;&#x435;&#x43C;&#x443; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x438;&#x43C;&#x44B;. &#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x44C; &#x43E; &#x442;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x432; &#x441;&#x432;&#x43E;&#x438; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;, &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x432;&#x430;&#x436;&#x43D;&#x43E;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x435;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43A; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x43C;. &#x42F; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x44E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x443; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x445; record &#x442;&#x438;&#x43F;&#x44B;, &#x43A;&#x430;&#x43A; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x430;&#x43D;&#x44C;&#x448;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x437;&#x430;&#x431;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43E; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x434;&#x43D;&#x430;&#x43C;&#x435;&#x440;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;.</p>
<p>&#x42F; &#x43D;&#x430;&#x434;&#x435;&#x44E;&#x441;&#x44C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x430; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x432;&#x430;&#x43C; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x430;, &#x438; &#x431;&#x43B;&#x430;&#x433;&#x43E;&#x434;&#x430;&#x440;&#x44E; &#x432;&#x430;&#x441; &#x437;&#x430; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x43F;&#x43E;&#x434;&#x435;&#x43B;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x435;&#x44E; &#x441; &#x434;&#x440;&#x443;&#x437;&#x44C;&#x44F;&#x43C;&#x438; &#x438; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x433;&#x430;&#x43C;&#x438;. &#x411;&#x443;&#x434;&#x44C;&#x442;&#x435; &#x437;&#x434;&#x43E;&#x440;&#x43E;&#x432;&#x44B; :)</p>
<p>&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; <a href="https://khalidabuhakmeh.com/csharp-records-the-with-keyword-and-reference-types?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Клиентская валидация в ASP.Net Core без jQuery]]></title><description><![CDATA[<p>&#x41D;&#x430; ASP.NET Core &#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x432;&#x43B;&#x438;&#x44F;&#x43B; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; .NET Framework <em>System.Web</em>, &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x430; ASP.NET Framework, &#x43D;&#x43E; Net Core &#x43F;&#x440;&#x438;</p>]]></description><link>https://zznob.ru/kliientskaia-validatsiia-v-asp-net-core-biez-jquery/</link><guid isPermaLink="false">644f4c059271e30001125cac</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Mon, 01 May 2023 07:04:30 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1498268485381-33a31f91f2c8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fHZhbGlkYXRpb258ZW58MHx8fHwxNjgyOTE4NDE0&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1498268485381-33a31f91f2c8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fHZhbGlkYXRpb258ZW58MHx8fHwxNjgyOTE4NDE0&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery"><p>&#x41D;&#x430; ASP.NET Core &#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x432;&#x43B;&#x438;&#x44F;&#x43B; &#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; .NET Framework <em>System.Web</em>, &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x430; ASP.NET Framework, &#x43D;&#x43E; Net Core &#x43F;&#x440;&#x438;&#x43D;&#x446;&#x438;&#x43F;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x435;&#x435; &#x438; &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x435;&#x435;. &#x422;&#x435;&#x43C; &#x43D;&#x435; &#x43C;&#x435;&#x43D;&#x435;&#x435;, &#x43E;&#x434;&#x43D;&#x430; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x43F;&#x43E;&#x43F;&#x430;&#x43B;&#x430; &#x432; ASP.NET Core &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x431;&#x435;&#x437; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439;: &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x44E; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x443; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x43E;&#x439; (&#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x43E;&#x439;) &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; jQuery. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x435; &#x43C;&#x44B; &#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43D;&#x430; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x443;&#x44E; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; JavaScript &#x43F;&#x43E;&#x434; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; <code>aspnet-client-validation</code>.</p><h3 id="%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B5-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0-%D0%B2-aspnet-core">&#x412;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; ASP.NET Core.</h3><p>Net &#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x433;&#x43E;&#x434;&#x430; &#x432; &#x433;&#x43E;&#x434;, &#x43D;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x432; &#x43D;&#x451;&#x43C; &#x438; &#x43D;&#x435;&#x438;&#x437;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x432;&#x435;&#x449;&#x438;, &#x43E;&#x434;&#x43D;&#x430; &#x438;&#x437; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x2014; &#x44D;&#x442;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; ASP.NET Core. &#x420;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x435;&#x43C;&#x44B;&#x439;/&#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D; &#x43D;&#x430; jQuery. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x433;&#x43B;&#x430;&#x432;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E; &#x437;&#x43D;&#x430;&#x435;&#x442;&#x435; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x433;&#x43B;&#x430;&#x432;&#x443;! </p><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x443; &#x43D;&#x430;&#x441; &#x431;&#x44B;&#x43B; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B;, &#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43C; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x443;&#x44E; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x443; Razor Page, &#x432;&#x441;&#x451; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x438; &#x432; &quot;&#x442;&#x440;&#x430;&#x434;&#x438;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x43E;&#x43C;&quot; MVC. &#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x430;&#x44F; <code>PageModel</code> &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x443;&#x44E; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; <code>Person</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x436;&#x435;&#x43C; &#x43A; &#x444;&#x43E;&#x440;&#x43C;&#x435;.</p><pre><code class="language-csharp">using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;

namespace MvcClientValidation.Pages;

public class TestModel : PageModel
{
    [BindProperty]
    public Person Input { get; set; }

    public ActionResult OnPost()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        TempData[&quot;Message&quot;] = $&quot;Hello {Input.Name} ({Input.Email})!&quot;;
        return RedirectToPage(&quot;Index&quot;);
    }

    public class Person
    {
        [Required]
        public string Name { get; set; }

        [Required]
        [EmailAddress]
        public string Email { get; set; }
    }
}</code></pre><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; <code>OnPost()</code> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x448;&#x43B;&#x430; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; <code>Person</code>. &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x442;&#x43E; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43C;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; <code>TempData</code> &#x441; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x443; (&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; <a href="https://en.wikipedia.org/wiki/Post/Redirect/Get?ref=zznob.ru">&#x43F;&#x430;&#x442;&#x442;&#x435;&#x440;&#x43D; <code>Post-Redirect-Get</code></a>).</p><p>&#x415;&#x441;&#x43B;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x430; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x43D;&#x43E;&#x439;, &#x43C;&#x44B; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x43E; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x43C; &#x444;&#x43E;&#x440;&#x43C;&#x443; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x431; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x445; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;).</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="1032" height="357" srcset="https://zznob.ru/content/images/size/w600/2023/05/image.png 600w, https://zznob.ru/content/images/size/w1000/2023/05/image.png 1000w, https://zznob.ru/content/images/2023/05/image.png 1032w" sizes="(min-width: 720px) 720px"></figure><p>&#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x443; &#x43A;&#x43E;&#x434; Razor &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; &#x441; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x444;&#x43E;&#x440;&#x43C;&#x43E;&#x439;:</p><pre><code class="language-razor">@page
@model MvcClientValidation.Pages.TestModel

&lt;div class=&quot;col-md-6 offset-md-3&quot;&gt;
  &lt;form method=&quot;post&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
      &lt;input class=&quot;form-control&quot; asp-for=&quot;Input.Name&quot;&gt;
      &lt;label asp-for=&quot;Input.Name&quot;&gt;&lt;/label&gt;
      &lt;span class=&quot;text-danger field-validation-valid&quot; asp-validation-for=&quot;Input.Name&quot;&gt;&lt;/span&gt;
    &lt;/div&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
      &lt;input class=&quot;form-control&quot; asp-for=&quot;Input.Email&quot;&gt;
      &lt;label asp-for=&quot;Input.Email&quot;&gt;&lt;/label&gt;
      &lt;span class=&quot;text-danger field-validation-valid&quot; asp-validation-for=&quot;Input.Email&quot;&gt;&lt;/span&gt;
    &lt;/div&gt;
    &lt;button type=&quot;submit&quot; class=&quot;w-100 btn btn-lg btn-primary&quot;&gt;&#x41E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C;&lt;/button&gt;
  &lt;/form&gt;
&lt;/div&gt;</code></pre><p>&#x41E;&#x434;&#x43D;&#x430; &#x432;&#x435;&#x449;&#x44C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43E;&#x442;&#x43C;&#x435;&#x442;&#x438;&#x442;&#x44C; &#x432; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x432;&#x44B;&#x448;&#x435; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435;, &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x43E;&#x43D;&#x430; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x435;&#x439; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442; &#x43D;&#x430;&#x436;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443; &quot;&#x41E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C;&quot;, &#x438; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x438; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43E; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x43F;&#x43E;&#x448;&#x43B;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A;.</p><p>&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x430;&#x435;&#x442; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;, &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44F; &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x443;&#x44E; &#x441;&#x432;&#x44F;&#x437;&#x44C;. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x436;&#x434;&#x430;&#x442;&#x44C;, &#x43F;&#x43E;&#x43A;&#x430; &#x444;&#x43E;&#x440;&#x43C;&#x430; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442; &#x441;&#x440;&#x430;&#x437;&#x443; &#x436;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x431; &#x43E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x43E;&#x43B;&#x44F;&#x445; &#x438;&#x43B;&#x438; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x445;. &#x412; &#x43D;&#x430;&#x448;&#x438; &#x434;&#x43D;&#x438; &#x434;&#x43B;&#x44F; &#x43B;&#x44E;&#x431;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x418;&#x43D;&#x442;&#x435;&#x440;&#x43D;&#x435;&#x442;&#x435; &#x44D;&#x442;&#x43E; &#x43F;&#x43E;&#x438;&#x441;&#x442;&#x438;&#x43D;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;.</p><blockquote>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x432;&#x44B; <strong>&#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435;</strong>, &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x435;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x43D;&#x435; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x446;&#x435;&#x43B;&#x43E;&#x441;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x43B;&#x438; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;. &#x412;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x2014; &#x44D;&#x442;&#x43E; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x443;&#x434;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;.</blockquote><p>&#x412;&#x441;&#x435; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; Razor Pages &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442; &#x43E;&#x431;&#x449;&#x438;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x444;&#x430;&#x439;&#x43B; <em>_ValidationScriptsPartial.cshtml</em>. &#x42D;&#x442;&#x430; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x434;&#x432;&#x430; &#x442;&#x435;&#x433;&#x430; <em>script</em>:</p><pre><code class="language-razor">&lt;script src=&quot;~/lib/jquery/dist/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;~/lib/jquery-validation/dist/jquery.validate.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js&quot;&gt;&lt;/script&gt;</code></pre><p>&#x41E;&#x43D;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x44E;&#x442; &#x432; &#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x43D;&#x438;&#x438; &#x441;&#x43E; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x43E;&#x43C; jQuery (&#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C;&#x44B;&#x43C; &#x43D;&#x430; &#x432;&#x441;&#x435; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; &#x432; _Layout.cshtml, &#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x442;&#x435;&#x433; &#x432; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x432;&#x44B;&#x448;&#x435; &#x434;&#x43B;&#x44F; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;) &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; client-side &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;. &#x412;&#x44B; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x442;&#x435;&#x433; &#x432; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x44E; &quot;Scripts&quot;, &#x440;&#x430;&#x437;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x432; &#x43D;&#x438;&#x436;&#x43D;&#x435;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x432;&#x430;&#x448;&#x435;&#x439; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; Razor:</p><pre><code class="language-razor">@section Scripts{
    &lt;partial name=&quot;_ValidationScriptsPartial&quot; /&gt;
}</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;! &#x415;&#x441;&#x43B;&#x438; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x43D;&#x435; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x444;&#x43E;&#x440;&#x43C;&#x443;, &#x43E;&#x43D; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442; &#x43C;&#x433;&#x43D;&#x43E;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x443;&#x43F;&#x440;&#x435;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x435;. &#x415;&#x441;&#x43B;&#x438; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x432;&#x441;&#x435; &#x440;&#x430;&#x432;&#x43D;&#x43E; &#x43D;&#x430;&#x436;&#x43C;&#x435;&#x442; &#x43A;&#x43D;&#x43E;&#x43F;&#x43A;&#x443; &quot;&#x41E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C;&quot;, &#x444;&#x43E;&#x440;&#x43C;&#x430; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, &#x43F;&#x43E;&#x43A;&#x430; &#x43E;&#x43D; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;.</p><p>&#x41F;&#x43E;&#x434; &#x43A;&#x430;&#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x44D;&#x442;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443;, &#x447;&#x442;&#x43E; ASP.NET Core &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442; &#x446;&#x435;&#x43B;&#x44B;&#x439; &#x440;&#x44F;&#x434; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C; &#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x43D; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x444;&#x43E;&#x440;&#x43C;&#x430;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x432;&#x44B;&#x448;&#x435;, &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-html">&lt;div class=&quot;col-md-6 offset-md-3&quot;&gt;
  &lt;form method=&quot;post&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
      &lt;input class=&quot;form-control&quot; type=&quot;text&quot; data-val=&quot;true&quot; 
        data-val-required=&quot;The Name field is required.&quot; id=&quot;Input_Name&quot; 
        name=&quot;Input.Name&quot; value=&quot;&quot;&gt;
      &lt;label for=&quot;Input_Name&quot;&gt;Name&lt;/label&gt;
      &lt;span class=&quot;text-danger field-validation-valid field-validation-valid&quot;
        data-valmsg-for=&quot;Input.Name&quot; data-valmsg-replace=&quot;true&quot;&gt;&lt;/span&gt;
    &lt;/div&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
      &lt;input class=&quot;form-control&quot; type=&quot;email&quot; data-val=&quot;true&quot; 
        data-val-email=&quot;The Email field is not a valid e-mail address.&quot; 
        data-val-required=&quot;The Email field is required.&quot; id=&quot;Input_Email&quot; 
        name=&quot;Input.Email&quot; value=&quot;&quot;&gt;
      &lt;label for=&quot;Input_Email&quot;&gt;Email&lt;/label&gt;
      &lt;span class=&quot;text-danger field-validation-valid field-validation-valid&quot; 
        data-valmsg-for=&quot;Input.Email&quot; data-valmsg-replace=&quot;true&quot;&gt;&lt;/span&gt;
    &lt;/div&gt;
    &lt;button type=&quot;submit&quot; class=&quot;w-100 btn btn-lg btn-primary&quot;&gt;Submit&lt;/button&gt;
    &lt;input name=&quot;__RequestVerificationToken&quot; type=&quot;hidden&quot; value=&quot;CfDJ8FJx1R5_kANFmBjoULQ...&quot;&gt;
  &lt;/form&gt;
&lt;/div&gt;</code></pre><p>&#x412; HTML &#x43A;&#x43E;&#x434;&#x435; &#x432;&#x44B;&#x448;&#x435; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; <code>data-*</code>, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x435; ASP.NET Core. &#x411;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; jQuery &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x438;&#x449;&#x435;&#x442; HTML-&#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x441; &#x44D;&#x442;&#x438;&#x43C;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430;&#x43C;&#x438; &#x438; &#x43F;&#x440;&#x438;&#x43A;&#x440;&#x435;&#x43F;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x439;. &#x42D;&#x442;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x44E;&#x442; &#x432;&#x432;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x440;&#x435;&#x434;&#x443;&#x43F;&#x440;&#x435;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x439; &#x438; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x442;&#x443; &#x436;&#x435; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E;, &#x447;&#x442;&#x43E; &#x438; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;.</p><blockquote>&#x412;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x441;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430;&#x43C;&#x438; <code>[DataAnnotations]</code>. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; FluentValidation &#x438;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x444;&#x440;&#x435;&#x439;&#x43C;&#x432;&#x43E;&#x440;&#x43A; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;, &#x442;&#x43E; &#x432;&#x430;&#x43C; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x43E;&#x43D;&#x430;&#x434;&#x43E;&#x431;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; <a href="https://github.com/FluentValidation/FluentValidation.AspNetCore?ref=zznob.ru#clientside-validation">FluentValidation &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; FluentValidation.AspNetCore</a>.</blockquote><p>&#x418;&#x442;&#x430;&#x43A;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;, &#x432; &#x447;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430;? &#x418;&#x43C;&#x435;&#x435;&#x442; &#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; jQuery?</p><h3 id="%D1%87%D1%82%D0%BE-%D0%BD%D0%B5-%D1%82%D0%B0%D0%BA-%D1%81-jquery">&#x427;&#x442;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x441; jQuery?</h3><p><a href="https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-7.0&amp;ref=zznob.ru">&#x412; ASP.NET Core &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; </a>&#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442; &#x43E;&#x442; Microsoft &#x43F;&#x43E;&#x434; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; <a href="https://github.com/aspnet/jquery-validation-unobtrusive?ref=zznob.ru">jQuery Unobtrusive Validation</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439;, &#x432; &#x441;&#x432;&#x43E;&#x44E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x44C;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43F;&#x43B;&#x430;&#x433;&#x438;&#x43D; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; jQuery. &#x412;&#x441;&#x435; &#x44D;&#x442;&#x43E; (&#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x43E;) &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; jQuery.</p><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43B;&#x43E;&#x436;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E;, &#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x435;&#x435; 100 &#x41A;&#x411; (&#x43F;&#x43E;&#x441;&#x43B;&#x435; GZIP &#x441;&#x436;&#x430;&#x442;&#x438;&#x44F;) JavaScript. &#x42D;&#x442;&#x43E;... &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;. &#x41E;&#x43D; &#x43D;&#x435; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x440;&#x430;&#x437; &#x431;&#x43B;&#x430;&#x433;&#x43E;&#x434;&#x430;&#x440;&#x44F; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44E;, &#x43D;&#x43E;, &#x442;&#x435;&#x43C; &#x43D;&#x435; &#x43C;&#x435;&#x43D;&#x435;&#x435;, &#x44D;&#x442;&#x43E; &#x432;&#x435;&#x441;&#x44C; JavaScript, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x443; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B;.</p><blockquote>jQuery - &#x438;&#x441;&#x442;&#x43E;&#x440;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x430;&#x436;&#x43D;&#x430;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x43E; &#x441;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x43B;&#x430;&#x441;&#x44C; &#x441;&#x43E; &#x441;&#x432;&#x43E;&#x435;&#x439; &#x437;&#x430;&#x434;&#x430;&#x447;&#x435;&#x439; &#x441;&#x433;&#x43B;&#x430;&#x436;&#x438;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x438;&#x439; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x430;&#x43C;&#x438;. &#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E; &#x432; &#x43D;&#x430;&#x448;&#x438; &#x434;&#x43D;&#x438; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x44B; &#x433;&#x43E;&#x440;&#x430;&#x437;&#x434;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x442; &#x43E;&#x434;&#x43D;&#x438;&#x43C; &#x438; &#x442;&#x435;&#x43C; &#x436;&#x435; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x430;&#x43C;. &#x42D;&#x442;&#x43E;, &#x432; &#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x43D;&#x438;&#x438; &#x441; &#x43C;&#x43E;&#x43D;&#x43E;&#x43F;&#x43E;&#x43B;&#x438;&#x435;&#x439; &#x445;&#x440;&#x43E;&#x43C;&#x430;, &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x438;&#x43C;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43E; jQuery &#x432; &#x43D;&#x430;&#x448;&#x438; &#x434;&#x43D;&#x438; &#x443;&#x436;&#x435; &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x430;&#x43A;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;. &quot;<a href="https://youmightnotneedjquery.com/?ref=zznob.ru">&#x412;&#x430;&#x43C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x435; &#x43F;&#x43E;&#x43D;&#x430;&#x434;&#x43E;&#x431;&#x438;&#x442;&#x44C;&#x441;&#x44F; jQuery</a>&quot; &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x441;&#x430;&#x439;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442; API &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x43E;&#x432; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438; jQuery.</blockquote><p>&#x418;&#x442;&#x430;&#x43A;, &#x435;&#x441;&#x43B;&#x438; jQuery &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; &#x43D;&#x430;&#x448;&#x438; &#x434;&#x43D;&#x438; &#x438; &#x437;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;&#x430;, &#x440;&#x430;&#x437;&#x432;&#x435; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x437;&#x434;&#x43E;&#x440;&#x43E;&#x432;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x432;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x435;&#x433;&#x43E; &#x443;&#x434;&#x430;&#x43B;&#x438;&#x442;&#x44C;?</p><p>&#x412;&#x44B; &#x441;&#x43F;&#x440;&#x430;&#x432;&#x435;&#x434;&#x43B;&#x438;&#x432;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x43E;&#x437;&#x440;&#x430;&#x437;&#x438;&#x442;&#x44C;: &quot;&#x420;&#x430;&#x437;&#x432;&#x435; Bootstrap &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; jQuery?&quot;. &#x41D;&#x443;, &#x44D;&#x442;&#x43E; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x442; &#x43E;&#x442; &#x43E;&#x431;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x442;&#x432;. &#x422;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x435; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; ASP.NET Core &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; Bootstrap 5, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F;&#x432;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; jQuery. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; Bootstrap 4, &#x442;&#x43E; jQuery &#x432;&#x430;&#x43C; &#x43F;&#x43E;&#x43D;&#x430;&#x434;&#x43E;&#x431;&#x438;&#x442;&#x441;&#x44F; &#x432; &#x43B;&#x44E;&#x431;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; Bootstrap 5 &#x438;&#x43B;&#x438; Tailwind (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;), &#x442;&#x43E; jQuery &#x2014; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43D;&#x435;&#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x435; &#x43B;&#x438;&#x448;&#x43D;&#x438;&#x435; &#x431;&#x430;&#x439;&#x442;&#x44B;.</p><p>&#x41D;&#x43E;, &#x442;&#x435;&#x43C; &#x43D;&#x435; &#x43C;&#x435;&#x43D;&#x435;&#x435;, &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x430;&#x44F; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; ASP.NET Core &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; jQuery. &#x422;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x441; &#x43D;&#x438;&#x43C; &#x437;&#x430;&#x441;&#x442;&#x440;&#x44F;&#x43B;&#x438;, &#x432;&#x435;&#x440;&#x43D;&#x43E;?</p><h3 id="%D0%BD%D0%BE-%D0%BA%D0%B0%D0%BA%D0%BE%D0%B2%D0%B0-%D0%B6%D0%B5-%D0%B0%D0%BB%D1%8C%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D0%B0">&#x41D;&#x43E; &#x43A;&#x430;&#x43A;&#x43E;&#x432;&#x430; &#x436;&#x435; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x430;?</h3><p>&#x41A;&#x430;&#x43A; &#x43D;&#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x43E;, &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x44B;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x432; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x430;&#x445; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x443;&#x436;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43B;&#x435;&#x442;. &#x412; HTML 5 &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x441;&#x44F; &quot;<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Constraint_validation?ref=zznob.ru">Constraints Validation API</a>&quot;. &#x41E;&#x43D; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x442;&#x438;&#x43F;&#x430; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x44B;&#x445; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x43E;&#x435; &#x432;&#x441;&#x43F;&#x43B;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x435; &#x43E;&#x43A;&#x43D;&#x43E; &quot;&#x41D;&#x435;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; email&quot; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x432;&#x441;&#x435;&#x434;&#x43D;&#x435;&#x432;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435; &#x432;&#x435;&#x431;-&#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-1.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="810" height="372" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-1.png 600w, https://zznob.ru/content/images/2023/05/image-1.png 810w" sizes="(min-width: 720px) 720px"></figure><p>&#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43E; API Constraints Validation. &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43E;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43D;&#x43E; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; &#x432;&#x432;&#x43E;&#x434;&#x430; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>type=&quot;email&quot;</code>.</p><blockquote>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x43C; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;, &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445; Razor Pages, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x445; jQuery, &#x43D;&#x435; &#x432;&#x438;&#x434;&#x43D;&#x43E; &#x441;&#x43A;&#x440;&#x44B;&#x442;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;, &#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x43B;&#x430;&#x433;&#x438;&#x43D; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>novalidate</code> &#x43A; &#x442;&#x435;&#x433;&#x443;.</blockquote><p>&#x412; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x43E;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; API &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x43E;&#x432;, API &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x438;&#x43C;&#x435;&#x435;&#x442; <a href="https://caniuse.com/constraint-validation?ref=zznob.ru">&#x43E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x443;&#x44E; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x443;</a>. &#x417;&#x430; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; Opera Mini, &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x43E; &#x432;&#x441;&#x435;&#x445; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x430;&#x445;. &#x414;&#x430;&#x436;&#x435; IE 10 &#x438;&#x43C;&#x435;&#x435;&#x442; (&#x447;&#x430;&#x441;&#x442;&#x438;&#x447;&#x43D;&#x443;&#x44E;) &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x443;! &#x1F62E; &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x442;&#x431;&#x440;&#x43E;&#x441;&#x438;&#x442;&#x44C; IE &#x438; Opera Mini, &#x442;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x43B;&#x441;&#x44F; &#x432; &#x442;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; 5 &#x43B;&#x435;&#x442;, &#x442;&#x43E; &#x432;&#x441;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-2.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="1221" height="642" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-2.png 600w, https://zznob.ru/content/images/size/w1000/2023/05/image-2.png 1000w, https://zznob.ru/content/images/2023/05/image-2.png 1221w" sizes="(min-width: 720px) 720px"></figure><p>&#x418;&#x442;&#x430;&#x43A;, &#x435;&#x441;&#x43B;&#x438; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440; &#x443;&#x436;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x443; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;, &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43B;&#x438; &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x435; &#x432; ASP.NET Core &#x438; &#x438;&#x437;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x442; jQuery?</p><p>&#x41A; &#x441;&#x43E;&#x436;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x44E;, &#x43E;&#x442;&#x432;&#x435;&#x442;: &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;. &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x442; &#x43E;&#x442; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432;, &#x430; &#x43D;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; <code>data-*</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; ASP.NET Core &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;. &#x422;&#x430;&#x43A;&#x436;&#x435;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x43E;, &#x43D;&#x435;&#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x442;&#x438;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;, &#x432;&#x44B;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x43E;&#x43C;. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; Constraints API, &#x43A; &#x441;&#x43E;&#x436;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x44E;, &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x43C;.</p><p>&#x41D;&#x43E; &#x43D;&#x435; &#x432;&#x441;&#x435; &#x43F;&#x43E;&#x442;&#x435;&#x440;&#x44F;&#x43D;&#x43E;. &#x427;&#x442;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x43C;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x43E;&#x431;&#x43E;&#x439;&#x442;&#x438;&#x441;&#x44C; &#x431;&#x435;&#x437; API Constraints, &#x430; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x434; &#x43D;&#x435;&#x437;&#x430;&#x43C;&#x435;&#x442;&#x43D;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; jQuery.</p><blockquote>&#x421;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x43D;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x43A; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; AJAX &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443;, &#x442;&#x430;&#x43A;&#x443;&#x44E; &#x43A;&#x430;&#x43A; FormHelper. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B; &#x43D;&#x430; JavaScript &#x438; &#x432; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x438;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x43F;&#x44B;&#x442; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439;.</blockquote><h3 id="%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC-aspnet-client-validation">&#x41F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; aspnet-client-validation.</h3><p>&#x42D;&#x442;&#x430; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x430; &#x43F;&#x43E;&#x434; &#x432;&#x43F;&#x435;&#x447;&#x430;&#x442;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43E;&#x442; &#x442;&#x432;&#x438;&#x442;&#x430; &#x43B;&#x435;&#x433;&#x435;&#x43D;&#x434;&#x430;&#x440;&#x43D;&#x43E;&#x433;&#x43E; <a href="https://twitter.com/haacked?ref=zznob.ru">&#x424;&#x438;&#x43B;&#x430; &#x425;&#x430;&#x430;&#x43A;&#x430;</a>:</p><blockquote><em>If you use aspnetcore or aspnetmvc without jquery, you should check out <a href="https://t.co/EMB8LZZWgg?ref=zznob.ru">https://t.co/EMB8LZZWgg</a> for client validation.</em></blockquote><p>&#x411;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; <code>aspnet-client-validation</code>, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x43E;&#x43D; &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43A;&#x440;&#x43E;&#x448;&#x435;&#x447;&#x43D;&#x443;&#x44E; (4 &#x43A;&#x411; GZIP) &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x435;&#x439; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430; unobtrusive validation &#x43E;&#x442; jQuery, &#x443;&#x43F;&#x440;&#x43E;&#x449;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x438; &#x431;&#x435;&#x437; &#x43A;&#x430;&#x43A;&#x438;&#x445;-&#x43B;&#x438;&#x431;&#x43E; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x435;&#x439;.</p><blockquote>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; <code>aspnet-client-validation</code> &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; IE.</blockquote><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x43E;&#x43F;&#x440;&#x43E;&#x431;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443;, &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x442;&#x435;&#x433;&#x438; &lt;script&gt;:</p><ul><li><code>~/lib/jquery/dist/jquery.min.js</code> (&#x432; <em><em>_Layout.cshtml</em></em>)</li><li><code>~/lib/jquery-validation/dist/jquery.validate.min.js</code> (&#x432; <em><em>_ValidationScriptsPartial.cshtml</em></em>)</li><li><code>~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js</code> (&#x432; <em><em>_ValidationScriptsPartial.cshtml</em></em>)</li></ul><blockquote>&#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; jQuery &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; Bootstrap 4 (&#x438;&#x43B;&#x438; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x440;&#x430;&#x43D;&#x43D;&#x44E;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E;), &#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; Bootstrap 5 (&#x43A;&#x430;&#x43A; &#x432; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x44B;&#x445; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430;&#x445; .NET 7 ASP.NET Core), &#x442;&#x43E; jQuery &#x441;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x43D;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43D; &#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;.</blockquote><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x443;&#x434;&#x430;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x44D;&#x442;&#x438;&#x445; &#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x43D;&#x430; <code>aspnet-validation.min.js</code> &#x432; &#x444;&#x430;&#x439;&#x43B; _ValidationScriptsPartial.cshtml. &#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x438;&#x436;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; bootstrap().</p><pre><code class="language-razor">&lt;script src=&quot;https://www.unpkg.com/aspnet-client-validation/dist/aspnet-validation.min.js&quot; crossorigin=&quot;anonymous&quot; integrity=&quot;sha384-4E0R5+D480pDlcgfpDw2NZDUAX0YsK6J4Zk6o4raasSXMaAlatx9tyNxkFBESu6C&quot;&gt;&lt;/script&gt;
&lt;script&gt;
    const v  = new aspnetValidation.ValidationService()
    v.bootstrap()
&lt;/script&gt;</code></pre><blockquote>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432;&#x44B;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x441;&#x441;&#x44B;&#x43B;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x444;&#x430;&#x439;&#x43B; JavaScript &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x438;&#x437; CDN, &#x43D;&#x43E; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x43E;&#x441;&#x43B;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; &#x444;&#x430;&#x439;&#x43B; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x432; &#x442;&#x435;&#x433;&#x435; &lt;script&gt; &#x438;&#x43B;&#x438; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x441;&#x432;&#x43E;&#x438; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x44B; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; ES Modules &#x438;&#x43B;&#x438; Common JS, &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434; &#x432;&#x44B; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x435;&#x442;&#x435;.</blockquote><p>&#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442; <code>aspnet-client-validation</code>, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x434; bootstrap. <code>ValidationService.bootstrap()</code> &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x44B; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; DOM-&#x441;&#x43B;&#x443;&#x448;&#x430;&#x442;&#x435;&#x43B;&#x44C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43A;&#x430;&#x43D;&#x438;&#x440;&#x443;&#x435;&#x442; HTML-&#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x432; &#x43F;&#x43E;&#x438;&#x441;&#x43A;&#x430;&#x445; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;.</p><p>&#x412; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x432;&#x441;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;. &#x412;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x443;&#x44E; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x438;, &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x434;&#x430;&#x435;&#x442; &#x442;&#x43E;&#x442; &#x436;&#x435; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;, &#x447;&#x442;&#x43E; &#x438; &#x43F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; jQuery.</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-3.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="741" height="378" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-3.png 600w, https://zznob.ru/content/images/2023/05/image-3.png 741w" sizes="(min-width: 720px) 720px"></figure><p>&#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C; <em>_ValidationScriptsPartial.cshtml</em> &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x442; jQuery &#x438; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x438;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;&#x439; &#x43D;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x438;&#x43C; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; <code>aspnet-client-validation</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43E;&#x43D;&#x430; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x433;&#x438;&#x431;&#x43A;&#x430;, &#x43A;&#x430;&#x43A; &#x438; jQuery-&#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442;.</p><h2 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D0%B2%D0%B0%D0%B9%D0%B4%D0%B5%D1%80%D0%B0-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-aspnet-client-validation">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x430; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; aspnet-client-validation.</h2><p>ASP.NET Core &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x43E;&#x439; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x432; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x435; <em>.NET DataAnnotations</em>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x443; &#x442;&#x430;&#x43A;&#x438;&#x445; &#x432;&#x435;&#x449;&#x435;&#x439;, &#x43A;&#x430;&#x43A; Email, &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x43E;&#x43B;&#x44F;, &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x434;&#x43B;&#x438;&#x43D;&#x430;, &#x434;&#x438;&#x430;&#x43F;&#x430;&#x437;&#x43E;&#x43D;&#x44B; &#x438; Regex. &#x42D;&#x442;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; &#x43E;&#x445;&#x432;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x440;&#x430;&#x441;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432;, &#x43D;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x430;&#x435;&#x442; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C; &#x432; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x438; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;. &#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x432; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;, &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x43D;&#x438;&#x445; - &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%B0-validationattribute">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430; ValidationAttribute</h3><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x440;&#x430;&#x437;&#x440;&#x435;&#x448;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x44D;&#x43B;&#x435;&#x43A;&#x442;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x445; &#x430;&#x434;&#x440;&#x435;&#x441;&#x43E;&#x432; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;&#x43C;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x437;&#x430;&#x43A;&#x430;&#x43D;&#x447;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x430; @mycompany.com. &#x412;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &quot;endswith&quot; &#x43D;&#x435; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442;, &#x43E;&#x434;&#x43D;&#x430;&#x43A;&#x43E; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C;. &#x423;&#x43F;&#x440;&#x43E;&#x449;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">public class EndsWithValidationAttribute : ValidationAttribute
{
    private readonly string _endsWith;
    public EndsWithValidationAttribute(string endsWith)
    {
        _endsWith = endsWith;
    }

    public override string FormatErrorMessage(string name)
        =&gt; $&quot;The field {name} must end with &apos;{_endsWith}&apos;&quot;;

    public override bool IsValid(object? value)
    {
        if(value is null)
        {
            return true; // &#x414;&#x43E;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; &#x43D;&#x443;&#x43B;&#x435;&#x432;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x441; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x43C; Required
        }

        return value is string s&amp;&amp; s.EndsWith(_endsWith);
    }
}</code></pre><p>&#x418; &#x431;&#x443;&#x434;&#x435;&#x442; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D; &#x432; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x43A;&#x430;&#x43A;</p><pre><code class="language-csharp">public class Person
{
    [Required]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    [EndsWithValidation(&quot;@mycompany.com&quot;)] // &#x1F448; &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C;
    public string Email { get; set; }
}</code></pre><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x444;&#x43E;&#x440;&#x43C;&#x443;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x438; &#x43E;&#x442;&#x43C;&#x435;&#x447;&#x430;&#x435;&#x442; &#x43D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x430;&#x434;&#x440;&#x435;&#x441;&#x430; &#x44D;&#x43B;&#x435;&#x43A;&#x442;&#x440;&#x43E;&#x43D;&#x43D;&#x43E;&#x439; &#x43F;&#x43E;&#x447;&#x442;&#x44B;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-4.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="741" height="355" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-4.png 600w, https://zznob.ru/content/images/2023/05/image-4.png 741w" sizes="(min-width: 720px) 720px"></figure><p>&#x41F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x44D;&#x442;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x443;&#x431;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x434;&#x430;&#x436;&#x435; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x430;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x44C; &#x441; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;. &#x427;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;:</p><ol><li>&#x41F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; data-*, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</li><li>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440; &#x432; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</li></ol><p>&#x428;&#x430;&#x433; 1. &#x43E;&#x434;&#x438;&#x43D;&#x430;&#x43A;&#x43E;&#x432; &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x43B;&#x438; &#x432;&#x44B; &#x441;&#x442;&#x430;&#x43D;&#x434;&#x430;&#x440;&#x442;&#x43D;&#x443;&#x44E; jQuery unobtrusive validation &#x438;&#x43B;&#x438; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; <code>aspnet-client-validation</code>. <a href="https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-7.0&amp;ref=zznob.ru#attributeadapter-for-client-side-validation">&#x415;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x432; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;</a>, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x446;&#x435;&#x43B;&#x435;&#x439; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x44F; &#x431;&#x443;&#x434;&#x443; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x442;&#x44C; <code>IClientModelValidator</code> &#x43D;&#x430; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x435; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;.</p><h3 id="%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%BE%D0%B2-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-iclientmodelvalidator">&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;-&#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; IClientModelValidator</h3><p>&#x420;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; <code>IClientModelValidator</code> &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x435;&#x434;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>AddValidation()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x445; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; <code>data-*</code>. &#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x442;&#x440;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430;:</p><ul><li><code>data-val=&quot;true&quot;</code>. &#x411;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; &#x44D;&#x442;&#x43E;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43A; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;.</li><li><code>data-val-endswith</code>. &#x42D;&#x442;&#x43E;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x431; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x43D;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x435;.</li><li><code>data-val-endswith-value</code>. &#x42D;&#x442;&#x43E;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x430; &#x438;&#x441;&#x43A;&#x430;&#x442;&#x44C; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;.</li></ul><p>&#x427;&#x430;&#x441;&#x442;&#x44C; <code>-endswith</code> &#x443;&#x43D;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x43E;&#x439; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x442;&#x43E;&#x440;&#x430;, &#x43D;&#x43E;, &#x43F;&#x43E; &#x438;&#x434;&#x435;&#x435;, &#x43E;&#x43D;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x43E;&#x439;. &#x42D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x442;&#x44C; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C;&#x443; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430;. &#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x443;&#x44E; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; &#x434;&#x43B;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438; jQuery unobtrusive validation, <a href="https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-7.0&amp;ref=zznob.ru#custom-client-side-validation">&#x43A;&#x430;&#x43A; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x43E; &#x432; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438;</a>. &#x41C;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x445;&#x443;&#x43A; &#x434;&#x43B;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438; <code>aspnet-client-validation</code>.</p><pre><code class="language-csharp">public class EndsWithValidationAttribute : ValidationAttribute, IClientModelValidator
{
    private readonly string _endsWith;
    public EndsWithValidationAttribute(string endsWith)
    {
        _endsWith = endsWith;
    }

    // &#x1F447; &#x414;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432;
    public void AddValidation(ClientModelValidationContext context)
    {
        var errorMessage = FormatErrorMessage(context.ModelMetadata.DisplayName ?? context.ModelMetadata.Name);
        context.Attributes.TryAdd(&quot;data-val&quot;, &quot;true&quot;);
        context.Attributes.TryAdd(&quot;data-val-endswith&quot;, errorMessage);
        context.Attributes.TryAdd(&quot;data-val-endswith-value&quot;, _endsWith);
    }

    public override string FormatErrorMessage(string name)
        =&gt; $&quot;The field {name} must end with &apos;{_endsWith}&apos;&quot;;

    public override bool IsValid(object? value)
    {
        if(value is null)
        {
            return true;
        }

        return value is string s&amp;&amp; s.EndsWith(_endsWith);
    }
}</code></pre><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>AddValidation</code> &#x432; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; HTML, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x435;&#x43C; &#x434;&#x432;&#x430; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430; <code>data-val-endswith*</code>:</p><pre><code class="language-razor">&lt;input class=&quot;form-control input-validation-error&quot; type=&quot;email&quot; 
    id=&quot;Input_Email&quot; name=&quot;Input.Email&quot; value=&quot;test@Test.com&quot;
    data-val=&quot;true&quot; data-val-required=&quot;The Email field is required.&quot; 
    data-val-email=&quot;The Email field is not a valid e-mail address.&quot; 
    data-val-endswith=&quot;The field Email must end with &apos;@mycompany.com&apos;&quot; 
    data-val-endswith-value=&quot;@mycompany.com&quot;&gt;</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B;, &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440; <code>aspnet-client-validation</code> &#x434;&#x43B;&#x44F; &#x438;&#x445; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D0%B2%D0%B0%D0%B9%D0%B4%D0%B5%D1%80%D0%B0-%D0%B4%D0%BB%D1%8F-aspnet-client-validation">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; aspnet-client-validation.</h3><p>&#x412; <code>aspnet-client-validation</code> &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x435; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43A; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;. &#x427;&#x442;&#x43E;&#x431;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x430;, &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x438;&#x442;&#x435; <code>ValidationService.addProvider()</code>, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432; &#x438;&#x43C;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440;&#x430; (&#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; <code>endswith</code>) &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443;. &#x42D;&#x442;&#x43E;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x442;&#x440;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;:</p><ul><li><code>value</code>: &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x432;&#x432;&#x43E;&#x434;&#x430;</li><li><code>elemet</code>: &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;&#x44B;&#x439; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; DOM</li><li><code>params</code>: &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x447;&#x435;&#x440;&#x435;&#x437; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; <code>data-*</code>. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; <code>data-val-endswith-value</code>, &#x432;&#x44B;&#x437;&#x432;&#x430;&#x432; <code>params.value</code>. &#x412; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x44B; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; <code>data-val-endswith-somethingelse</code>, &#x432;&#x44B;&#x437;&#x432;&#x430;&#x432; <code>params.somethingelse</code>.</li></ul><p>&#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x439;&#x434;&#x435;&#x440; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-razor">&lt;script src=&quot;https://www.unpkg.com/aspnet-client-validation/dist/aspnet-validation.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
  const v  = new aspnetValidation.ValidationService()
  // &#x1F447; &#x412;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; addProvider() _&#x43F;&#x435;&#x440;&#x435;&#x434;_ &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; bootstrap()
  v.addProvider(&apos;endswith&apos;, (value, element, params) =&gt; {
    if (!value) {
        // &#x41F;&#x443;&#x441;&#x442;&#x44C; [Required] &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x43F;&#x443;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x432;&#x432;&#x43E;&#x434;&#x430;...
        return true;
    }

    return value.endsWith(params.value);
  });
  v.bootstrap();
&lt;/script&gt;</code></pre><p>&#x418; &#x432;&#x43E;&#x442;, &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x431;&#x435;&#x437; jQuery!&#x1F389;</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-5.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="741" height="355" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-5.png 600w, https://zznob.ru/content/images/2023/05/image-5.png 741w" sizes="(min-width: 720px) 720px"></figure><h2 id="%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B5-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%B2-aspnet-core">&#x411;&#x443;&#x434;&#x443;&#x449;&#x435;&#x435; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x432; ASP.NET Core.</h2><p>&#x42F; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43B; <code>aspnet-client-validation</code> &#x432; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x435;, &#x43D;&#x43E; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x44F; &#x438;&#x437; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x44F; &#x432;&#x438;&#x434;&#x435;&#x43B;, &#x44F; &#x43D;&#x435; &#x432;&#x438;&#x436;&#x443; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D; &#x43F;&#x440;&#x438;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; jQuery unobtrusive validation scripts. &#x41F;&#x43E;&#x434;&#x445;&#x43E;&#x434; <code>aspnet-client-validation</code>, &#x43A;&#x430;&#x436;&#x435;&#x442;&#x441;&#x44F;, &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x442;&#x443; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x443;&#x44E; &#x434;&#x44B;&#x440;&#x443;, &#x43D;&#x43E; &#x441; &#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x435;&#x439; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x438; &#x441; &#x433;&#x43E;&#x440;&#x430;&#x437;&#x434;&#x43E; &#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x438;&#x43C; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440;&#x43E;&#x43C; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438;.</p><p>&#x423; &#x43C;&#x435;&#x43D;&#x44F; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;: &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;? &#x415;&#x441;&#x43B;&#x438; &#x443;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C; &#x43E;&#x442; jQuery, &#x442;&#x43E; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D; &#x434;&#x435;&#x440;&#x436;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430;&#x445; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;. &#x41A;&#x430;&#x436;&#x435;&#x442;&#x441;&#x44F;, &#x447;&#x442;&#x43E; <code>aspnet-client-validation</code> &#x431;&#x44B;&#x43B; &#x431;&#x44B; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x438; &#x43B;&#x435;&#x433;&#x43A;&#x43E;&#x439; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x430;&#x446;&#x438;&#x435;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x439;.</p><p>&#x425;&#x43E;&#x440;&#x43E;&#x448;&#x430;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x441;&#x442;&#x44C; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x438; ASP.NET Core <a href="https://github.com/dotnet/aspnetcore/issues/8573?ref=zznob.ru">&#x435;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;, &#x43F;&#x43E;&#x441;&#x432;&#x44F;&#x449;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x44D;&#x442;&#x43E;&#x43C;&#x443;</a>. &#x41F;&#x43B;&#x43E;&#x445;&#x430;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x441;&#x442;&#x44C; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x431;&#x44B;&#x43B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D; 4 &#x433;&#x43E;&#x434;&#x430; &#x43D;&#x430;&#x437;&#x430;&#x434; &#x438;, &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435;, &#x437;&#x430;&#x441;&#x442;&#x440;&#x44F;&#x43B; &#x432; &#x43D;&#x435;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x1F622;.</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/05/image-6.png" class="kg-image" alt="&#x41A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.Net Core &#x431;&#x435;&#x437; jQuery" loading="lazy" width="908" height="388" srcset="https://zznob.ru/content/images/size/w600/2023/05/image-6.png 600w, https://zznob.ru/content/images/2023/05/image-6.png 908w" sizes="(min-width: 720px) 720px"></figure><p>&#x422;&#x430;&#x43A; &#x432; &#x447;&#x435;&#x43C; &#x436;&#x435; &#x434;&#x435;&#x43B;&#x43E;? &#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442;?</p><p>&#x412; <a href="https://github.com/dotnet/aspnetcore/issues/8573?ref=zznob.ru#issuecomment-854036038">&#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x438; &#x43E;&#x442; 2021 </a>&#x433;&#x43E;&#x434;&#x430; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x442;&#x43E;, &#x447;&#x442;&#x43E;, &#x43F;&#x43E;-&#x432;&#x438;&#x434;&#x438;&#x43C;&#x43E;&#x43C;&#x443;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x440;&#x43D;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B;:</p><blockquote>&#x41F;&#x435;&#x440;&#x432;&#x43E;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43C;&#x44B;&#x441;&#x43B;&#x44C; &#x431;&#x44B;&#x43B;&#x430; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435;, &#x43E;&#x43F;&#x438;&#x440;&#x430;&#x44F;&#x441;&#x44C; &#x43B;&#x438;&#x431;&#x43E; &#x43D;&#x430; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x430;, &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x439;, &#x43B;&#x438;&#x431;&#x43E; &#x43D;&#x430; &#x440;&#x443;&#x447;&#x43D;&#x43E;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x438;&#x43C;&#x438;&#x442;&#x430;&#x446;&#x438;&#x438; jQuery.validation. &#x41D;&#x43E; &#x43F;&#x440;&#x438; &#x434;&#x430;&#x43B;&#x44C;&#x43D;&#x435;&#x439;&#x448;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x438; &#x43C;&#x44B; &#x43F;&#x43E;&#x43D;&#x44F;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x443;&#x431;&#x438;&#x440;&#x430;&#x435;&#x442; jquery, &#x43D;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x441;.</blockquote><p><a href="https://github.com/dotnet/aspnetcore/issues/8573?ref=zznob.ru#issuecomment-854036038">&#x412; &#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x438;</a> &#x435;&#x441;&#x442;&#x44C; &#x435;&#x449;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x435;&#x439;, &#x43D;&#x43E; &#x441;&#x443;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43E;&#x43D;&#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43D;&#x435; &#x445;&#x43E;&#x442;&#x44F;&#x442; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x443;&#x44E; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; JavaScript. &#x422;&#x43E;, &#x447;&#x442;&#x43E; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &quot;&#x443;&#x434;&#x430;&#x43B;&#x438;&#x442;&#x44C; jQuery&quot;, &#x43F;&#x435;&#x440;&#x435;&#x440;&#x43E;&#x441;&#x43B;&#x43E; &#x432; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x433;&#x440;&#x430;&#x43D;&#x434;&#x438;&#x43E;&#x437;&#x43D;&#x44B;&#x439; &quot;&#x43F;&#x435;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x432; MVC&quot; &#x438; &#x432;&#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x441;&#x442;&#x432;&#x438;&#x438; &#x437;&#x430;&#x433;&#x43B;&#x43E;&#x445;&#x43B;&#x43E;.</p><p>&#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435;, &#x432; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x434;&#x435;-&#x444;&#x430;&#x43A;&#x442;&#x43E;, &quot;&#x431;&#x43B;&#x430;&#x433;&#x43E;&#x441;&#x43B;&#x43E;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x439;&quot; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E; &#x43D;&#x430; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x2014; &#x44D;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430; jQuery. &#x412; 2023 &#x433;&#x43E;&#x434;&#x443;. ASP.NET Core &#x2014; &#x44D;&#x442;&#x43E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x44B;&#x439;, &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432;&#x435;&#x431;-&#x444;&#x440;&#x435;&#x439;&#x43C;&#x432;&#x43E;&#x440;&#x43A;. &#x41E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442;&#x435; &#x43B;&#x438; &#x432;&#x44B;, &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x431;&#x443;&#x434;&#x435;&#x442; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x442;&#x44C; jQuery? &#x1F633; &#x41D;&#x435;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;, &#x43F;&#x440;&#x430;&#x432;&#x434;&#x430;?</p><p>&#x41A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x44F; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x44E;. Blazor &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x432; &#x446;&#x435;&#x43D;&#x442;&#x440;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;, &#x438; &#x443; &#x43D;&#x435;&#x433;&#x43E; &#x43D;&#x435;&#x442; &#x442;&#x435;&#x445; &#x436;&#x435; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;. &#x41D;&#x43E; MVC/Razor Pages &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439;.</p><p>&#x422;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C;, &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; jQuery &#x43D;&#x430; <code>aspnet-client-validation</code> &#x438; &#x43F;&#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x442;&#x44C; &#x441; &#x44D;&#x442;&#x438;&#x43C;&#x1F605;.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x432; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x432; ASP.NET Core, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; jQuery &#x438; &#x43F;&#x43B;&#x430;&#x433;&#x438;&#x43D; <code>unobtrusive validation</code>. &#x417;&#x430;&#x442;&#x435;&#x43C; &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x443;&#x44E; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x443; &#x424;&#x438;&#x43B;&#x430; &#x425;&#x430;&#x430;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x442;&#x443; &#x436;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;, &#x43F;&#x43E;&#x434; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; <code>aspnet-client-validation</code>. &#x42D;&#x442;&#x430; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430; &#x437;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435;&#x433;&#x43E; 4 &#x43A;&#x411; &#x432; GZipped &#x438; &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x435;&#x439;.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x435;&#x435; &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C; &#x441; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x43E;&#x439; <code>unobtrusive validation</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x439; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438;, &#x438; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x43A; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x435; <code>aspnet-client-validation</code>. &#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x441;&#x432;&#x43E;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434; &#x43D;&#x430; &#x431;&#x443;&#x434;&#x443;&#x449;&#x435;&#x435; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x439; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x438; &#x432; ASP.NET Core.</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/adding-client-side-validation-to-aspnet-core-without-jquery-or-unobtrusive-validation/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Настройка RequestDelegate с помощью фильтров]]></title><description><![CDATA[<p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x43A;&#x43E;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;</p>]]></description><link>https://zznob.ru/nastroika-requestdelegate-s-pomoshchiu-filtrov/</link><guid isPermaLink="false">644def2a9271e30001125ac5</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 30 Apr 2023 06:24:21 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1584028377469-1c5e5f4ecdae?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMwfHxmaWx0ZXJ8ZW58MHx8fHwxNjgyNzgyMTgx&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1584028377469-1c5e5f4ecdae?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMwfHxmaWx0ZXJ8ZW58MHx8fHwxNjgyNzgyMTgx&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; RequestDelegate &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;"><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x43A;&#x43E;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API. &#x412; &#x440;&#x430;&#x43C;&#x43A;&#x430;&#x445; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430; &#x44F; &#x438;&#x433;&#x43D;&#x43E;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &quot;filters&quot;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x432; .NET 7, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D;&#x430; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;. &#x427;&#x442;&#x43E; &#x436;, &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x442;&#x43E;&#x43B;&#x43A;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x441; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x43B;&#x438;&#x446;&#x43E;&#x43C; &#x43A; &#x43B;&#x438;&#x446;&#x443; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; RequestDelegate.</p><h3 id="requestdelegate-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-api-%D0%B1%D0%B5%D0%B7-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2">RequestDelegate &#x434;&#x43B;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x431;&#x435;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;.</h3><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x443;&#x441;&#x44C; &#x43D;&#x430; &#x442;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; RequestDelegate, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x441; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430; &#x434;&#x43B;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x431;&#x435;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;:</p><pre><code class="language-charp">app.MapGet(&quot;/{name}&quot;, (string name) =&gt; $&quot;Hello {name}!&quot;);</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x441;&#x43B;&#x435;&#x434;&#x438;&#x43B;&#x438; &#x437;&#x430; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439;, &#x432;&#x44B; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task (HttpContext httpContext) =&gt; TargetableRequestDelegate(Program.&lt;&gt;c, httpContext);</code></pre><p>&#x433;&#x434;&#x435; <code>TargetableRequestDelegate</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task TargetableRequestDelegate(object? target, HttpContext httpContext)
{
    string name_local;
    bool wasParamCheckFailure;

    name_local = httpContext.Request.RouteValues[&quot;name&quot;]
    if (name_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);
    }

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    return ExecuteWriteStringResponseAsync(
        httpContext,
        handler(name_local));
}</code></pre><p>&#x42F; &#x43D;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>ExecuteWriteStringResponseAsync()</code>, &#x43D;&#x43E;, &#x43F;&#x43E; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;, &#x43E;&#x43D; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A; &#x431;&#x44B;&#x43B;&#x43E; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;:</p><pre><code class="language-csharp">Task ExecuteWriteStringResponseAsync(HttpContext httpContext, string text)
{
    httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
    return httpContext.Response.WriteAsync(text);
}</code></pre><p>&#x418;&#x442;&#x430;&#x43A;, &#x44D;&#x442;&#x43E; &#x43D;&#x430;&#x448;&#x430; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x447;&#x43A;&#x430;. &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x43A; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x443; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x432;&#x441;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x441;&#x44F;.</p><h3 id="%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-api-%D1%81-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D0%BC%D0%B8-%D0%B8-%D1%84%D0%B0%D0%B1%D1%80%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2">&#x41C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; API &#x441; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x43C;&#x438; &#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430;&#x43C;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;.</h3><p>&#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &quot;&#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443;&quot; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; <code>400 Bad Request</code> &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x438;, &#x430; &#x432; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;:</p><pre><code class="language-csharp">app.MapGet(&quot;/{name}&quot;, (string name) =&gt; $&quot;Hello {name}!&quot;)
    .AddEndpointFilter(async (context, next) =&gt;
    {
        var name = context.GetArgument&lt;string&gt;(0);
        if (name is not &quot;Sock&quot;)
        {
            return Results.ValidationProblem(
                new Dictionary&lt;string, string[]&gt;
                {
                    {&quot;name&quot;, new[]{&quot;Invalid name&quot;}}
                });
        }
        
        return await next(context); 
    });</code></pre><p>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &quot;endpoint-specific&quot; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x42D;&#x442;&#x43E;&#x442; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430; &quot;&#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&quot;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/04/image-4.png" class="kg-image" alt="&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; RequestDelegate &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;" loading="lazy" width="626" height="119" srcset="https://zznob.ru/content/images/size/w600/2023/04/image-4.png 600w, https://zznob.ru/content/images/2023/04/image-4.png 626w"></figure><p>&#x422;&#x438;&#x43F; <code>EndpointFilterDelegate</code> &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">public delegate ValueTask&lt;object?&gt; EndpointFilterDelegate(EndpointFilterInvocationContext context);</code></pre><p>&#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; <code>Func&lt;EndpointFilterInvocationContext, ValueTask&lt;object?&gt;&gt;</code> .</p><p>&#x41A;&#x430;&#x43A; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x438;&#x437; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x439; &quot;filter&quot; &#x438; &quot;filter factory&quot;:</p><ul><li>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;, &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x447;&#x430;&#x441;&#x442;&#x44C; <code>RequestDelegate</code>. &#x417;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; &#x438;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;, &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;.</li><li>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>. &#x417;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x438;&#x437; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x434;&#x43E;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x435;. &#x412;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C; &quot;next&quot; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;.</li></ul><p><br>&#x41D;&#x435; &#x432;&#x43E;&#x43B;&#x43D;&#x443;&#x439;&#x442;&#x435;&#x441;&#x44C;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x43E;, &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E; &#x43F;&#x430;&#x442;&#x442;&#x435;&#x440;&#x43D;&#x44B; &#x438; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x43C;&#x438; &#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430;&#x43C;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x432; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;. &#x42F; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x44E; &#x44D;&#x442;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x441; &#x442;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x439; &#x442;&#x43E;&#x447;&#x43A;&#x438; &#x437;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; API &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x434;&#x435;&#x43B;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430;&#x43C;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;. &#x414;&#x432;&#x430; API, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x448;&#x435;, &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442;&#x43D;&#x44B;.</p><p>&#x41D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435;, &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>AddEndpointFilter()</code> &#x434;&#x435;&#x43B;&#x435;&#x433;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; <code>AddEndpointFilterFactory()</code>:</p><pre><code class="language-csharp">public static TBuilder AddEndpointFilter&lt;TBuilder&gt;(
    this TBuilder builder,
    Func&lt;EndpointFilterInvocationContext, EndpointFilterDelegate, ValueTask&lt;object?&gt;&gt; routeHandlerFilter)
    where TBuilder : IEndpointConventionBuilder
{
    return builder.AddEndpointFilterFactory(
        (routeHandlerContext, next) =&gt; 
            (context) =&gt; routeHandlerFilter(context, next));
}</code></pre><p>&#x412;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x44B;, &#x43D;&#x43E; &#x432; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x43C; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x432;&#x44B;&#x448;&#x435;. &#x418;&#x442;&#x430;&#x43A;, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442; <code>RequestDelegate</code>.</p><h3 id="requestdelegate-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-api-%D1%81-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%BC">RequestDelegate &#x434;&#x43B;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x441; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x43C;.</h3><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430; &#x432; <code>RequestDelegate</code> &#x432;&#x441;&#x435; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x430;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;. &#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x438;&#x436;&#x435; &#x43A;&#x43E;&#x434; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; <code>TargetableRequestDelegate()</code> &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x43C;. &#x415;&#x441;&#x442;&#x44C; &#x442;&#x440;&#x438; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x445; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x44F;:</p><ul><li><code>RequestDelegate</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x449;&#x438;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>EndpointFilterInvocationContext</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x43D;&#x430; <code>HttpContext</code> &#x438; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43A; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;.</li><li>&#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43F;&#x440;&#x44F;&#x43C;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>EndpointFilterDelegate filterPipeline</code>. &#x41E;&#x43D; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &quot;&#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;&quot;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x43C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</li><li>&#x41A;&#x43E;&#x434; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;&quot; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x438;&#x43F; <code>ValueTask&lt;object?&gt;</code> &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x439;).</li></ul><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x441;&#x44F; <code>TargetableRequestDelegate()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;. &#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43D;&#x438;&#x436;&#x435; &#x43A;&#x43E;&#x434;&#x435; &#x44F; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x438;&#x43B; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x43E;&#x442; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code> :</p><pre><code class="language-csharp">Task TargetableRequestDelegate(object? target, HttpContext httpContext)
{
    string name_local;
    bool wasParamCheckFailure;

    name_local = httpContext.Request.RouteValues[&quot;name&quot;]
    if (name_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);
    }

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
    }

    // &#x1F447; &#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43E;&#x431;&#x449;&#x438;&#x439; EndpointFilterInvocationContext&lt;&gt; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x435;&#x433;&#x43E;
    // &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;
    var filterContext = new EndpointFilterInvocationContext&lt;string&gt;(httpContext, name_local)
    ValueTask&lt;object?&gt; result = filterPipeline.Invoke(filterContext); 

   // &#x1F447; &#x41E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F;
    // ValueTask&lt;object?&gt;, &#x43D;&#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x443;&#x442; &#x432;&#x43E; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; 
// &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x443;&#x442;&#x438; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;
    return ExecuteValueTaskOfObject(result, httpContext);

    // &#x1F447; &quot;&#x41F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439;&quot; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;. &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x443; &#x43D;&#x430;&#x441; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x438;&#x43D;
    // &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435;, &#x437;&#x434;&#x435;&#x441;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x438;&#x43D; &#x443;&#x440;&#x43E;&#x432;&#x435;&#x43D;&#x44C; &quot;&#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438;&quot;.
    ValueTask&lt;object?&gt; filterPipeline(EndpointFilterInvocationContext context)
    {
        // &#x1F447; &#x41D;&#x430;&#x448; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;
        var name = ctx.GetArgument&lt;string&gt;(0);
        if (name is not &quot;Sock&quot;)
        {
            return Results.ValidationProblem(
                new Dictionary&lt;string, string[]&gt;
                {
                    { &quot;name&quot;, new[] { &quot;Invalid name&quot; } }
                });
        }

        // &#x1F447;&#x412;&#x44B;&#x437;&#x43E;&#x432; &quot;&#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E;&quot; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
        return await filteredInvocation(ctx);
    }

    // &#x1F447; &#x412;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
    ValueTask&lt;object?&gt; filteredInvocation(EndpointFilterInvocationContext context)
    {
        if(context.HttpContext.Response.StatusCode &gt;= 400)
        {
            // Already errored, don&apos;t run the handler method
            return ValueTask.CompletedTask;  
        }
        else
        {
            // Create the &quot;instance&quot; of the target (if any)
            var target = targetFactory(context.HttpContext); 
            // Execute the handler using the arguments from the filter context
            // and wrap the result in in a ValueTask
            return ValueTask.FromResult&lt;object?&gt;( 
                target.handler.Invoke(context.GetArgument&lt;string&gt;(0)) // the actual handler execution
            );
        }
    }
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x438; &#x431;&#x44B;&#x43B;&#x43E; &#x43E;&#x431;&#x435;&#x449;&#x430;&#x43D;&#x43E;, &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x439;. &#x412; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x448;&#x435;&#x439;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x438; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;.</p><blockquote>&#x42D;&#x442;&#x430; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x441;&#x43B;&#x435;&#x434;&#x438;&#x43B;&#x438; &#x437;&#x430; &#x445;&#x43E;&#x434;&#x43E;&#x43C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x43D;&#x430;&#x434; &#x441;&#x435;&#x440;&#x438;&#x435;&#x439;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x43A;&#x430;&#x441;&#x430;&#x44E;&#x441;&#x44C; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x438; &#x431;&#x435;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;.</blockquote><h3 id="%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-createarguments">&#x418;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432; CreateArguments().</h3><p>&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; <code>RequestDelegate</code> &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x44F;&#x442; &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>CreateArguments()</code>. &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43A; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;, &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x445;, &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x42D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43B;&#x443;&#x436;&#x438;&#x442; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x438;&#x437; <code>EndpointFilterInvocationContext</code>, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x43D;&#x438;&#x436;&#x435;:</p><pre><code class="language-csharp">context.GetArgument&lt;string&gt;(0);</code></pre><blockquote>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x434;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x434; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x43A;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x438;&#x437; <code>IList&lt;object?&gt;</code> (&#x447;&#x442;&#x43E; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x435;&#x439; boxing &#x434;&#x43B;&#x44F; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;), &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; <code>context. Arguments[0]</code>.</blockquote><p>&#x42D;&#x442;&#x43E;&#x442; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; Expression &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; factoryContext.ContextArgAccess &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43D;&#x430; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x43C; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;.</p><h3 id="%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%B2-createfilterpipeline">&#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432; CreateFilterPipeline().</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; <code>CreateTargetableRequestDelegate()</code>, &#x433;&#x434;&#x435; &#x43C;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; <code>CreateFilterPipeline()</code> &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>EndpointFilterDelegate</code>:</p><pre><code class="language-csharp">EndpointFilterDelegate? filterPipeline = null

if (factoryContext.EndpointBuilder.FilterFactories.Count &gt; 0)
{
    filterPipeline = CreateFilterPipeline(methodInfo, targetExpression, factoryContext, targetFactory);

    // ... &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x435;&#x439;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x43D;&#x438;&#x436;&#x435;
}</code></pre><p><code>CreateFilterPipeline()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x438; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x443;:</p><pre><code class="language-csharp">private static EndpointFilterDelegate? CreateFilterPipeline(
    MethodInfo methodInfo, // &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; endpoint
    Expression? targetExpression, // &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &apos;target&apos; &#x43A; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C;&#x443; &#x442;&#x438;&#x43F;&#x443;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, (Program)target
    RequestDelegateFactoryContext factoryContext, // &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; RequestDelegate
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory) // _ =&gt; handler.Target; </code></pre><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x430;&#x445; &#x44F; &#x440;&#x430;&#x437;&#x431;&#x435;&#x440;&#x443; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x448;&#x430;&#x433; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43F;&#x43E; &#x43C;&#x435;&#x440;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x435;&#x43F;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B5%D0%B3%D0%BE-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</h3><p>&#x41F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44E; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; middleware &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x439; &quot;&#x43C;&#x430;&#x442;&#x440;&#x435;&#x448;&#x43A;&#x438;&quot;, CreateFilterPipeline() &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x441; &quot;&#x441;&#x430;&#x43C;&#x43E;&#x433;&#x43E; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E;&quot; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x431;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x432;&#x43E;&#x43A;&#x440;&#x443;&#x433; &#x43D;&#x435;&#x433;&#x43E; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438;. &#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E;:</p><pre><code class="language-csharp">targetExpression is null
    ? Expression.Call(methodInfo, factoryContext.ContextArgAccess)
    : Expression.Call(targetExpression, methodInfo, factoryContext.ContextArgAccess)</code></pre><p>&#x42D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; <code>context.GetArgument(0)</code>:</p><pre><code class="language-csharp">target.handler.Invoke(context.GetArgument&lt;string&gt;(0));</code></pre><p>&#x42D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434; MapHandlerReturnTypeToValueTask() &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x441; &#x442;&#x438;&#x43F;&#x43E;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; (&#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; - &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430;):</p><pre><code class="language-csharp">Expression handlerReturnMapping = MapHandlerReturnTypeToValueTask(
    targetExpression is null        // target.handler.Invoke(context.GetArgument&lt;string&gt;(0));
        ? Expression.Call(methodInfo, factoryContext.ContextArgAccess)
        : Expression.Call(targetExpression, methodInfo, factoryContext.ContextArgAccess),
    methodInfo.ReturnType);         // string</code></pre><p><code>MapHandlerReturnTypeToValueTask()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; endpoint &#x432; <code>ValueTask</code>. &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x440;&#x435;&#x447;&#x44C; &#x438;&#x434;&#x435;&#x442; &#x43D;&#x435; &#x43E; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x430; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x438; &#x435;&#x433;&#x43E; &#x432; <code>ValueTask&lt;object?&gt;</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D; &#x43C;&#x43E;&#x433; &#x432;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43A;&#x430;&#x43A; <code>EndpointFilterDelegate</code>.</p><p>&#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API (&#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;) <code>MapHandlerReturnTypeToValueTask()</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>WrapObjectAsValueTask</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x437;&#x430;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432; <code>ValueTask&lt;object?&gt;</code>, &#x432;&#x44B;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x43A;&#x43E;&#x434;, &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x438;&#x439; &#x43D;&#x430;:</p><pre><code class="language-csharp">return ValueTask.FromResult&lt;object?&gt;(
    target.handler.Invoke(context.GetArgument&lt;string&gt;(0))
);</code></pre><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE-%D1%8D%D0%BA%D0%B7%D0%B5%D0%BC%D0%BF%D0%BB%D1%8F%D1%80%D0%B0">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x433;&#x43E; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430;.</h3><p>&#x414;&#x430;&#x43B;&#x435;&#x435; <code>CreateFilterPipeline()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>targetFactory</code>. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x432;&#x43A;&#x440;&#x430;&#x442;&#x446;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x43E; &#x43D;&#x438;&#x445;: <code>target</code> &#x2014; &#x44D;&#x442;&#x43E; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x414;&#x43B;&#x44F; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x44D;&#x442;&#x43E; <a href="https://sharplab.io/?ref=zznob.ru#v2:EYLgtghglgdgPgAQEwEYCwAoBBmABM3AYVwG9NcL88EAWXAWQAoBKU8yjgUQA8BTAYwCuAF14ARXgBteAcwijGjBCgAMuGBDC9WAXgB8uACQAiABZTJAe1IatAXwCEx5gG52FO+9xec+OjwERcSlZeV5GCWk5UVxTCBgAE2kAJ2YvMgwOTww7IA=">&#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x439;&#x441;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;</a>, &#x43D;&#x43E; &#x43E;&#x43D; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x438; <code>null</code>, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;.</p><pre><code class="language-csharp">BlockExpression handlerInvocation = Expression.Block(
    new[] { TargetExpr },
    targetFactory == null
        ? Expression.Empty()
        : Expression.Assign(TargetExpr, Expression.Invoke(targetFactory, FilterContextHttpContextExpr)),
    handlerReturnMapping
);</code></pre><p>&#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;, &#x433;&#x434;&#x435; <code>targetFactory</code> &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; <code>_ =&gt; handler.Target</code> &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API:</p><pre><code class="language-csharp">target = targetFactory(context.HttpContext);
return ValueTask.FromResult&lt;object?&gt;(                     // from handlerReturnMapping
    target.handler.Invoke(context.GetArgument&lt;string&gt;(0)) // 
);</code></pre><p>&#x414;&#x43B;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; targetFactory &#x431;&#x443;&#x434;&#x435;&#x442; &#x440;&#x430;&#x432;&#x43D;&#x43E; null, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x435;&#x441;&#x44C; handlerInvocation &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">return ValueTask.FromResult&lt;object?&gt;(              // from handlerReturnMapping
    handler.Invoke(context.GetArgument&lt;string&gt;(0)) // 
);</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432; EndpointFilterDelegate.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D0%B8%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>CreateFilterPipeline()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44F; Expression &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">EndpointFilterDelegate filteredInvocation = Expression.Lambda&lt;EndpointFilterDelegate&gt;(
    Expression.Condition(
        Expression.GreaterThanOrEqual(FilterContextHttpContextStatusCodeExpr, Expression.Constant(400)),
        CompletedValueTaskExpr,
        handlerInvocation),
    FilterContextExpr).Compile();</code></pre><p>&#x42D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x434; Expression &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">if(context.HttpContext.Response.StatusCode &gt;= 400)
{
    return ValueTask.CompletedTask;
}
else
{
    target = targetFactory(context.HttpContext);              // 
    return ValueTask.FromResult&lt;object?&gt;(                     // from handlerInvocation
        target.handler.Invoke(context.GetArgument&lt;string&gt;(0)) // 
    );
}</code></pre><p>&#x417;&#x430;&#x442;&#x435;&#x43C; &#x44D;&#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>EndpointFilterDelegate</code>, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x44D;&#x442;&#x43E; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; <code>Func&lt;EndpointFilterInvocationContext, ValueTask&lt;object?&gt;&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">ValueTask&lt;object?&gt; filteredInvocation(EndpointFilterInvocationContext context)
{
    if(context.HttpContext.Response.StatusCode &gt;= 400)
    {
        return ValueTask.CompletedTask;
    }
    else
    {
        var target = targetFactory(context.HttpContext);          // 
        return ValueTask.FromResult&lt;object?&gt;(                     // from handlerInvocation
            target.handler.Invoke(context.GetArgument&lt;string&gt;(0)) // 
        );
    }
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x44D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x435;&#x441;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x434; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;. &#x41E;&#x442;&#x432;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43E;&#x431;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>ValueTask</code> &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BB%D0%B8%D0%BD%D0%B8%D0%B8-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43B;&#x438;&#x43D;&#x438;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;.</h3><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443; &#x43D;&#x430;&#x441; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x435;&#x439;, &#x438; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;. &#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x442; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; <code>EndpointFilterDelegate</code>. <code>CreateFilterPipeline()</code> &#x43F;&#x440;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x43E; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x435; (&#x43E;&#x442; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x439; &#x43A; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439;), &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>EndpointFilterFactoryContext</code> &#x438; &quot;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x43A;&quot; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;:</p><pre><code class="language-csharp">var routeHandlerContext = new EndpointFilterFactoryContext
{
    MethodInfo = methodInfo,           // &#x44D;&#x442;&#x43E; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;
    ApplicationServices = factoryContext.EndpointBuilder.ApplicationServices,
};

var initialFilteredInvocation = filteredInvocation;

// &#x1F447;&#x41F;&#x435;&#x440;&#x435;&#x431;&#x43E;&#x440; &#x432;&#x441;&#x435;&#x445; &#x437;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;, &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x44F; &#x441; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;.
// &quot;&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439;&quot; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &quot;&#x441;&#x430;&#x43C;&#x44B;&#x43C; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x43C;&quot; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; _&#x43F;&#x43E;&#x441;&#x43B;&#x435;_
// &quot;&#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x445;&quot; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430; &#x438; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x430;&#x44F; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C;
for (var i = factoryContext.EndpointBuilder.FilterFactories.Count - 1; i &gt;= 0; i--)
{
    var currentFilterFactory = factoryContext.EndpointBuilder.FilterFactories[i];
    
    // &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442; &#x438; &#x443;&#x436;&#x435; &#x43E;&#x442;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; pipeline
    filteredInvocation = currentFilterFactory(routeHandlerContext, filteredInvocation);
}</code></pre><p>&#x414;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>filteredInvocation</code>. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x435;&#x441;&#x43B;&#x438; &#x43C;&#x44B; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43C; &#x43D;&#x430;&#x448; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x441; &#x43E;&#x434;&#x43D;&#x438;&#x43C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x43C;, &#x442;&#x43E; <code>currentFilterFactory</code> &#x431;&#x443;&#x434;&#x435;&#x442; &quot;&#x444;&#x430;&#x431;&#x440;&#x438;&#x447;&#x43D;&#x43E;&#x439;&quot; &#x432;&#x435;&#x440;&#x441;&#x438;&#x435;&#x439; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;:</p><pre><code class="language-csharp">(EndpointFilterFactoryContext context, EndpointFilterDelegate next) =&gt;
{
    return async ctx =&gt;
    {
        var name = ctx.GetArgument&lt;string&gt;(0);
        if (name is not &quot;Sock&quot;)
        {
            return Results.ValidationProblem(
                new Dictionary&lt;string, string[]&gt;
                {
                    { &quot;name&quot;, new[] { &quot;Invalid name&quot; } }
                });
        }

        return await next(ctx);
    };
}</code></pre><p>&#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>routeHandlerContext</code>, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x431;&#x43B;&#x43E;&#x43A;&#x435; &#x43A;&#x43E;&#x434;&#x430;, &#x430; <code>filteredInvocation</code> &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x442;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x432;&#x44B; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x43A;&#x43B;&#x430;&#x434;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; <code>CreateFilterPipeline()</code> &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x442;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; pipeline &#x438;&#x43B;&#x438; <code>null</code>, &#x435;&#x441;&#x43B;&#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43D;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x43B;&#x438; pipeline &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435;.</p><blockquote>&#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>AddEndpointFilter()</code>, &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>AddEndpointFilterFactory()</code>, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43D;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x43A; endpoint, &#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x432;&#x43B;&#x438;&#x44F;&#x435;&#x442; &#x43D;&#x430; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F;.</blockquote><pre><code class="language-csharp">// &#x424;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x431;&#x44B;&#x43B;&#x438; &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D;&#x44B; &#x431;&#x435;&#x437; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, 
// &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430;.
if (ReferenceEquals(initialFilteredInvocation, filteredInvocation))
{
    return null;
}

return filteredInvocation;</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateFilterPipeline()</code>, &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x44E; &#x442;&#x43E;&#x433;&#x43E;, &#x433;&#x434;&#x435; &#x43E;&#x43D; &#x431;&#x44B;&#x43B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43D; &#x432; <code>CreateTargetableRequestDelegate()</code>.</p><h3 id="%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0-%D0%B2-createtargetablerequestdelegate">&#x412;&#x44B;&#x437;&#x43E;&#x432; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x432; CreateTargetableRequestDelegate.</h3><p>&#x41C;&#x44B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43B;&#x438; <code>CreateFilterPipeline()</code> &#x438;&#x437; <code>CreateTargetableRequestDelegate</code> &#x43F;&#x440;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>. &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43D;&#x430; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F;:</p><pre><code class="language-csharp">EndpointFilterDelegate? filterPipeline = null;
var returnType = methodInfo.ReturnType;

if (factoryContext.EndpointBuilder.FilterFactories.Count &gt; 0)
{
    // &#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432; CreateFilterPipeline()
    filterPipeline = CreateFilterPipeline(methodInfo, targetExpression, factoryContext, targetFactory);

    // &#x415;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x43C;&#x44B; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43B;&#x438;&#x431;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;
    if (filterPipeline is not null)
    {
        // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;
        Expression&lt;Func&lt;EndpointFilterInvocationContext, ValueTask&lt;object?&gt;&gt;&gt; invokePipeline = 
            (context) =&gt; filterPipeline(context);

        // &#x422;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; ValueTask&lt;object?&gt;,
        // &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A;&#x438;&#x43C; &#x431;&#x44B;&#x43B; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x439; &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.
        returnType = typeof(ValueTask&lt;object?&gt;);
        
        // &#x418;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &quot;handler&quot; &#x43D;&#x430; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E;
        factoryContext.MethodCall = Expression.Block(
            new[] { InvokedFilterContextExpr },
            Expression.Assign(
                InvokedFilterContextExpr,
                CreateEndpointFilterInvocationContextBase(factoryContext, factoryContext.ArgumentExpressions)),
            Expression.Invoke(invokePipeline, InvokedFilterContextExpr)
        );
    }
}</code></pre><p>&#x42D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x434; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x434;&#x432;&#x435; &#x432;&#x435;&#x449;&#x438;:</p><ul><li>&#x418;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>returnType</code> &#x43D;&#x430; <code>ValueTask&lt;object?&gt;</code>, &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</li><li>&#x41F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x442; <code>factoryContext.MethodCall</code> &#x432; &#x432;&#x44B;&#x437;&#x43E;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>filterContext</code> &#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;. &#x41E;&#x43D; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43E;&#x431;&#x449;&#x438;&#x439; &#x442;&#x438;&#x43F; <code>EndpointFilterInvocationContext&lt;T&gt;</code> &#x434;&#x43B;&#x44F; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &quot; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F;&quot; &#x432; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430;&#x445; <code>GetArgument&lt;T&gt;</code>.</li></ul><blockquote>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x43F;&#x443;&#x43D;&#x43A;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x435;&#x43D;: <code>EndpointFilterInvocationContext</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C; &#x431;&#x430;&#x437;&#x43E;&#x432;&#x44B;&#x43C; &#x442;&#x438;&#x43F;&#x43E;&#x43C;, &#x43D;&#x43E; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x44B; <code>EndpointFilterInvocationContext</code>, <code>EndpointFilterInvocationContext&lt;T1, T2&gt;</code> &#x438; &#x442;. &#x434;. (&#x434;&#x43E; 10 &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x445; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;)! &#x42D;&#x442;&#x438; &#x43E;&#x431;&#x449;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x44B; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x443;&#x44E;&#x442;, &#x447;&#x442;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; struct &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x443;&#x443;&#x43F;&#x430;&#x43A;&#x43E;&#x432;&#x430;&#x43D;&#x44B; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; <code>GetArgument&lt;T&gt;</code>.</blockquote><p>&#x412;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x434;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">EndpointFilterInvocationContext filterContext = 
    new EndpointFilterInvocationContext&lt;string&gt;(httpContext, name_local)
invokePipeline.Invoke(filterContext);</code></pre><p>&#x42D;&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;, &#x43D;&#x43E; &#x43D;&#x430;&#x43C; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;.</p><h3 id="%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8">&#x41E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;.</h3><p>&#x41A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43D;&#x43E; &#x43D;&#x430;&#x43C; &#x432;&#x441;&#x435; &#x440;&#x430;&#x432;&#x43D;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x434; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;. &#x41E;&#x431;&#x430; &#x44D;&#x442;&#x438;&#x445; &#x448;&#x430;&#x433;&#x430; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;:</p><ul><li>&#x41A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; ValueTask&lt;object?&gt;, &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;.</li><li>&#x411;&#x435;&#x437; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; Task.CompletedTask &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; wasParamCheckFailure == true, &#x434;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x41C;&#x44B; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x441; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x43E;&#x43C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43D;&#x430;&#x43C; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x431;&#x44B;&#x43B;&#x430; &#x43B;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;&#x439;.</li></ul><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x438;&#x433;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;: &#x432; <code>CreateParamCheckingResponseWritingMethodCall()</code> &#x43C;&#x44B; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x434; &#x441;&#x442;&#x430;&#x442;&#x443;&#x441;&#x430; <code>400</code>, &#x43D;&#x43E; &#x43D;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C; <code>Task.CompletedTask</code>. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E;:</p><pre><code class="language-csharp">if(wasParamCheckFailure)
{
    httpContext.Response.StatusCode = 400;
    return Task.CompletedTask;
}</code></pre><p>&#x43C;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x44D;&#x442;&#x43E;:</p><pre><code class="language-csharp">if(wasParamCheckFailure)
{
    httpContext.Response.StatusCode = 400;
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438; &#x440;&#x430;&#x43D;&#x435;&#x435;, &#x441;&#x430;&#x43C;&#x44B;&#x439; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; endpoint&#x430;) &#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43A;&#x43E;&#x434; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x434;&#x43E;&#x43C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;.</p><p>&#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, <code>AddResponseWritingToMethodCall()</code> &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43A;&#x43E;&#x434; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; <code>ValueTask&lt;object?&gt;</code>, &#x43E;&#x436;&#x438;&#x434;&#x430;&#x44F; &#x435;&#x433;&#x43E; &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44F; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x43A;&#x430;&#x43A; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x43D;&#x435;&#x442; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x441;&#x43F;&#x435;&#x446;&#x438;&#x444;&#x438;&#x447;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x43B;&#x44F; filter-pipeline, &#x43A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x43D;&#x430;&#x43C; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x430; &#x43E;&#x434;&#x43D;&#x430; &#x438; &#x442;&#x430; &#x436;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; filter pipeline &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; <code>ValueTask&lt;object?&gt;</code>.</p><p>&#x418; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x44B; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438;!</p><h3 id="%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-requestdelegate">&#x41E;&#x431;&#x437;&#x43E;&#x440; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; RequestDelegate.</h3><p>&#x412; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x44B; &#x435;&#x449;&#x435; &#x440;&#x430;&#x437; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &quot;&#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x439;&quot; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &quot;&quot;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E;&quot; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API&quot;:</p><pre><code class="language-csharp">Task TargetableRequestDelegate(object? target, HttpContext httpContext)
{
    string name_local;
    bool wasParamCheckFailure;

    name_local = httpContext.Request.RouteValues[&quot;name&quot;]
    if (name_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);
    }

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
        // &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43C;&#x44B; _&#x43D;&#x435;_ &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; Task.CompletedTask
    }

    var filterContext = new EndpointFilterInvocationContext&lt;string&gt;(httpContext, name_local)
    // &#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;
    ValueTask&lt;object?&gt; result = filterPipeline.Invoke(filterContext); 

    // &#x41E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x438; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;
    return ExecuteValueTaskOfObject(result, httpContext);

    // &#x41A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; (&#x43E;&#x434;&#x438;&#x43D; &#x443;&#x440;&#x43E;&#x432;&#x435;&#x43D;&#x44C; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438;)
    ValueTask&lt;object?&gt; filterPipeline(EndpointFilterInvocationContext context)
    {
        var name = ctx.GetArgument&lt;string&gt;(0);
        if (name is not &quot;Sock&quot;)
        {
            return Results.ValidationProblem(
                new Dictionary&lt;string, string[]&gt;
                {
                    { &quot;name&quot;, new[] { &quot;Invalid name&quot; } }
                });
        }

        // &#x412;&#x44B;&#x437;&#x43E;&#x432; &quot;&#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E;&quot; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
        return await filteredInvocation(ctx);
    }

    // &#x421;&#x430;&#x43C;&#x44B;&#x439; &quot;&#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439;&quot; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
    ValueTask&lt;object?&gt; filteredInvocation(EndpointFilterInvocationContext context)
    {
        if(context.HttpContext.Response.StatusCode &gt;= 400)
        {
            // &#x423;&#x436;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x43E;&#x448;&#x43B;&#x430; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;, &#x43D;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x439;&#x442;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
            return ValueTask.CompletedTask;  
        }
        else
        {
            // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x439;&#x442;&#x435; &quot;&#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&quot; &#x446;&#x435;&#x43B;&#x438; (&#x435;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x43A;&#x43E;&#x432;&#x43E;&#x439; &#x438;&#x43C;&#x435;&#x435;&#x442;&#x441;&#x44F;)
            var target = targetFactory(context.HttpContext); 
            // &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x438;&#x437; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;
// &#x438; &#x43E;&#x431;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432; ValueTask
            return ValueTask.FromResult&lt;object?&gt;( 
                target.handler.Invoke(context.GetArgument&lt;string&gt;(0)) // &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
            );
        }
    }
}</code></pre><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x44B; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43C; &#x44D;&#x442;&#x43E;&#x442; &quot;&#x437;&#x430;&#x43A;&#x443;&#x43B;&#x438;&#x441;&#x43D;&#x44B;&#x439;&quot; &#x43E;&#x431;&#x437;&#x43E;&#x440; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API. &#x41E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x43E;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x430; &#x441;&#x435;&#x440;&#x438;&#x44F; &#x431;&#x44B;&#x43B;&#x430; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x439;. &#x421;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x43D;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x438;&#x43B;&#x438; &#x434;&#x430;&#x436;&#x435; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; API, &#x43D;&#x43E; &#x43B;&#x438;&#x447;&#x43D;&#x43E; &#x43C;&#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;.</p><h3 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D1%82%D0%BE%D0%B3%D0%BE%D0%B2">&#x41F;&#x43E;&#x434;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x442;&#x43E;&#x433;&#x43E;&#x432;.</h3><p><br>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438;, &#x43A;&#x430;&#x43A; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x43B;&#x44F; endpoint. &#x41C;&#x44B; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x438; &#x441; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43E;&#x442;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x439; endpoint. &#x415;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x445; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x439; &#x43F;&#x43E; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x435;&#x43D;&#x438;&#x44E; &#x441; &#x43D;&#x435;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; <code>RequestDelegate</code>:</p><ul><li>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43C;&#x44B; &#x43D;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C; &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x437;&#x430;&#x43C;&#x44B;&#x43A;&#x430;&#x43D;&#x438;&#x435;, &#x43A;&#x430;&#x43A; &#x432; &#x43D;&#x435;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x430;&#x44E;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F;, &#x430; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &quot;&#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x43C;&quot; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435;.</li><li>&#x420;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x439; &#x442;&#x43E;&#x447;&#x43A;&#x438; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x443;&#x442; &#x432; <code>ValueTask&lt;object?&gt;</code>.</li><li>&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; <code>EndpointFilterInvocationContext&lt;&gt;</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; endpoint &#x432; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x438; &#x441; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C; &#x438; &#x442;&#x438;&#x43F;&#x43E;&#x43C; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; endpoint.</li><li>&#x415;&#x441;&#x43B;&#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x430; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43D;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x430;&#x438;&#x432;&#x430;&#x435;&#x442; <code>EndpointFilterDelegate</code>, &#x43E;&#x43D;&#x430; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43D;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440;.</li></ul><p>&#x413;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x439; &#x432;&#x44B;&#x432;&#x43E;&#x434; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x432; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x44B; &#x441;&#x430;&#x43C;&#x44B;&#x43C; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x43C;. &#x41E;&#x43D;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x43D;&#x430;&#x43A;&#x43B;&#x430;&#x434;&#x43D;&#x44B;&#x435; &#x440;&#x430;&#x441;&#x445;&#x43E;&#x434;&#x44B; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x445; endpoints, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x43E;&#x43D;&#x438; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F;, &#x438; &#x43E;&#x43D;&#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code> &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;.</p><p>&#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43D;&#x430;&#x441; &#x43A; &#x43A;&#x43E;&#x43D;&#x446;&#x443; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x437;&#x43E;&#x440;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API. &#x41B;&#x438;&#x447;&#x43D;&#x43E; &#x44F; &#x432;&#x43F;&#x435;&#x447;&#x430;&#x442;&#x43B;&#x435;&#x43D; &#x442;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; <code>RequestDelegateFactory</code> &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43D;&#x430;&#x434; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; API &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x43C;&#x438;, &#x43D;&#x430;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44D;&#x442;&#x43E; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;!</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-8-customising-the-request-delegate-with-filters/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Создание окончательного RequestDelegate]]></title><description><![CDATA[<p>&#x42D;&#x442;&#x43E; &#x441;&#x435;&#x434;&#x44C;&#x43C;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438;: <a href="https://zznob.ru/series-behind-the-scenes-of-minimal-apis/">&quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API&quot;</a>.</p><p>&#x412; &#x44D;&#x442;</p>]]></description><link>https://zznob.ru/sozdaniie-okonchatielnogho-requestdelegate/</link><guid isPermaLink="false">643ba05b170f3a00010190b9</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 16 Apr 2023 08:44:32 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1497971476298-52cb42d7b5d5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMzfHxDcmVhdGUlMjBmaW5hbHxlbnwwfHx8fDE2ODE2MzEzMDM&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1497971476298-52cb42d7b5d5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMzfHxDcmVhdGUlMjBmaW5hbHxlbnwwfHx8fDE2ODE2MzEzMDM&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate"><p>&#x42D;&#x442;&#x43E; &#x441;&#x435;&#x434;&#x44C;&#x43C;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438;: <a href="https://zznob.ru/series-behind-the-scenes-of-minimal-apis/">&quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API&quot;</a>.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; minimal API &#x432; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; ASP.NET Core. &#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x44B;, &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; minimal API, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x442;&#x43E;, &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x432; minimal API. &#x414;&#x430;&#x43B;&#x435;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438;, &#x43A;&#x430;&#x43A; <code>RequestDelegateFactory</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x447;&#x430;&#x441;&#x442;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432; <code>RequestDelegate</code>, &#x43A;&#x430;&#x43A; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; (&#x447;&#x430;&#x441;&#x442;&#x438; 1 &#x438; 2), &#x442;&#x430;&#x43A; &#x438; &#x434;&#x43B;&#x44F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x431;&#x435;&#x440;&#x435;&#x43C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x44B; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; <code>RequestDelegate</code>. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445; &#x44F; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B; &#x438; &#x443;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x43B; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x435; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x43D;&#x43E; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x441;&#x442;&#x430;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43C;&#x430;&#x43A;&#x441;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x438;&#x431;&#x43B;&#x438;&#x437;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438;. &#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.Create()</code>, &#x443;&#x432;&#x438;&#x434;&#x438;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43E;&#x43A; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x445;&#x43E;&#x434;&#x44F;&#x442; &#x432; <code>RequestDelegate</code>, &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F;. &#x42F; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43D;&#x435; &#x437;&#x430;&#x442;&#x440;&#x430;&#x433;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x43B; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44D;&#x442;&#x443; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x448;&#x43B;&#x44B;&#x445; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439;.</p><blockquote>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x449;&#x443; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x438; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;. &#x41C;&#x44B; &#x432;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x43D;&#x438;&#x43C; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44E; &#x43F;&#x43E; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x435;&#x43D;&#x438;&#x44E; &#x441; &quot;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C;&quot; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;.</blockquote><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-requestdelegate-requestdelegatefactorycreate">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; RequestDelegate: RequestDelegateFactory.Create()</h3><p>&#x414;&#x43B;&#x44F; &#x446;&#x435;&#x43B;&#x435;&#x439; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43E;&#x434;&#x438;&#x43D; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;:</p><pre><code class="language-csharp">app.MapGet(&quot;/{name}&quot;, (string name) =&gt; $&quot;Hello {name}!&quot;);</code></pre><p>&#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x443;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443; <code>RequestDelegateFactory.Create()</code>. &#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x440;&#x443;&#x437;&#x43E;&#x43A;, &#x43D;&#x43E; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43E;&#x43D;&#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442;:</p><ul><li><code>Delegate handler</code> - &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API <code>(string name) =&gt; $&quot;Hello {name}&quot;</code></li><li><code>RequestDelegateFactoryOptions? options</code> - &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x440;&#x430;&#x43D;&#x435;&#x435;.</li><li><code>RequestDelegateMetadataResult? metadataResult</code> - &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>RequestDelegateFactory.InferMetadata()</code>, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44F; &#x432;&#x44B;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; <code>RequestDelegateFactoryContext</code>.</li></ul><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x435; &#x434;&#x432;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; &#x438; &#x441;&#x43B;&#x443;&#x436;&#x430;&#x442; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;; &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x438; &#x43D;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x44B;, &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>Create()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x441;&#x442; &#x438;&#x445; &#x441;&#x430;&#x43C;. &#x414;&#x43B;&#x44F; &#x446;&#x435;&#x43B;&#x435;&#x439; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x44F; &#x431;&#x443;&#x434;&#x443; &#x441;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x44B;, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x43F;&#x440;&#x43E;&#x449;&#x430;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x432; <code>Create()</code>.</p><blockquote>&#x41D;&#x430; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x435;, &#x432; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API, &#x44D;&#x442;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432; <code>RequestDelegateFactory.InferMetadata()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x434; <code>Create()</code>.</blockquote><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x431;&#x443;&#x434;&#x443; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x43C;&#x43E;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x43E; &#x43C;&#x435;&#x440;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; Create(), &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x432;&#x441;&#x435; &#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F;.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-targetexpression">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; targetExpression.</h3><p>&#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>RequestDelegateFactory.Create()</code>, &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x44F; &#x43F;&#x43E; &#x43E;&#x434;&#x43D;&#x43E;&#x43C;&#x443; &#x443;&#x442;&#x432;&#x435;&#x440;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430; &#x440;&#x430;&#x437;.</p><pre><code class="language-csharp">public static RequestDelegateResult Create(
    Delegate handler, 
    RequestDelegateFactoryOptions? options = null,
    RequestDelegateMetadataResult? metadataResult = null)
{
    if (handler is null)
    {
        throw new ArgumentNullException(nameof(handler));
    }

    UnaryExpression targetExpression = handler.Target switch
    {
        object =&gt; Expression.Convert(TargetExpr, handler.Target.GetType()),
        null =&gt; null,
    };

    // ...
}</code></pre><p>&#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43D;&#x430; <code>null</code>, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; Expression &#x43F;&#x43E;&#x434; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; <code>targetExpression</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43E;&#x434;&#x43D;&#x43E; &#x438;&#x437; &#x434;&#x432;&#x443;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;:</p><ul><li>&#x415;&#x441;&#x43B;&#x438; <code>handler.Target</code> &#x438;&#x43C;&#x435;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>null</code>, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; <code>null</code></li><li>&#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x442; &quot;&#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&quot; &#x43A; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x43E;&#x43C;&#x443; &#x442;&#x438;&#x43F;&#x443;.</li></ul><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, <code>handler.Target</code> &#x431;&#x443;&#x434;&#x435;&#x442; &#x440;&#x430;&#x432;&#x435;&#x43D; <code>null</code>, &#x432; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43E;&#x43D; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x442;&#x438;&#x43F;&#x430;, &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x431;&#x44B;&#x43B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43D; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;. &#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B;, &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; (&#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x44C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430; Program), &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x43B;&#x438; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x443;. &#x42D;&#x442;&#x43E;&#x442; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x438;&#x43C;&#x435;&#x435;&#x442; &quot;&#x43D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435;&quot; &#x438;&#x43C;&#x44F; &#x432; C#, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; <code>&lt;&gt;</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x434;&#x430;&#x43B;&#x44C;&#x43D;&#x435;&#x439;&#x448;&#x435;&#x43C; &#x43C;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E;.</p><blockquote>&#x412;&#x430;&#x43C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x443;&#x434;&#x438;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &quot;&#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x43E;&#x43C;&quot;, &#x430; &#x43D;&#x435; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x43C; &#x442;&#x438;&#x43F;&#x43E;&#x43C;. &#x41F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x430; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x445;&#x432;&#x430;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B; (&#x434;&#x430;&#x436;&#x435; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x443; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x432;&#x430; <code>static</code>). &#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x432; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x438;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x43E;&#x43F;&#x446;&#x438;&#x44E; sharplab.io &quot;C#&quot;, <a href="https://sharplab.io/?ref=zznob.ru#v2:EYLgtghglgdgPgAQEwEYCwAoBBmABM3AYVwG9NcL88EAWXAWQAoBKU8yjgUQA8BTAYwCuAF14ARXgBteAcwijGjBCgAMuGBDC9WAXgB8uACQAiABZTJAe1IatAXwCEx5gG52FO+9xec+OjwERcSlZeV5GCWk5UVxTCBgAE2kAJ2YvMgwOTww7IA=">&#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43E;&#x43A;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x44F; <code>Func&lt;&gt;</code></a>.</blockquote><p>&#x41D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x432;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x435; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;: <code>handler</code> &#x438; <code>targetExpression</code>:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/04/image.png" class="kg-image" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate" loading="lazy" width="1188" height="177" srcset="https://zznob.ru/content/images/size/w600/2023/04/image.png 600w, https://zznob.ru/content/images/size/w1000/2023/04/image.png 1000w, https://zznob.ru/content/images/2023/04/image.png 1188w" sizes="(min-width: 720px) 720px"></figure><p>&#x41F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x43A; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x43C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430;&#x43C; <code>Create()</code>.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-requestdelegatefactorycontext-%D0%B8-targetfactory">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; RequestDelegateFactoryContext &#x438; targetFactory</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;:</p><pre><code class="language-csharp">// ...
RequestDelegateFactoryContext factoryContext = 
    CreateFactoryContext(options, metadataResult, handler);

Expression&lt;Func&lt;HttpContext, object?&gt;&gt; targetFactory = (httpContext) =&gt; handler.Target;
// ...</code></pre><p>&#x41F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x442;&#x438;&#x43F; RequestDelegateFactoryContext. &#x42D;&#x442;&#x43E;&#x442; &#x442;&#x438;&#x43F; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; RequestDelegate &#x438; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43F;&#x430;&#x43A;&#x435;&#x442; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;. &#x412;&#x44B; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactoryContext.cs?ref=zznob.ru">&#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430; &#x437;&#x434;&#x435;&#x441;&#x44C;</a>, &#x43D;&#x43E; &#x43E;&#x43D; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430;, &#x43A;&#x430;&#x43A;:</p><ul><li><code>AllowEmptyRequestBody</code>&#x2014;&#x434;&#x43E;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43F;&#x443;&#x441;&#x442;&#x44B;&#x435; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;, &#x438;&#x43B;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43E;&#x442;&#x431;&#x440;&#x430;&#x441;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F;.</li><li><code>UsingTempSourceString</code>&#x2014;&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43B;&#x438; &#x43A;&#x43E;&#x434; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x430; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; <code>tempSourceString</code>.</li><li><code>ExtraLocals</code>&#x2014;&#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x435; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B; &#x43F;&#x440;&#x438; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</li><li><code>ParamCheckExpressions</code>&#x2014;&#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x435; &quot;&#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;&quot;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F;.</li></ul><p>&#x423; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x435;&#x449;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;, &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x437; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x438;&#x437; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; <code>options</code>. &#x41C;&#x44B; &#x443;&#x436;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateFactoryContext()</code> &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43F;&#x43E;&#x43A;&#x430; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C; &#x435;&#x433;&#x43E; &#x432; &#x43F;&#x43E;&#x43A;&#x43E;&#x435;, &#x43D;&#x43E; &#x43C;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x435; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430; <code>RequestDelegateFactoryContext</code> &#x432; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x448;&#x430;&#x433;&#x430;&#x445;.</p><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x430;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; <code>Create()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44E;&#x449;&#x435;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;-&#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x446;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x443;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x44F; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x430;&#x44E;&#x449;&#x443;&#x44E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; <code>HttpContext</code>: <code>httpContext =&gt; handler.Target</code>. &#x42D;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x43A;&#x430;&#x43A; <code>_ =&gt; handler.Target</code>, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F;; &#x43D;&#x430;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44F; &#x43C;&#x43E;&#x433;&#x443; &#x441;&#x443;&#x434;&#x438;&#x442;&#x44C;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>HttpContext</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x43B;&#x435;&#x433;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x437;&#x438;&#x446;&#x438;&#x438; &#x43F;&#x43E;&#x437;&#x436;&#x435; (&#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;). &#x42F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44E; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43D;&#x430;&#x448;&#x443; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x443; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x43D;&#x438;&#x44F;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/04/image-1.png" class="kg-image" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate" loading="lazy" width="1187" height="303" srcset="https://zznob.ru/content/images/size/w600/2023/04/image-1.png 600w, https://zznob.ru/content/images/size/w1000/2023/04/image-1.png 1000w, https://zznob.ru/content/images/2023/04/image-1.png 1187w" sizes="(min-width: 720px) 720px"></figure><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x43A; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>CreateTargetableRequestDelegate()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x43B;&#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;.</p><h3 id="%D0%B2%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC-createtargetablerequestdelegate-%D0%B8-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2">&#x412;&#x432;&#x43E;&#x434;&#x438;&#x43C; CreateTargetableRequestDelegate &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x439; <code>RequestDelegateFactory.Create()</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F;:</p><pre><code class="language-csharp">// ...
Func&lt;object?, HttpContext, Task&gt;? targetableRequestDelegate = 
    CreateTargetableRequestDelegate(
        handler.Method, targetExpression, factoryContext, targetFactory);
// ...</code></pre><p>&#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; <code>CreateTargetableRequestDelegate</code> &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x433;&#x434;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x438; &#x433;&#x434;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;. &#x41A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>factoryContext</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x438;&#x43C; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x438;&#x445; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445;.</p><p>&#x41A;&#x430;&#x43A; &#x432;&#x438;&#x434;&#x43D;&#x43E; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x43C; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x435;&#x441;&#x44C; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;:</p><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt;? CreateTargetableRequestDelegate(
    MethodInfo methodInfo,
    Expression? targetExpression,
    RequestDelegateFactoryContext factoryContext,
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory = null)
{
    factoryContext.ArgumentExpressions ??= 
        CreateArgumentsAndInferMetadata(methodInfo, factoryContext);

    // ...
}</code></pre><p>&#x41F;&#x435;&#x440;&#x432;&#x430;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; - <code>CreateArgumentsAndInferMetadata()</code>. &#x41C;&#x44B; &#x443;&#x436;&#x435; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code>, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x43D; &#x43E;&#x43F;&#x438;&#x440;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E;!</p><p>&#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;</p><pre><code class="language-csharp">(string name) =&gt; $&quot;Hello {name}!&quot;`</code></pre><p><code>CreateArgumentsAndInferMetadata()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x442;&#x440;&#x438; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;:</p><ul><li><code>Expression</code> &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; - &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x438;&#x437; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439;: <code>name_local</code>. &#x41E;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ArgumentExpressions</code>.</li><li><code>Expression</code> &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445;, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;, &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x44D;&#x442;&#x43E; &#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433;&#x438;&#x447;&#x43D;&#x43E; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>name_local</code>. &#x41E;&#x43D;&#x430; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ExtraLocals</code>.</li><li>&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; - &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ParamCheckExpressions</code>. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x43E;&#x43D;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x43E;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C;&#x443;:</li></ul><pre><code class="language-csharp">name_local = httpContext.Request.RouteValues[&quot;name&quot;]
if (name_local == null)
{
     wasParamCheckFailure = true;
     Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);
}</code></pre><blockquote>&#x412;&#x44B;&#x437;&#x43E;&#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>Log</code> &#x441;&#x441;&#x44B;&#x43B;&#x430;&#x435;&#x442;&#x441;&#x44F; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L2281">&#x43D;&#x430; &quot;&#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439;&quot; &#x43C;&#x435;&#x442;&#x43E;&#x434;</a> &#x432; <code>RequestDelegateFactory</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>Expression.Call()</code>.</blockquote><p><code>CreateArgumentsAndInferMetadata()</code> &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;. &#x414;&#x43B;&#x44F; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x432;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x430; <code>factoryContext</code>, &#x43A;&#x430;&#x43A; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x43E; &#x432; &#x43C;&#x43E;&#x438;&#x445; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;:</p><ul><li><code>factoryContext.UsingTempSourceString</code>&#x2014;&#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>true</code> &#x43F;&#x440;&#x438; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x435; &#x442;&#x438;&#x43F;&#x430; <code>TryParse()</code>, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x438; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>int</code>.</li><li><code>factoryContext.ParameterBinders</code>&#x2014;&#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; <code>BindAsync()</code>.</li><li><code>factoryContext.JsonRequestBodyParameter</code>&#x2014;&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; <code>ParameterInfo</code> (&#x435;&#x441;&#x43B;&#x438; &#x435;&#x441;&#x442;&#x44C;), &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x435; JSON.</li><li><code>factoryContext.FirstFormRequestBodyParameter</code>&#x2014;&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; <code>ParameterInfo</code> (&#x435;&#x441;&#x43B;&#x438; &#x435;&#x441;&#x442;&#x44C;) &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432; &#x432;&#x438;&#x434;&#x435; &#x444;&#x43E;&#x440;&#x43C;&#x44B;. &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x44F;&#x442; &#x43A; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x435;.</li></ul><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43B;&#x43E;&#x436;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435;, &#x442;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>CreateArgumentsAndInferMetadata()</code> &#x43C;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/04/image-2.png" class="kg-image" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate" loading="lazy" width="1188" height="671" srcset="https://zznob.ru/content/images/size/w600/2023/04/image-2.png 600w, https://zznob.ru/content/images/size/w1000/2023/04/image-2.png 1000w, https://zznob.ru/content/images/2023/04/image-2.png 1188w" sizes="(min-width: 720px) 720px"></figure><p>&#x41F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x438;&#x43C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x43D;&#x430;&#x434; <code>CreateTargetableRequestDelegate()</code>.</p><h3 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0-expression">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; Expression</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x448;&#x430;&#x433;&#x43E;&#x43C; &#x432; <code>CreateTargetableRequestDelegate</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>CreateMethodCall()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API:</p><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt;? CreateTargetableRequestDelegate(
    MethodInfo methodInfo,
    Expression? targetExpression,
    RequestDelegateFactoryContext factoryContext,
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory = null)
{
    // ...

    factoryContext.MethodCall = 
        CreateMethodCall(methodInfo, targetExpression, factoryContext.ArgumentExpressions);
    
    // ...
}</code></pre><p><code>CreateMethodCall()</code> &#x2014; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; <code>targetExpression</code> &#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x438; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x442; &#x438;&#x445; &#x432; &#x43E;&#x434;&#x43D;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;:</p><pre><code class="language-csharp">private static Expression CreateMethodCall(
    MethodInfo methodInfo, Expression? target, Expression[] arguments) =&gt;
    target is null ?
        Expression.Call(methodInfo, arguments) :
        Expression.Call(target, methodInfo, arguments);</code></pre><p>&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; <code>Expression</code> &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.MethodCall</code>. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x440;&#x43E;&#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;&#x435; &#x44D;&#x442;&#x43E;, &#x442;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43A;&#x43E;&#x434; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x430; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; <code>name_local</code>:</p><pre><code class="language-csharp">((Program.&lt;&gt;c) target).Handler.Invoke(name_local)</code></pre><blockquote>&#x41F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x430; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</blockquote><p>&#x412; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x44B;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x434;&#x443;&#x43C;&#x430;&#x435;&#x442;&#x435; &#x43E;&#x431; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x43A;&#x430;&#x43A; &#x43E; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x435; <code>Func&lt;string, string&gt;</code>, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x43D;&#x430; Program:</p><pre><code class="language-csharp">public class Program
{
    Func&lt;string, string&gt; handler = (string name) =&gt; $&quot;Hello {name}!&quot;;
}</code></pre><p>&#x422;&#x43E;&#x433;&#x434;&#x430; <code>factoryContext.MethodCall</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43A;&#x430;&#x43A;:</p><pre><code class="language-csharp">target.handler(name_local)</code></pre><p>&#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x44F; &#x431;&#x443;&#x434;&#x443; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x443; &#x43D;&#x43E;&#x442;&#x430;&#x446;&#x438;&#x44E; &#x434;&#x43E; &#x43A;&#x43E;&#x43D;&#x446;&#x430; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438;. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x44D;&#x442;&#x43E; &#x432; &#x43D;&#x430;&#x448;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;. &#x41C;&#x44B; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code>ArgumentExpressions</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x443;&#x434;&#x430;&#x43B;&#x438;&#x43B; &#x438;&#x445; &#x438;&#x437; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/04/image-3.png" class="kg-image" alt="&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate" loading="lazy" width="1187" height="669" srcset="https://zznob.ru/content/images/size/w600/2023/04/image-3.png 600w, https://zznob.ru/content/images/size/w1000/2023/04/image-3.png 1000w, https://zznob.ru/content/images/2023/04/image-3.png 1187w" sizes="(min-width: 720px) 720px"></figure><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; <code>CreateTargetableRequestDelegate</code> &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43F;&#x43E;&#x43A;&#x430; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C; &#x435;&#x451; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x451;&#x43C; &#x43A; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x443; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>CreateParamCheckingResponseWritingMethodCall</code> .</p><h3 id="%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B0%D1%82%D0%B0-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%B2-createparamcheckingresponsewritingmethodcall">&#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432; CreateParamCheckingResponseWritingMethodCall</h3><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; <code>CreateTargetableRequestDelegate()</code> &#x432;&#x441;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x441;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;:</p><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt;? CreateTargetableRequestDelegate(
    MethodInfo methodInfo,
    Expression? targetExpression,
    RequestDelegateFactoryContext factoryContext,
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory = null)
{
    // ...

    Type returnType = methodInfo.ReturnType;
    
    // ...Filter magic
    
    Expression responseWritingMethodCall = factoryContext.ParamCheckExpressions.Count &gt; 0 
        ? CreateParamCheckingResponseWritingMethodCall(returnType, factoryContext) 
        : AddResponseWritingToMethodCall(factoryContext.MethodCall, returnType);
    
    // ...
}</code></pre><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; &#x43C;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x434;&#x432;&#x443;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;, &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x435;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43B;&#x438;&#x431;&#x43E; ParamCheckExpressions:</p><ul><li><code>CreateParamCheckingResponseWritingMethodCall</code>&#x2014;&#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43B;&#x44E;&#x431;&#x44B;&#x445; <code>ParamCheckExpression</code> &#x432; <code>RequestDelegate</code>, &#x437;&#x430;&#x442;&#x435;&#x43C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>AddResponseWritingToMethodCall</code></li><li><code>AddResponseWritingToMethodCall</code>&#x2014;&#x417;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x435;&#x439; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C;&#x44E; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;.</li></ul><p>&#x42F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x43E;&#x431;&#x430; &#x44D;&#x442;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x43D;&#x435;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x439; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x438; &#x43E; &#x442;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A; &#x441;&#x442;&#x440;&#x43E;&#x44F;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;. &#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; <code>ParamCheckExpression</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; <code>CreateParamCheckingResponseWritingMethodCall</code> &#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>responseWritingMethodCall</code>. &#x414;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csahrp">string name_local; // factoryContext.ExtraLocals
bool wasParamCheckFailure;

name_local = httpContext.Request.RouteValues[&quot;name&quot;]  //
if (name_local == null)                               //
{                                                     //
     wasParamCheckFailure = true;                     // factoryContext.ParamCheckExpressions
     Log.RequiredParameterNotProvided(                //
        httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);      //
}                                                     //

if(wasParamCheckFailure)
{
    httpContext.Response.StatusCode = 400;
    return Task.CompletedTask;
}

ExecuteWriteStringResponseAsync(
    httpContext,
    target.handler(name_local)); // factoryContext.MethodCall</code></pre><p>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x448;&#x435; <code>Expression</code> &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x43A;&#x430;&#x43A; &#x438;&#x437; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; <code>Expression</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43B;&#x438; &#x440;&#x430;&#x43D;&#x435;&#x435;, &#x442;&#x430;&#x43A; &#x438; &#x438;&#x437; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; <code>CreateParamCheckingResponseWritingMethodCall</code>.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x432; <code>Expression</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>ExecuteWriteStringResponseAsync</code> &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x441; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C; <code>httpContext</code> (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;). <code>ExecuteWriteStringResponseAsync</code> &#x2014; &#x44D;&#x442;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x430;&#x44F; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x432; <code>RequestDelegateFactory</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x43D;&#x438;&#x436;&#x435;:</p><pre><code class="language-csharp">private static Task ExecuteWriteStringResponseAsync(
    HttpContext httpContext, string text)
{
    SetPlaintextContentType(httpContext);
    return httpContext.Response.WriteAsync(text);
}

private static void SetPlaintextContentType(HttpContext httpContext)
    =&gt; httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443; &#x43D;&#x430;&#x441; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F;. &#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x448;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; <code>responseWritingMethodCall</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43D;&#x435; &#x431;&#x435;&#x441;&#x43F;&#x43E;&#x43A;&#x43E;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x431; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435;; &#x44D;&#x442;&#x43E; &#x435;&#x434;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;. &#x41A;&#x43E;&#x43D;&#x435;&#x446; &#x431;&#x43B;&#x438;&#x437;&#x43E;&#x43A;!</p><h3 id="%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-funcobject-httpcotnext-task">&#x41A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x432; Func&lt;object?, HttpCotnext, Task&gt;</h3><p>&#x417;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x432; <code>CreateTargetableRequestDelegate</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x44F;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt;? CreateTargetableRequestDelegate(
    MethodInfo methodInfo,
    Expression? targetExpression,
    RequestDelegateFactoryContext factoryContext,
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory = null)
{
    // ...

    if (factoryContext.UsingTempSourceString)
    {
        responseWritingMethodCall = Expression.Block(
            new[] { TempSourceStringExpr }, responseWritingMethodCall);
    }

    return HandleRequestBodyAndCompileRequestDelegate(
        responseWritingMethodCall, factoryContext);
}</code></pre><p>&#x412; <code>if</code> &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; <code>tempSourceString</code> &#x432; &#x432;&#x435;&#x440;&#x445;&#x43D;&#x44E;&#x44E; &#x447;&#x430;&#x441;&#x442;&#x44C; <code>RequestDelegate</code>, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x434;&#x43B;&#x44F; &#x446;&#x435;&#x43B;&#x435;&#x439; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x430;. &#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43E;&#x43D;&#x430; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x430;, &#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x443; &#x43D;&#x430;&#x441; &#x431;&#x44B;&#x43B;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; int, &#x435;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C;.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; - <code>HandleRequestBodyAndCompileRequestDelegate()</code>. &#x41D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43D;&#x430;&#x43C;&#x435;&#x43A;&#x430;&#x435;&#x442; &#x43D;&#x430; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;; &#x43E;&#x43D; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x442;&#x440;&#x438; &#x432;&#x435;&#x449;&#x438;:</p><ul><li>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x433;&#x43E; <code>Expression</code> &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;/&#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F;.</li><li>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x433;&#x43E; <code>Expression</code> &#x434;&#x43B;&#x44F; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; <code>BindAsync</code>.</li><li>&#x41A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x44F; <code>Expression</code> &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;.</li></ul><p>&#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; API &#x43D;&#x435; &#x447;&#x438;&#x442;&#x430;&#x435;&#x442; &#x438;&#x437; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; (&#x44D;&#x442;&#x43E; GET-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;), &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x44E;&#x441;&#x44C; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438;.</p><p>&#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; API &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; <code>BindAsync</code>, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B; &#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x43A;&#x43E;&#x434;&#x430; &#x432; <code>HandleRequestBodyAndCompileRequestDelegate</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x43D;&#x438;&#x436;&#x435;:</p><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt; HandleRequestBodyAndCompileRequestDelegate(
    Expression responseWritingMethodCall, 
    RequestDelegateFactoryContext factoryContext)
{
    // Do we need to bind to the body/form?
    if (factoryContext.JsonRequestBodyParameter is null &amp;&amp; !factoryContext.ReadForm)
    {
        // No - Do we have any BindAsync() parameters?
        if (factoryContext.ParameterBinders.Count &gt; 0)
        {
            // Yes, so we need to generate the code for reading from the custom binders calling into the delegate
            var continuation = Expression.Lambda&lt;Func&lt;object?, HttpContext, object?[], Task&gt;&gt;(
                responseWritingMethodCall, TargetExpr, HttpContextExpr, BoundValuesArrayExpr).Compile();

            var binders = factoryContext.ParameterBinders.ToArray();
            var count = binders.Length;

            return async (target, httpContext) =&gt;
            {
                var boundValues = new object?[count];

                for (var i = 0; i &lt; count; i++)
                {
                    boundValues[i] = await binders[i](httpContext);
                }

                await continuation(target, httpContext, boundValues);
            };
        }

        // No - we don&apos;t have any BindAsync methods
        return Expression.Lambda&lt;Func&lt;object?, HttpContext, Task&gt;&gt;(
            responseWritingMethodCall, TargetExpr, HttpContextExpr).Compile();
    }

    // Bind to the form/body
    return factoryContext.ReadForm
        ? HandleRequestBodyAndCompileRequestDelegateForForm(responseWritingMethodCall, factoryContext)
        : HandleRequestBodyAndCompileRequestDelegateForJson(responseWritingMethodCall, factoryContext);
}</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x440;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x435; &#x437;&#x430; &#x432;&#x435;&#x442;&#x432;&#x44F;&#x43C;&#x438;, &#x442;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x43D;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43A; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x43C;&#x443; <code>Expression</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442; &#x438;&#x43C;&#x435;&#x44E;&#x449;&#x435;&#x435;&#x441;&#x44F; &#x443; &#x43D;&#x430;&#x441; <code>Expression</code> &#x432; <code>Func&lt;object?, HttpContext, Task&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">Task TargetableRequestDelegate(object? target, HttpContext httpContext)
{
    string name_local;
    bool wasParamCheckFailure;

    name_local = httpContext.Request.RouteValues[&quot;name&quot;]
    if (name_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;name&quot;, &quot;route&quot;);
    }

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    return ExecuteWriteStringResponseAsync(
        httpContext,
        handler(name_local));
}</code></pre><p>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x44D;&#x442;&#x43E; <code>Func&lt;&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x43D;, &#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x43D;&#x435; <code>RequestDelegate</code>, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x432; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>target</code>. &#x427;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>, &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x439;&#x442;&#x438; &#x43F;&#x43E; &#x441;&#x442;&#x435;&#x43A;&#x443; &#x434;&#x43E; &#x441;&#x430;&#x43C;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>Create()</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>CreateTargetableRequestDelegate()</code>.</p><h3 id="%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D0%BA%D0%BE%D0%BD%D1%87%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-requestdelegate">&#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; RequestDelegate</h3><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x43F;&#x43E;&#x447;&#x442;&#x438; &#x43D;&#x430; &#x444;&#x438;&#x43D;&#x438;&#x448;&#x43D;&#x43E;&#x439; &#x43F;&#x440;&#x44F;&#x43C;&#x43E;&#x439;. &#x41E;&#x441;&#x442;&#x430;&#x432;&#x448;&#x438;&#x435;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x438; <code>Create()</code> &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x437;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x430;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x430; &#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x438;&#x444;&#x435;&#x440;&#x438;&#x439;&#x43D;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43C;&#x44B; &#x43D;&#x435; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x441;&#x44F;. &#x412;&#x430;&#x436;&#x43D;&#x44B;&#x43C; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; <code>Func&lt;&gt;</code>, &#x445;&#x440;&#x430;&#x43D;&#x44F;&#x449;&#x435;&#x433;&#x43E;&#x441;&#x44F; &#x432; <code>targetableRequestDelegate</code>, &#x432; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x438;&#x439; <code>RequestDelegate</code>:</p><pre><code class="language-csharp">public static RequestDelegateResult Create(
    Delegate handler, 
    RequestDelegateFactoryOptions? options = null,
    RequestDelegateMetadataResult? metadataResult = null)
{
    RequestDelegate finalRequestDelegate = targetableRequestDelegate switch
    {
        // &#x435;&#x441;&#x43B;&#x438; targetableRequestDelegate &#x440;&#x430;&#x432;&#x435;&#x43D; null, &#x442;&#x43E; &#x43C;&#x44B; &#x43F;&#x43E;&#x43F;&#x430;&#x43B;&#x438; &#x432; &#x43A;&#x440;&#x430;&#x439;&#x43D;&#x438;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x44B; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x43D;&#x435; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x441;&#x44F;!
        null =&gt; (RequestDelegate)handler,

        // &#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; RequestDelegate
        _ =&gt; httpContext =&gt; targetableRequestDelegate(handler.Target, httpContext),
    };

    // &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; finalRequestDelegate &#x432; RequestDelegateResult
    return CreateRequestDelegateResult(finalRequestDelegate, factoryContext.EndpointBuilder);
}</code></pre><p>&#x418;&#x442;&#x430;&#x43A;, &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; <code>finalRequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x43E;&#x43C; <code>RequestDelegate (Func&lt;HttpContext, Task&gt;)</code>, &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">(HttpContext httpContext) =&gt; TargetableRequestDelegate(Program.&lt;&gt;c, httpContext)</code></pre><p>&#x413;&#x434;&#x435;</p><ul><li><code>Program.&lt;&gt;c</code> &#x44D;&#x442;&#x43E; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B;</li><li><code>TargetableRequestDelegate</code> &#x441;&#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; <code>Expression</code> &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x44B; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x43B;&#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x438; ( <code>Func&lt;HttpContext, object?, Task&gt;</code>).</li></ul><p>&#x42D;&#x442;&#x43E; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x430;&#x448; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p><p>&#x42D;&#x442;&#x43E; (&#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;-&#x442;&#x43E;) &#x43F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43D;&#x430;&#x441; &#x43A; &#x43A;&#x43E;&#x43D;&#x446;&#x443; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x43E; &#x442;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>RequestDelegate</code>. &#x42D;&#x442;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x438; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;, &#x43D;&#x43E; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; <code>Func&lt;HttpContext, Task&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442; &#x43D;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;, &#x447;&#x442;&#x43E; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x44D;&#x43B;&#x435;&#x433;&#x430;&#x43D;&#x442;&#x43D;&#x43E;!</p><p>&#x41A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x43C;&#x44B; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438;. &#x42F; &#x432;&#x441;&#x435; &#x43E;&#x431;&#x435;&#x449;&#x430;&#x44E;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x44D;&#x442;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C;. &#x41D;&#x430;&#x434;&#x435;&#x44E;&#x441;&#x44C;, &#x441;&#x43E; &#x432;&#x441;&#x435;&#x439; &#x44D;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x441;&#x442;&#x43E;&#x440;&#x438;&#x435;&#x439; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C; &#x438;&#x445; &#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438; &#x432;&#x43B;&#x438;&#x44F;&#x43D;&#x438;&#x435; &#x43D;&#x430; <code>RequestDelegate</code> &#x431;&#x443;&#x434;&#x435;&#x442; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x449;&#x435;!</p><h3 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D1%82%D0%BE%D0%B3%D0%BE%D0%B2">&#x41F;&#x43E;&#x434;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x442;&#x43E;&#x433;&#x43E;&#x432;</h3><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.Create()</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x432;&#x441;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x43B;&#x438; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438;, &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>.</p><p>&#x41C;&#x44B; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x438; &#x441; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x44F; <code>targetExpression</code> &#x438; <code>targetFactory</code> &#x438; &#x432;&#x44B;&#x44F;&#x441;&#x43D;&#x438;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x434;&#x430;&#x436;&#x435; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x438;&#x43C;&#x435;&#x44E;&#x442; &quot;&#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439;&quot; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;. &#x417;&#x430;&#x442;&#x435;&#x43C; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x448;&#x43B;&#x438; &#x43A; <code>CreateArgumentsAndInferMetadata()</code> &#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x43D;&#x438;&#x43A;&#x443; <code>CreateArgument()</code>, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x43C; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x443;&#x44E; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; <code>Expression</code>. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x44B; &#x432;&#x441;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x43E;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43A; <code>HttpContext</code>.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x42D;&#x442;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x44B;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; <code>Expressions</code>.</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435;, <code>CreateParamCheckingResponseWritingMethodCall</code>, &#x43C;&#x44B; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x432;&#x441;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435;: &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443;, &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;. &#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x432;&#x441;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F;, &#x43D;&#x43E; &#x43C;&#x44B; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x43C; &#x441; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;&#x43C;.</p><p>&#x412; <code>HandleRequestBodyAndCompileRequestDelegate</code> &#x43C;&#x44B; &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;-&#x442;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; <code>Compile()</code> &#x438; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; <code>Func&lt;object, HttpContext, Task&gt;</code>. &#x42D;&#x442;&#x43E; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x43E;&#x432;&#x441;&#x435;&#x43C; <code>RequestDelegate</code>, &#x43D;&#x43E; <code>RequestDelegateFactory.Create()</code> &quot;&#x43E;&#x431;&#x435;&#x440;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&quot; &#x435;&#x433;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x43E;&#x439; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x44B;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;, &#x447;&#x442;&#x43E; &#x434;&#x430;&#x435;&#x442; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x443;&#x44E;, &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x443;&#x44E;, <code>Func&lt;HttpContext, Task&gt;</code> &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x443; <code>RequestDelegate</code>.</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-7-building-the-final-requestdelegate/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Генерация ответов, создание выражений для RequestDelegate]]></title><description><![CDATA[<p>&#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x434;&#x432;&#x443;&#x445; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445; &#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.</code></p>]]></description><link>https://zznob.ru/gienieratsiia-otvietov-sozdanie-expression-dlya-requestdelegate/</link><guid isPermaLink="false">6428f802170f3a0001018e0e</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 02 Apr 2023 05:30:14 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1499571466915-ffc02b27d65e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDh8fGdlbmVyYXRlJTIwcmVzcG9uc2V8ZW58MHx8fHwxNjgwNDEzMzQy&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1499571466915-ffc02b27d65e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDh8fGdlbmVyYXRlJTIwcmVzcG9uc2V8ZW58MHx8fHwxNjgwNDEzMzQy&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x43E;&#x432;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; RequestDelegate"><p>&#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x434;&#x432;&#x443;&#x445; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445; &#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.CreateArgument()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x43E;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;. &#x422;&#x43E;&#x447;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x435; &#x434;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E;, &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435;, &#x438; &#x447;&#x430;&#x441;&#x442;&#x438; <code>HttpRequest</code>, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x432;&#x44B; &#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435;.</p><p>&#x422;&#x43E;&#x447;&#x43D;&#x43E; &#x442;&#x430;&#x43A; &#x436;&#x435;, &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; HTTP-&#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; <code>RequestDelegateFactory.Create()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>, &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x438;&#x432;&#x448;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x44B; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</p><h2 id="%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-createtargetablerequestdelegate">&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; CreateTargetableRequestDelegate.</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x435;&#x441;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.Create()</code>. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x438;&#x43C; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;: <code>CreateTargetableRequestDelegate()</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>CreateArguments()</code>, &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x441; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x441;&#x44F; &#x43D;&#x430; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x430;&#x441;&#x43F;&#x435;&#x43A;&#x442;&#x430;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;. &#x41D;&#x438;&#x436;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x44B; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x435; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x44B;:</p><ul><li>&#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x442;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43D;&#x43E;.</li><li>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x439;&#x442;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; <code>MethodCall</code> &#x2014; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</li><li>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>CreateParamCheckingResponseWritingMethodCall</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; <code>400 Bad Request</code>.</li><li>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>AddResponseWritingToMethodCall</code>.</li><li>&#x415;&#x441;&#x43B;&#x438; &#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; tempSourceString, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x435;&#x435; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;.</li><li>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x438;, &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; <code>Func&lt;&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>.</li></ul><pre><code class="language-csharp">private static Func&lt;object?, HttpContext, Task&gt;? CreateTargetableRequestDelegate(
    MethodInfo methodInfo, // &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x445;&#x44D;&#x43D;&#x434;&#x43B;&#x435;&#x440;&#x430;
    Expression? targetExpression,
    RequestDelegateFactoryContext factoryContext,
    Expression&lt;Func&lt;HttpContext, object?&gt;&gt;? targetFactory = null)
{
    // &#x421;&#x442;&#x440;&#x43E;&#x438;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x438; &#x43F;&#x43E; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x435; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x438; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x44B; &#x440;&#x430;&#x43D;&#x435;&#x435;
    factoryContext.ArgumentExpressions ??= CreateArgumentsAndInferMetadata(methodInfo, factoryContext);

    // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;
    factoryContext.MethodCall = CreateMethodCall(
        methodInfo, targetExpression, factoryContext.ArgumentExpressions);

    var returnType = methodInfo.ReturnType;

    // &#x415;&#x441;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430; null), &#x442;&#x43E;.
    // &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44E; Expression. &#x413;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &quot;write response&quot;
    // &#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; &#x438; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x430;&#x438;&#x432;&#x430;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439;.
    var responseWritingMethodCall = factoryContext.ParamCheckExpressions.Count &gt; 0 ?
        CreateParamCheckingResponseWritingMethodCall(returnType, factoryContext) :
        AddResponseWritingToMethodCall(factoryContext.MethodCall, returnType);

    // &#x415;&#x441;&#x43B;&#x438; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; tempSourceString.
    // &#x442;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x43E; 
    if (factoryContext.UsingTempSourceString)
    {
        responseWritingMethodCall = Expression.Block(
            new[] { TempSourceStringExpr }, 
            responseWritingMethodCall);
    }

    // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; Func&lt;&gt;
    return HandleRequestBodyAndCompileRequestDelegate(responseWritingMethodCall, factoryContext);
}</code></pre><p>&#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x43D;&#x43E; &#x43E;&#x43D; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; <code>tempSourceString</code>, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;. &#x41F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x43E;&#x43D; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x43E; <code>Expression</code>:</p><pre><code class="language-csharp">string tempSourceString;</code></pre><p>&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435;:</p><pre><code class="language-csharp">internal static readonly ParameterExpression TempSourceStringExpr =
    Expression.Variable(typeof(string), &quot;tempSourceString&quot;);</code></pre><p>&#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; <code>CreateMethodCall()</code> &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x43D;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &quot;target&quot; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;. &quot;Target&quot; &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; (&#x435;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x43A;&#x43E;&#x432;&#x43E;&#x439; &#x438;&#x43C;&#x435;&#x435;&#x442;&#x441;&#x44F;), &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x414;&#x43B;&#x44F; minimal API, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x446;&#x435;&#x43B;&#x44C; &#x440;&#x430;&#x432;&#x43D;&#x430; <code>null</code>, &#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430; &#x438;&#x43B;&#x438; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x443;, &#x43E;&#x43D;&#x430; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x43D;&#x430; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;:</p><pre><code class="language-csharp">private static Expression CreateMethodCall(
    MethodInfo methodInfo, Expression? target, Expression[] arguments) =&gt;
    target is null ?
        Expression.Call(methodInfo, arguments) :
        Expression.Call(target, methodInfo, arguments);</code></pre><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438; &#x44D;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442; &#x43B;&#x438;&#x431;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>handler(arg1, arg2)</code>, &#x43B;&#x438;&#x431;&#x43E; <code>target.handler(arg1, arg2)</code> &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; target null.</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateParamCheckingResponseWritingMethodCall()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x448;&#x435;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;&#x43C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x43D;&#x43E;&#x439;.</p><h2 id="%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BE%D0%BA-%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%B2-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5">&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43E;&#x43A; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;.</h2><p>&#x41B;&#x435;&#x433;&#x447;&#x435; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; <code>CreateParamCheckingResponseWritingMethodCall()</code>, &#x434;&#x443;&#x43C;&#x430;&#x44F; &#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; <code>CreateArgument()</code>. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x435;&#x441;&#x43B;&#x438; &#x43C;&#x44B; &#x432;&#x43E;&#x437;&#x44C;&#x43C;&#x435;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; minimal API:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;. (string q) =&gt; {});</code></pre><p>&#x418;&#x437; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43C;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    bool wasParamCheckFailure = false;
    string q_local;
    
    q_local = httpContext.Request.Query[&quot;q&quot;];
    if (q_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;q&quot;, &quot;query&quot;);
    }

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local);
}</code></pre><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x435; &#x432;&#x441;&#x435; &#x438;&#x437; &#x43F;&#x435;&#x440;&#x435;&#x447;&#x438;&#x441;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435;. <code>CreateArgument()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x442;&#x440;&#x438; &#x447;&#x430;&#x441;&#x442;&#x438; <code>RequestDelegate</code> &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x438; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x432; <code>RequestDelegateFactoryContext factoryContext</code>:</p><ul><li>&#x41E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; <code>(q_local)</code> &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ExtraLocals</code>.</li><li>&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; <code>(q_local)</code>, &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ArgumentTypes</code>.</li><li>&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext.ParamCheckExpressions</code>.</li></ul><p>&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>q_local</code> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43D;&#x430; <code>null</code> &#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x434;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x439;&#x434;&#x435;&#x43D;&#x430;:</p><pre><code class="language-csharp">q_local = httpContext.Request.Query[&quot;q&quot;];
if (q_local == null)
{
    wasParamCheckFailure = true;
    Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;q&quot;, &quot;query&quot;);
}</code></pre><p>&#x423;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x44F; &#x44D;&#x442;&#x43E;, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; <code>CreateParamCheckingResponseWritingMethodCall()</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; <code>Expression</code> &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>. &#x42F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x438; &#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443; &#x43D;&#x438;&#x436;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x43D;&#x44B;&#x43C;.</p><pre><code class="language-csharp">private static Expression CreateParamCheckingResponseWritingMethodCall(
    Type returnType, // &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x440;&#x430;&#x432;&#x435;&#x43D; void
    RequestDelegateFactoryContext factoryContext)
{
    // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x434;&#x43B;&#x44F; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x445; &#x43D;&#x430;&#x43C; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, q_local)
    // &#x438; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; Expressions. +1 &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; 
    // &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; wasParamCheckFailure, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x430;
    var localVariables = new ParameterExpression[factoryContext.ExtraLocals.Count + 1];
    for (var i = 0; i &lt; factoryContext.ExtraLocals.Count; i++)
    {
        localVariables[i] = factoryContext.ExtraLocals[i];
    }

    // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; `bool wasParamCheckFailure`.
    localVariables[factoryContext.ExtraLocals.Count] = WasParamCheckFailureExpr;

    // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x434;&#x43B;&#x44F; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;
    // &#x438; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;. +1 &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x434;&#x43B;&#x438;&#x43D;&#x435; 
    // &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x434;&#x43B;&#x44F; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x43B;&#x43E;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x431;&#x44B;&#x43B;&#x43E; &#x43B;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x44B;&#x43C;
    var checkParamAndCallMethod = new Expression[factoryContext.ParamCheckExpressions.Count + 1];
    for (var i = 0; i &lt; factoryContext.ParamCheckExpressions.Count; i++)
    {
        checkParamAndCallMethod[i] = factoryContext.ParamCheckExpressions[i];
    }

    // &#x415;&#x441;&#x43B;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x437;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x44B;, &#x43C;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x438;&#x442;&#x44C; &#x438;&#x43C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C;.
    // &#x434;&#x430;&#x436;&#x435; &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x43E;&#x448;&#x435;&#x43B; &#x441;&#x431;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;. &#x41F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435; &#x43E;&#x431; &#x44D;&#x442;&#x43E;&#x43C; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;
    if (factoryContext.EndpointBuilder.FilterFactories.Count &gt; 0)
    {
        // ... &#x43F;&#x43E;&#x43A;&#x430; &#x438;&#x433;&#x43D;&#x43E;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;
    }
    else
    {
        // &#x421;&#x442;&#x440;&#x43E;&#x438;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;
        // if(wasParamCheckFailure)
        // {
        //     httpContext.Response.StatusCode = 400;
        //     return Task.CompletedTask;
        // }
        // else
        //     return handler(q_local); // Added by AddResponseWritingToMethodCall()
        var checkWasParamCheckFailure = Expression.Condition(
            WasParamCheckFailureExpr,
            Expression.Block(
                Expression.Assign(StatusCodeExpr, Expression.Constant(400)),
                CompletedTaskExpr),
            AddResponseWritingToMethodCall(factoryContext.MethodCall!, returnType));

        // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E;
        checkParamAndCallMethod[factoryContext.ParamCheckExpressions.Count] = checkWasParamCheckFailure;
    }

    // &#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x441; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x43E;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;&#x43C;&#x438;
// &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x43F;&#x43E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x438;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x435;&#x434;&#x438;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; 
    return Expression.Block(localVariables, checkParamAndCallMethod);
}</code></pre><p>&#x412; &#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438;, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x448;&#x435;, &#x43C;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; <code>AddResponseWritingToMethodCall()</code>. &#x41E;&#x43D; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x432; <code>CreateTargetableRequestDelegate()</code>, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x443; &#x43D;&#x430;&#x441; &#x43D;&#x435;&#x442; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x438;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;.</p><h2 id="%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-addresponsewritingtomethodcall">&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; AddResponseWritingToMethodCall().</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; - <code>AddResponseWritingToMethodCall()</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x434;&#x432;&#x435; &#x432;&#x435;&#x449;&#x438;:</p><ul><li>&#x412;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432; &#x432;&#x438;&#x434;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; <code>Expression</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x43D;&#x435;&#x435; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>CreateMethodCall</code>.</li><li>&#x41E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43F;&#x443;&#x442;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x432; <code>HttpResponse</code>, &#x435;&#x441;&#x43B;&#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F;.</li></ul><p>&#x422;&#x435;&#x43B;&#x43E; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L970"><code>AddResponseWritingToMethodCall()</code> &#x2014; &#x44D;&#x442;&#x43E;, &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x433;&#x438;&#x433;&#x430;&#x43D;&#x442;&#x441;&#x43A;&#x438;&#x439; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440; <code>if...else</code></a>, &#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x449;&#x438;&#x439; &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; 15 &#x441; &#x43B;&#x438;&#x448;&#x43D;&#x438;&#x43C; &#x43F;&#x443;&#x43D;&#x43A;&#x442;&#x43E;&#x432; <code>if</code>, &#x44F; &#x43A;&#x440;&#x430;&#x442;&#x43A;&#x43E; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x432; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x44B;&#x439; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; C#, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;, &#x441; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x441; &#x442;&#x438;&#x43F;&#x43E;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430;.</p><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-void">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: void</h3><p>&#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x435;&#x439;&#x448;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x43D;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x442;, &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; - void:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string q) =&gt; {})</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C;, &#x43A;&#x440;&#x43E;&#x43C;&#x435; &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43A;&#x43E;&#x434; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">handler.Invoke(q_local); // &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;
return Task.CompletedTask;</code></pre><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-string">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: string</h3><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x435;&#x439;&#x448;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x44B;&#x439; &#x43E;&#x442;&#x432;&#x435;&#x442;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, () =&gt; &quot;Hello world!&quot;);</code></pre><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; <code>Content-Type</code> &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43D;&#x430; <code>text/plain</code> &#x438; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x439; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;:</p><pre><code class="language-csharp">string text = handler.Invoke(); // &#x44D;&#x442;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430;, &#x43D;&#x43E; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x44F;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;
httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
return httpContext.Response.WriteAsync(text);</code></pre><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-iresult">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: IResult</h3><p><code>string</code> &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x432; minimal API, &#x430; <code>IResult</code> - &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439;. &#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>IResult</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x432; &#x43F;&#x43E;&#x442;&#x43E;&#x43A; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x443; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x445; <code>Content-Type</code> &#x438;&#x43B;&#x438; &#x43A;&#x43E;&#x434;&#x43E;&#x432; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F;.</p><p>&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x43D;&#x438;&#x43A;&#x438; <code>Results</code> &#x438; <code>TypedResults</code> &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x43C; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; <code>IResult</code>:</p><pre><code class="language-csharp">app.Map(&quot;/&quot;, () =&gt; Results.NoContent());</code></pre><p>&#x414;&#x43B;&#x44F; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430; &#x44D;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x434; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">var result = handler.Invoke(); // &#x44D;&#x442;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430;, &#x43D;&#x43E; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x44F;&#x441;&#x43D;&#x43E;&#x441;&#x442;&#x438;
return ExecuteResultWriteResponse(result, httpContext); // &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x445;&#x435;&#x43B;&#x43F;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; ExecuteAsync

private static async Task ExecuteResultWriteResponse(
        IResult? result, HttpContext httpContext)
{
    if (result is null)
    {
        throw new InvalidOperationException(&quot;IResult &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x43E;&#x43C; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; null.&quot;);
    }

    await result.ExecuteAsync(httpContext);
}</code></pre><p>&#x421;&#x430;&#x43C;&#x43E;&#x435; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;&#x435; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &quot;&#x433;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x439;&quot; <code>RequestDelegate</code> &#x43D;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>await</code> &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43E;&#x43D; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>ExecuteResultWriteResponse</code>. &#x412; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x442;&#x430;&#x43A;&#x438;&#x445; &quot;&#x43D;&#x435;&#x43F;&#x440;&#x44F;&#x43C;&#x44B;&#x445;&quot; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x439;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D;&#x438; &#x43E;&#x431;&#x43B;&#x435;&#x433;&#x447;&#x430;&#x44E;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;.</p><p>&#x415;&#x449;&#x435; &#x43E;&#x434;&#x438;&#x43D; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;, &#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x44C;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x438;&#x448;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x44B; <code>IResult</code>: &#x435;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x448; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x430; <code>(struct) IResult</code>, &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x43E;&#x439;&#x434;&#x435;&#x442; &#x431;&#x43E;&#x43A;&#x441;&#x438;&#x43D;&#x433; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447;&#x435;&#x439; &#x432; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;. &#x42D;&#x442;&#x43E;, &#x432;&#x435;&#x440;&#x43E;&#x44F;&#x442;&#x43D;&#x43E;, &#x443;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x44F;&#x435;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x43E;&#x442;&#x435;&#x43D;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x435;&#x438;&#x43C;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x439; <code>struct IResult</code>.</p><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-json">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: JSON</h3><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x442;&#x438;&#x43F; (&#x43D;&#x435; Task), &#x43E;&#x43D; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x435;&#x43B;&#x43E; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43A;&#x430;&#x43A; JSON. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;:</p><pre><code class="language-csharp">app.Map(&quot;/&quot;, () =&gt; new { Message = &quot;Hello world!&quot;});</code></pre><p><code>RequestDelegate</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; <a href="https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.http.httpresponsejsonextensions.writeasjsonasync?view=aspnetcore-7.0&amp;ref=zznob.ru">&#x43C;&#x435;&#x442;&#x43E;&#x434; <code>HttpResponseJsonExtensions.WriteAsJsonAsync()</code></a> &#x434;&#x43B;&#x44F; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x442;&#x438;&#x43F;&#x430; &#x432; <code>HttpResponse</code>. &#x412;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43D;&#x435;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x443;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>WriteAsJsonAsync()</code> &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x439;, &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; <a href="https://github.com/dotnet/aspnetcore/issues/43894?ref=zznob.ru">&#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C; &#x441; &#x43F;&#x43E;&#x43B;&#x438;&#x43C;&#x43E;&#x440;&#x444;&#x438;&#x437;&#x43C;&#x43E;&#x43C; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x430; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;</a>.</p><pre><code class="language-csharp">var result = handler.Invoke();
return WriteJsonResponse(httpContext.Response, result); // &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x445;&#x435;&#x43B;&#x43F;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; ExecuteAsync

private static Task WriteJsonResponse(HttpResponse response, object? value)
{
    return HttpResponseJsonExtensions.WriteAsJsonAsync(
        response,
        value,
        value is null ? typeof(object) : value.GetType(),
        default);
}</code></pre><p>&#x42D;&#x442;&#x43E; &#x43E;&#x445;&#x432;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &quot;&#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x435;&quot; &#x442;&#x438;&#x43F;&#x44B;: <code>string</code>, <code>IResult</code> &#x438; &quot;&#x434;&#x440;&#x443;&#x433;&#x438;&#x435; DTO&quot;.</p><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-object">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: object</h3><p>&#x41F;&#x440;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43E;&#x434;&#x43D;&#x438;&#x43C; &#x438;&#x437; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; <code>IResult</code> &#x438;&#x43B;&#x438; <code>string</code>, &#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;. &#x415;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x43E;&#x43D; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432; JSON. &#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442;&#x435;: &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x442;&#x440;&#x435;&#x445; &#x443;&#x436;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;.</p><p>&#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x434;&#x43B;&#x44F; API, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">app.Map(&quot;/&quot;, () =&gt; (object) &quot;Hello world!&quot;);</code></pre><p>&#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;:</p><pre><code class="language-csharp"> // &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432; ExecuteAwaitedReturn
return ExecuteAwaitedReturn(handler.Invoke(), httpContext);

private static Task ExecuteAwaitedReturn(object obj, HttpContext httpContext)
{
    // &#x412;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x442;&#x435;&#x440;&#x43C;&#x438;&#x43D;&#x430;&#x43B;&#x44B;
    if (obj is IResult result)
    {
        return ExecuteResultWriteResponse(result, httpContext);
    }
    else if (obj is string stringValue)
    {
        httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
        return httpContext.Response.WriteAsync(stringValue);
    }
    else
    {
        // &#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x43C;&#x44B; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x43C; JSON, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x434;&#x43E;&#x441;&#x442;&#x438;&#x433;&#x430;&#x435;&#x43C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; &#x442;&#x435;&#x440;&#x43C;&#x438;&#x43D;&#x430;&#x43B;&#x430;
        return WriteJsonResponse(httpContext.Response, obj);
    }
}</code></pre><p>&#x42D;&#x442;&#x43E; &#x43E;&#x445;&#x432;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x435; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x438;, &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B; <code>Task</code>.</p><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-task-%D0%B8%D0%BB%D0%B8-valuetask">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: Task &#x438;&#x43B;&#x438; ValueTask</h3><p>&#x421;&#x430;&#x43C;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x438; &#x2014; &#x44D;&#x442;&#x43E; &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; <code>Task</code> &#x438;&#x43B;&#x438; <code>ValueTask</code>. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;:</p><pre><code class="language-csharp">app.Map(&quot;/&quot;, () =&gt; 
{
    return Task.CompletedTask;
});</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x432;&#x441;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;, &#x43C;&#x44B; &#x431;&#x443;&#x43A;&#x432;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;:</p><pre><code class="language-csharp">return handler.Invoke();</code></pre><p>&#x412;&#x435;&#x440;&#x441;&#x438;&#x44F; <code>ValueTask</code>, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x449;&#x430;&#x44F;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, <code>ValueTask.CompletedTask</code> &#x438;&#x43B;&#x438; <code>new ValueTask()</code>, &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x435;&#x439; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code>ValueTask</code> &#x432; <code>Task</code>:</p><pre><code class="language-csharp">return ExecuteValueTask(handler.Invoke());

static Task ExecuteValueTask(ValueTask task)
{
    // &#x415;&#x441;&#x43B;&#x438; &#x437;&#x430;&#x434;&#x430;&#x447;&#x430; ValueTask &#x443;&#x436;&#x435; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x430; (&#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x44B;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;)
    // &#x41C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C;
    if (task.IsCompletedSuccessfully)
    {
        task.GetAwaiter().GetResult();
        return Task.CompletedTask;
    }

    // &#x432; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; (&#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;)
    // &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; await &#x432; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43D;&#x435; &#x43F;&#x43B;&#x430;&#x442;&#x438;&#x43C; &#x437;&#x430; &#x441;&#x442;&#x43E;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x44C;
    // &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x44B; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; async &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;
    return ExecuteAwaited(task);
    
    static async Task ExecuteAwaited(ValueTask task)
    {
        await task;
    }
}</code></pre><p>&#x42D;&#x442;&#x43E; &#x43A;&#x430;&#x441;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432; <code>Task</code> , &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x438;.</p><h3 id="%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-taskt-%D0%B8%D0%BB%D0%B8-valuetaskt">&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;: Task&lt;T&gt; &#x438;&#x43B;&#x438; ValueTask&lt;T&gt;</h3><p>&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442; <code>Task&lt;T&gt;</code> &#x438;&#x43B;&#x438; <code>ValueTask&lt;T&gt;</code> &#x2014; &#x44D;&#x442;&#x43E;, &#x432;&#x435;&#x440;&#x43E;&#x44F;&#x442;&#x43D;&#x43E;, &#x43E;&#x434;&#x43D;&#x438; &#x438;&#x437; &#x441;&#x430;&#x43C;&#x44B;&#x445; &#x440;&#x430;&#x441;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x434;&#x43B;&#x44F; minimal API: &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;, &#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x435;&#x433;&#x43E; &#x43D;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x447;&#x435;&#x433;&#x43E;-&#x442;&#x43E; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x43E;&#x433;&#x43E;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F;/&#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x438;&#x437; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; DTO &#x441; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430;&#x43C;&#x438;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, async (IWidgetService service) =&gt; 
{
    var widgets = await service.GetAll();
    return widgets.Select(widget =&gt; new { widget.Id, widget.Name });
});</code></pre><p>&#x41A;&#x430;&#x43A; &#x438; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43B;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C;, &#x43A;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x434;&#x43B;&#x44F; <code>Task&lt;T&gt;</code> &#x438; <code>ValueTask&lt;T&gt;</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>await</code> &#x43D;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x437;&#x430;&#x442;&#x435;&#x43C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x442;&#x43E;&#x442; &#x436;&#x435; &#x43A;&#x43E;&#x434; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x443;&#x436;&#x435; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>string</code>, <code>IResult</code> &#x438;&#x43B;&#x438; &#x447;&#x435;&#x43C;-&#x442;&#x43E; &#x435;&#x449;&#x435;.</p><p>&#x42F; &#x43D;&#x435; &#x441;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x447;&#x438;&#x441;&#x43B;&#x44F;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x438; &#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x430;&#x446;&#x438;&#x438;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; <code>Task&lt;T&gt;</code> &#x432;&#x44B;&#x448;&#x435;:</p><pre><code class="language-csharp">var result = handler.Invoke(
    httpContext.RequestServices.GetRequiredService&lt;IWidgetService&gt;());

// RequestDelegateFactory &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43E;&#x431;&#x449;&#x435;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430; 
// &#x438;&#x437; Task&lt;T&gt; &#x432; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435;, &#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x449;&#x438;&#x439; ExecuteTaskOfT
return ExecuteTaskOfT&lt;IEnumerable&lt;WidgetDto&gt;&gt;(result, httpContext); 

private static Task ExecuteTaskOfT&lt;T&gt;(Task&lt;T&gt; task, HttpContext httpContext)
{
    // &#x41D;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; null &#x43A;&#x430;&#x43A; Task, &#x43D;&#x438;&#x43A;&#x43E;&#x433;&#x434;&#x430;!
    if (task is null)
    {
        throw new InvalidOperationException(&quot;The Task returned by the Delegate must not be null.&quot;);
    }

    // &#x415;&#x441;&#x43B;&#x438; Task &#x443;&#x436;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x43E;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;
    // &#x438; &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x438;&#x442;&#x435; WriteJsonResponse
    if (task.IsCompletedSuccessfully)
    {
        return WriteJsonResponse(httpContext.Response, task.GetAwaiter().GetResult());
    }

    // &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x438;&#x43B;&#x441;&#x44F;, &#x43E;&#x436;&#x438;&#x434;&#x430;&#x439;&#x442;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430;
    return ExecuteAwaited(task, httpContext);

    static async Task ExecuteAwaited(Task&lt;T&gt; task, HttpContext httpContext)
    {
        // &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x434;&#x430;&#x43D;&#x438;&#x44F;, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; WriteJsonResponse
        await WriteJsonResponse(httpContext.Response, await task);
    }
}

// &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; WriteJsonResponse - &#x442;&#x43E;&#x442; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x44B;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B;
// &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; T &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;
private static Task WriteJsonResponse(HttpResponse response, object? value)
{
    return HttpResponseJsonExtensions.WriteAsJsonAsync(
        response, value,value is null ? typeof(object) : value.GetType(), default);
}</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43A;&#x43E;&#x434;&#x430;, &#x43D;&#x43E; &#x43D;&#x435;&#x442; &#x43D;&#x438;&#x447;&#x435;&#x433;&#x43E; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x433;&#x43E;:</p><p>&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44C;&#x442;&#x435; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x43B;&#x438; &#x443;&#x436;&#x435; &#x437;&#x430;&#x434;&#x430;&#x447;&#x430; <code>Task&lt;T&gt;</code>?</p><ul><li>&#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>WriteJsonResponse()</code></li><li>&#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C; <code>Task</code>, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>WriteJsonResponse()</code>.</li></ul><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>WriteJsonResponse</code> -&#x2014; &#x44D;&#x442;&#x43E; &#x442;&#x43E;&#x442; &#x436;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x435; T (&#x431;&#x435;&#x437; <code>Task&lt;&gt;</code>). &#x412;&#x44B;&#x437;&#x43E;&#x432; <code>await</code> &#x43E;&#x431;&#x435;&#x440;&#x43D;&#x443;&#x442; &#x432; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;, &#x43A;&#x430;&#x43A; &#x438; &#x43D;&#x435;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; <code>Task</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x44B; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; <code>async</code>, &#x43A;&#x43E;&#x433;&#x434;&#x430; <code>Task</code> &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x43E; (<em>&#x44F; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x44E;</em>).</p><p>&#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443; &#x435;&#x449;&#x435; &#x43E;&#x434;&#x438;&#x43D; - &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x449;&#x438;&#x439; <code>ValueTask&lt;string&gt;</code>, &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x432;&#x440;&#x43E;&#x434;&#x435;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, () =&gt; new ValueTask(&quot;Hello world!&quot;));</code></pre><p>&#x422;&#x443;&#x442; &#x432;&#x441;&#x451; &#x431;&#x435;&#x437; &#x441;&#x44E;&#x440;&#x43F;&#x440;&#x438;&#x437;&#x43E;&#x432;:</p><pre><code class="language-csharp">var result = handler.Invoke();

// RequestDelegateFactory &#x447;&#x438;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43E;&#x431;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430;
// &#x438;&#x437; Task&lt;T&gt; &#x432; result, &#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; ExecuteValueTaskOfString
return ExecuteValueTaskOfString(result, httpContext); 

private static Task ExecuteValueTaskOfString(ValueTask&lt;string?&gt; task, HttpContext httpContext)
{
    httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;

    // &#x415;&#x441;&#x43B;&#x438; ValueTask &#x443;&#x436;&#x435; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x43E; (&#x43E;&#x431;&#x449;&#x438;&#x439; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;)
    // &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; result &#x438; &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x432; response
    if (task.IsCompletedSuccessfully)
    {
        return httpContext.Response.WriteAsync(task.GetAwaiter().GetResult()!);
    }

    // &#x415;&#x441;&#x43B;&#x438; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x438;&#x43B;&#x43E;&#x441;&#x44C;, &#x442;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;
    return ExecuteAwaited(task, httpContext);

    static async Task ExecuteAwaited(ValueTask&lt;string&gt; task, HttpContext httpContext)
    {
        // &#x436;&#x434;&#x435;&#x43C; ValueTask, &#x438; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x436;&#x434;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C; response
        await httpContext.Response.WriteAsync(await task);
    }
}</code></pre><p>&#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x44B; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x43E;&#x432;. &#x424;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x434;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x437;&#x434;&#x435;&#x441;&#x44C;, &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442; &#x438; &#x438;&#x43D;&#x442;&#x443;&#x438;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x435;&#x43D;, &#x43E;&#x43D; &#x443;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x447;&#x435;&#x442;&#x44B;&#x440;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; ( <code>void</code>, <code>string</code>, <code>IResult</code> &#x438; <code>T</code>), &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x438;&#x445; &#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442;&#x44B; <code>Task</code>/ <code>Task&lt;T&gt;</code>/ <code>ValueTask&lt;T&gt;</code>. &#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x44D;&#x442;&#x43E; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x437;&#x430;&#x449;&#x438;&#x442;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x438; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x43C;&#x44B; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x431;&#x435;&#x440;&#x435;&#x43C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x438; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.Create()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; <code>CreateTargetableRequestDelegate</code> &#x438; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x43A;&#x43E;&#x434;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x43D; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x412; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x434;&#x432;&#x430; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;:</p><ul><li><code>CreateParamCheckingResponseWritingMethodCall()</code> &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x43B;&#x430; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x430; &#x441; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x43E;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442; <code>400 Bad Request</code>.</li><li><code>AddResponseWritingToMethodCall()</code> &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; &#x43F;&#x443;&#x442;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442; (&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>await</code> &#x43D;&#x430; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x435; <code>Task</code>, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;).</li></ul><p>&#x42D;&#x442;&#x43E; &#x431;&#x44B;&#x43B;&#x438; &#x434;&#x432;&#x435; &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x44E;&#x449;&#x438;&#x435; &#x447;&#x430;&#x441;&#x442;&#x438; &#x432; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x441;&#x435;&#x433;&#x43E; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x431;&#x435;&#x440;&#x435;&#x43C; &#x432;&#x441;&#x435; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435;, &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x432; <code>RequestDelegateFactory.Create()</code>.</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-6-generating-the-response-writing-expression/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Генерация выражений аргументов для minimal API. Часть 2]]></title><description><![CDATA[<p>&#x412; <a href="https://zznob.ru/gienieratsiia-vyrazhienii-arghumientov-dlia-minimal-api/">&#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;</a> &#x441;&#x435;&#x440;&#x438;&#x438; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; <code>RequestDelegateFactory.CreateArgument()</code> &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x434;&#x435;&#x440;&#x435;&#x432;</p>]]></description><link>https://zznob.ru/gienieratsiia-vyrazhienii-arghumientov-dlia-minimal-api-chast-2/</link><guid isPermaLink="false">64229e0e170f3a0001018b40</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Wed, 29 Mar 2023 05:02:27 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1554769945-af468c934022?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDV8fEdlbmVyYXRpbmd8ZW58MHx8fHwxNjgwMDY2MTIw&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1554769945-af468c934022?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDV8fEdlbmVyYXRpbmd8ZW58MHx8fHwxNjgwMDY2MTIw&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x434;&#x43B;&#x44F; minimal API. &#x427;&#x430;&#x441;&#x442;&#x44C; 2"><p>&#x412; <a href="https://zznob.ru/gienieratsiia-vyrazhienii-arghumientov-dlia-minimal-api/">&#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;</a> &#x441;&#x435;&#x440;&#x438;&#x438; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; <code>RequestDelegateFactory.CreateArgument()</code> &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432; minimal API. &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x443; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;, &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43E;&#x432; &#x43A;&#x43E;&#x434;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; <code>CreateArgument()</code> &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x448;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x441;&#x440;&#x430;&#x437;&#x443; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x443; &#x43A; &#x434;&#x435;&#x43B;&#x443;, &#x431;&#x435;&#x437; &#x432;&#x441;&#x44F;&#x43A;&#x43E;&#x433;&#x43E; &#x432;&#x441;&#x442;&#x443;&#x43F;&#x43B;&#x435;&#x43D;&#x438;&#x44F;. &#x42F; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x44E; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; <a href="https://zznob.ru/gienieratsiia-vyrazhienii-arghumientov-dlia-minimal-api/">&#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x443;&#x44E; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E;</a>, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x435;&#x449;&#x435; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B;&#x438; (&#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x432;&#x441;&#x435; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438;)!</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2-%D1%81%D1%82%D1%80%D0%BE%D0%BA-%D0%B8%D0%BB%D0%B8-stringvalues-%D0%BA-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x438;&#x43B;&#x438; StringValues? &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</h2><p>&#x412; &#x43F;&#x440;&#x43E;&#x448;&#x43B;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43A;&#x430;&#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x44B;&#x445;, &#x442;&#x430;&#x43A; &#x438; <code>TryParse</code> &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; <code>int</code>. &#x42D;&#x442;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x449;&#x435; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x433;&#x434;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x43D;&#x435;&#x442; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x439; &#x43A; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44E;/&#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x443;.</p><p>&#x422;&#x43E; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;: &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; <code>string[]</code> &#x438;&#x43B;&#x438; <code>StringValues</code> &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x449;&#x435;, &#x447;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; <code>TryParse</code> &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; <code>int[]</code>.</p><blockquote><code>StringValues</code> &#x2014; &#x44D;&#x442;&#x43E; &#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x430;, &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; <a href="https://learn.microsoft.com/dotnet/api/microsoft.extensions.primitives.stringvalues?ref=zznob.ru">&#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; 0/null, &#x43E;&#x434;&#x43D;&#x443; &#x438;&#x43B;&#x438; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;</a>. &#x41E;&#x43D;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x430; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x438; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;, &#x438; &#x438;&#x437; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x43A;.</blockquote><p>&#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; <code>q</code> &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x442;&#x438;&#x43F;&#x430; <code>/?q=Mark&amp;q=John</code> &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x434;&#x432;&#x430; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, <code>&quot;Mark&quot;</code> &#x438; <code>&quot;John&quot;</code>:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string[]? q) =&gt; {});</code></pre><p>&#x41F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x43A;&#x430;&#x43A; &#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x438;, &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x432;&#x437;&#x44F;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;/&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;/&#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x43E;&#x432; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x442;&#x44C; &#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;. &#x421;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430; <code>Query</code>, <code>Headers</code> &#x438; &#x442;. &#x434;. &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; <code>string[]</code>, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.Request.Query[&quot;q&quot;] != null 
            ? httpContext.Request.Query[&quot;q&quot;]
            : (string[]) null); 

    return Task.CompletedTask;
}</code></pre><p>&#x42D;&#x442;&#x43E;&#x442; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438; &#x438;&#x434;&#x435;&#x43D;&#x442;&#x438;&#x447;&#x435;&#x43D; &#x442;&#x43E;&#x43C;&#x443;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>StringValues</code>, &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x438;&#x437; <code>Query[&quot;q&quot;]</code>, &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x432; <code>string</code>, &#x442;&#x430;&#x43A; &#x438; &#x432; <code>string[]</code>!</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D0%BC%D1%8B%D1%85-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2-%D1%81%D1%82%D1%80%D0%BE%D0%BA-%D0%B8%D0%BB%D0%B8-stringvalues">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x44B;&#x445; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x438;&#x43B;&#x438; StringValues.</h2><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43B;&#x43E;&#x433;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x448;&#x430;&#x433; - &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;, &#x430; &#x43D;&#x435; &#x43E;&#x43F;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string[] q) =&gt; {});</code></pre><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x442;&#x435;&#x43E;&#x440;&#x435;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; <code>Expression</code> &#x43E;&#x441;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439;, &#x43D;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; <code>RequestDelegate</code> &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x441;&#x43E;&#x432;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442;. &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-7.0&amp;ref=zznob.ru#optional-parameters">&#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C; &#x43E;&#x442;&#x432;&#x435;&#x442; <code>400 BadRequest</code></a>.</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    bool wasParamCheckFailure = false; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    string[] q_local;

    q_local = httpContext.Request.Query[&quot;q&quot;]
    if (q_local == null) // &#x435;&#x441;&#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435;&#x442;
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string[]&quot;, &quot;q&quot;, &quot;query&quot;);
    }

    if(wasParamCheckFailure) // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><blockquote>&#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x432; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; <code>string[]</code> &#x438; <code>string[]?</code> &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x435; &#x43F;&#x43E; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x435;&#x43D;&#x438;&#x44E; &#x441; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x44B;&#x445; &#x438; &#x43E;&#x431;&#x43D;&#x443;&#x43B;&#x44F;&#x435;&#x43C;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;. &#x422;&#x435;&#x43E;&#x440;&#x435;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43D;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>string[]?</code> &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>null</code> (&#x43A;&#x430;&#x43A; &#x431;&#x44B;&#x43B;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435;), &#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>string[]?</code> &#x432;&#x435;&#x440;&#x43D;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; <code>400 Bad Request</code>, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x448;&#x435; &#x43A;&#x43E;&#x434;&#x435;.</blockquote><blockquote>&#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x442;&#x435; &#x44D;&#x442;&#x438; API &#x438; &#x43D;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x435; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43D;&#x438;&#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x440;&#x430;&#x432;&#x435;&#x43D; <code>null</code> &#x438; &#x43D;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; <code>400 Bad Request</code> - &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; &#x43F;&#x443;&#x441;&#x442;&#x43E;&#x439; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;. &#x412; &#x43D;&#x430;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x435;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43E;&#x440;&#x435;&#x447;&#x438;&#x442; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438; (&#x438; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44E; <code>StringValues</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x442; <code>400</code>), &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; <a href="https://github.com/dotnet/aspnetcore/issues/45956?ref=zznob.ru">&#x44F; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x43B; issue &#x43F;&#x43E; &#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43F;&#x43E;&#x432;&#x43E;&#x434;&#x443;</a>, &#x433;&#x434;&#x435; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x44B; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x438;&#x439;. &#x41A;&#x43E;&#x43D;&#x441;&#x435;&#x43D;&#x441;&#x443;&#x441; &#x43F;&#x43E; &#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x443;, &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435;, &#x442;&#x430;&#x43A;&#x43E;&#x432;: &quot;&#x41F;&#x43E; &#x437;&#x430;&#x43C;&#x44B;&#x441;&#x43B;&#x443;, &#x438;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x43C;&quot;.</blockquote><p>&#x412;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435; &#x43D;&#x430; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435;, &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x434;&#x438;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, &#x443;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x44F;, &#x447;&#x442;&#x43E; <code>StringValues</code> &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x44B; &#x43A;&#x430;&#x43A; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435;, &#x442;&#x430;&#x43A; &#x438; &#x43A; <code>string[]</code>. &#x421;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435; &#x43E;&#x431;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x434;&#x435;&#x43B;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x433;&#x434;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>TryParse</code>.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-int-%D0%BA-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; int[] &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</h2><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>int?[]</code> &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (int?[] q) =&gt; {});</code></pre><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x44C; <code>string[]</code> &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; ( <code>tempStringArray</code> ), &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; null, &#x438;, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x438;&#x437; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441;&#x43F;&#x430;&#x440;&#x441;&#x438;&#x442;&#x44C; (<code>TryParse</code>) &#x432; <code>int</code>. &#x42D;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44F;&#x435;&#x442; &#x43A;&#x43E;&#x434;!</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string tempSourceString; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    bool wasParamCheckFailure = false; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    int?[] q_local;
    
    // &#x41F;&#x440;&#x430;&#x441;&#x438;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x439; string[]
    string[] tempStringArray = httpContext.Request.Query[&quot;q&quot;];

    if (tempStringArray != null)
    {
        // &#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x437;&#x430;&#x444;&#x438;&#x43A;&#x441;&#x438;&#x440;&#x443;&#x435;&#x442; &#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;
        q_local = new int[tempStringArray.Length];

        int index = 0;
        while(true)
        {
            if(index &lt; tempStringArray.Length)
            {
                // &#x41F;&#x440;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x441;&#x44F; &#x43F;&#x43E; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;
                tempSourceString = tempStringArray[index];

                // &#x435;&#x441;&#x43B;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x43F;&#x443;&#x441;&#x442;&#x430;&#x44F;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x432; URL /q=&amp;q=
                // &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x432; &#x434;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438;
                if(!string.IsNullOrEmpty(tempSourceString))
                {
                    // &#x41F;&#x440;&#x43E;&#x431;&#x443;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x43F;&#x430;&#x440;&#x441;&#x438;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;
                    if (int.TryParse(tempSourceString, out var parsedValue))
                    {
                        // &#x423;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x43F;&#x430;&#x440;&#x441;&#x438;&#x43B;&#x438;, &#x43A;&#x430;&#x441;&#x442;&#x443;&#x435;&#x43C; &#x43A; int? &#x438;
                        q_local[i] = (int?)parsedValue;
                    }
                    else
                    {
                        // &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x43D;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x441;&#x438;&#x43D;&#x433;
                        wasParamCheckFailure = true;
                        Log.ParameterBindingFailed(httpContext, &quot;Nullable&lt;int&gt;[]&quot;, &quot;query&quot;, tempSourceString, true);
                    }
                }
            }
            else
            {
                break;
            }
    
            index++
        }
    }
    else
    {
        // &#x1F447; &#x41D;&#x430; &#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44F; &#x43C;&#x43E;&#x433;&#x443; &#x441;&#x443;&#x434;&#x438;&#x442;&#x44C;, &#x44D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x434; &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D; &#x438;&#x437;-&#x437;&#x430; 
        // https://github.com/dotnet/aspnetcore/issues/45956
        wasParamCheckFailure = true;
        Log.ParameterBindingFailed(httpContext, &quot;Int32[]&quot;, &quot;q&quot;, &quot;query&quot;, tempSourceString, true);
    }

    if(wasParamCheckFailure) // &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><p>&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x432;&#x44B; &#x43F;&#x43E;&#x434;&#x443;&#x43C;&#x430;&#x435;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x434; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x43E;: &#x446;&#x438;&#x43A;&#x43B; <code>while</code> &#x441;&#x43E; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x43C; <code>if</code> - &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x431;&#x44B; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x446;&#x438;&#x43A;&#x43B; <code>for</code> &#x438;&#x43B;&#x438; <code>foreach</code>. &#x41C;&#x43E;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;: &#x44D;&#x442;&#x43E;&#x442; &#x43A;&#x43E;&#x434; &#x43B;&#x435;&#x433;&#x447;&#x435; &#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x432;&#x441;&#x435; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442;&#x435; &#x432; &#x432;&#x438;&#x434;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;! &#x412; &#x43D;&#x435;&#x43C; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x438;&#x445;&#x441;&#x44F; &#x431;&#x43B;&#x43E;&#x43A;&#x43E;&#x432; <code>Expression</code> &#x43C;&#x435;&#x436;&#x434;&#x443; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43D;&#x435; &#x441;&#x43A;&#x43B;&#x43E;&#x43D;&#x435;&#x43D; &#x43A;&#x440;&#x438;&#x442;&#x438;&#x43A;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L1455-L1680">&#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x43D;&#x430; 250 &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x43F;&#x440;&#x438;&#x441;&#x435;&#x434;&#x430;&#x43D;&#x438;&#x439; &#x441; <code>Expression</code> </a>&#x432; <code>BindParameterFromValue()</code>!</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2-%D0%B8%D0%B7-di">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x432; &#x438;&#x437; DI.</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B;: &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430;&#x43C; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435; DI. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x43E;&#x437;&#x44C;&#x43C;&#x435;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x44B;:</p><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder();
builder.Services.AddSingleton&lt;MyService&gt;();

var app = builder.Build();
app.MapGet(&quot;/&quot;, (MyService service) =&gt; {});
app.Run()

class MyService {}</code></pre><p>&#x42D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; minimal API &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x442;&#x438;&#x43F; <code>MyService</code> &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x435;&#x43D; &#x432; DI, &#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43A; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x443; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>GetRequiredService()</code>.</p><pre><code class="language-csharp">async Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.RequestServices.GetRequiredService&lt;MyService&gt;()); 

    return Task.CompletedTask;
}</code></pre><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2-%D0%B8%D0%B7-di">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43E;&#x43F;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x432; &#x438;&#x437; DI.</h2><p>&quot;&#x41D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435;&quot; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x437;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D; &#x432; DI, &#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x438; &#x43D;&#x435; &#x431;&#x44B;&#x442;&#x44C;, &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43A;&#x430;&#x436;&#x443;&#x442;&#x441;&#x44F; &#x43C;&#x43D;&#x435; &#x43F;&#x43B;&#x43E;&#x445;&#x438;&#x43C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x43C;, &#x43D;&#x43E; &#x43E;&#x43D;&#x438; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; minimal API. &#x41E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[FromServices]</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; minimal API &#x43F;&#x43E;&#x43D;&#x44F;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; DI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;, &#x438; &#x43F;&#x43E;&#x43C;&#x435;&#x442;&#x438;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43A;&#x430;&#x43A; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>?</code></p><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.MapGet(&quot;/&quot;, ([FromServices] MyService? service) =&gt; {});
app.Run()</code></pre><p>&#x420;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435; &#x43D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x441; &quot;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&quot; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x43C;. &#x415;&#x434;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x435; - &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; <code>GetService</code> &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; <code>GetRequiredService</code>.</p><pre><code class="language-csharp">async Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.RequestServices.GetService&lt;IService&gt;()); 

    return Task.CompletedTask;
}</code></pre><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BA-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC-%D1%84%D0%BE%D1%80%D0%BC-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-iformfilecollection-%D0%B8-iformfile">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x444;&#x430;&#x439;&#x43B;&#x430;&#x43C; &#x444;&#x43E;&#x440;&#x43C; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; IFormFileCollection &#x438; IFormFile.</h2><p>&#x414;&#x430;&#x43B;&#x435;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; <code>IFormFile</code> &#x438; <code>IFormFileCollection</code>. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x432;&#x44B; &#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435; &#x438;&#x437; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x434;&#x432;&#x430; &quot;&#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x445;&quot; &#x442;&#x438;&#x43F;&#x430;, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; minimal API &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;. &#x41E;&#x43D;&#x438; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x43E;&#x434;&#x438;&#x43D;&#x430;&#x43A;&#x43E;&#x432;&#x44B; &#x43F;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x443; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;: <code>IFormFileCollection</code> &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E; &#x432;&#x441;&#x435;&#x43C; &#x444;&#x430;&#x439;&#x43B;&#x430;&#x43C; &#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x430; <code>IFormFile</code> &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x43E;&#x434;&#x43D;&#x43E;&#x43C;&#x443; &#x444;&#x430;&#x439;&#x43B;&#x443;, &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C;&#x443; &quot;file&quot; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (IFormFile? file) =&gt; {});</code></pre><p>&#x424;&#x430;&#x439;&#x43B;&#x44B; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x432; ASP.NET Core &#x447;&#x435;&#x440;&#x435;&#x437; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; <code>HttpRequest.Form.Files</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; <code>Expression</code> &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436; &#x43D;&#x430; &#x442;&#x43E;&#x442;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43B;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x438;&#x43B;&#x438; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; <code>StringValues</code> &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.Request.Form.Files[&quot;file&quot;] != null 
            ? httpContext.Request.Form.Files[&quot;file&quot;]
            : (IFormFile) null); 

    return Task.CompletedTask;
}</code></pre><p>&#x427;&#x442;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x448;&#x435; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x435;, &#x442;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x444;&#x43E;&#x440;&#x43C;&#x443; &#x438;&#x437; &#x442;&#x435;&#x43B;&#x430;, &#x43A;&#x430;&#x43A; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x448;&#x430;&#x433; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>. &#x41F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;, &#x43D;&#x43E;, &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x43E;&#x43D; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>TryReadFormAsync</code>, &#x438; &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C;&#x441;&#x44F;, &#x442;&#x43E; &#x441;&#x440;&#x430;&#x437;&#x443; &#x436;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F;.</p><pre><code class="language-csharp">static async Task&lt;(object? FormValue, bool Successful)&gt; TryReadFormAsync(
    HttpContext httpContext,
    string parameterTypeName,
    string parameterName,
    bool throwOnBadRequest)
{
    object? formValue = null;
    var feature = httpContext.Features.Get&lt;IHttpRequestBodyDetectionFeature&gt;();

    if (feature?.CanHaveBody == true)
    {
        if (!httpContext.Request.HasFormContentType)
        {
            Log.UnexpectedNonFormContentType(httpContext, httpContext.Request.ContentType, throwOnBadRequest);
            httpContext.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;
            return (null, false);
        }

        try
        {
            formValue = await httpContext.Request.ReadFormAsync();
        }
        catch (IOException ex)
        {
            Log.RequestBodyIOException(httpContext, ex);
            return (null, false);
        }
        catch (InvalidDataException ex)
        {
            Log.InvalidFormRequestBody(httpContext, parameterTypeName, parameterName, ex, throwOnBadRequest);
            httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
            return (null, false);
        }
    }

    return (formValue, true);
}</code></pre><p>&#x42F; &#x43D;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x432;&#x441;&#x435; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435; &#x441; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x435;&#x439; <code>Expression</code> &#x438; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;&#x438; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430;&#x43C;&#x438;, &#x43D;&#x43E; &#x432;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x438;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; body.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BA-%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%D1%83-%D1%84%D0%B0%D0%B9%D0%BB%D1%83-%D1%84%D0%BE%D1%80%D0%BC%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-iformfilecollection-%D0%B8-iformfile">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C;&#x443; &#x444;&#x430;&#x439;&#x43B;&#x443; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; IFormFileCollection &#x438; IFormFile.</h2><p>&#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B; &#x43C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x43E;&#x43C;&#x443; <code>IFormFile</code> &#x438;&#x43B;&#x438; <code>IFormFileCollection</code>, &#x433;&#x434;&#x435; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x444;&#x430;&#x439;&#x43B;(&#x44B;) &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;(&#x44B;). &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43B; <code>IFormFileCollection</code> &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x438;&#x44F;.</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (IFormFileCollection files) =&gt; {});</code></pre><p>&#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x443;&#x436;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x437; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;: &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; &#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x43D;&#x430; <code>null</code>. &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x43E; <code>null</code>, &#x43C;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; <code>400</code>, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443;.</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    bool wasParamCheckFailure = false;
    IFormFileCollection files;

    files = httpContext.Request.Form.Files
    if (files == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;IFormFileCollection&quot;, &quot;files&quot;, &quot;body&quot;);
    }

    if(wasParamCheckFailure) 
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(files); 

    return Task.CompletedTask;
}</code></pre><blockquote><code>TryReadFormAsync()</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x435; <code>RequestDelegate</code>, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435;.</blockquote><p>&#x41D;&#x443; &#x432;&#x43E;&#x442; &#x438; &#x432;&#x441;&#x435;, &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438; &#x441; &quot;&#x43B;&#x435;&#x433;&#x43A;&#x438;&#x43C;&#x438;&quot; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F;. &#x412;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x43C; &#x432;&#x435;&#x449;&#x430;&#x43C;...</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-bindasync-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; BindAsync &#x442;&#x438;&#x43F;&#x43E;&#x432;.</h2><p>&#x414;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &quot;&#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E;&quot; <code>RequestDelegate</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegateFactory.Create()</code>, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>Expression</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>CreateArgument()</code>. &#x41D;&#x43E; &#x44F; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43B;&#x443;&#x43A;&#x430;&#x432;&#x438;&#x43B;: &#x43F;&#x43E; &#x442;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x430;&#x43C; <code>RequestDelegate</code> &#x447;&#x430;&#x441;&#x442;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A; &quot;&#x447;&#x438;&#x441;&#x442;&quot;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x43D;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B;.</p><p>&#x41F;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x438; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43B; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;. &#x41D;&#x43E; &#x432; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x448;&#x435;&#x439;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x438; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x44F; &#x441;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x431;&#x43B;&#x438;&#x437;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x438;.</p><p>&#x41C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x441; &#x442;&#x438;&#x43F;&#x43E;&#x432; <code>BindAsync</code>. &#x41A;&#x430;&#x43A; &#x432;&#x44B;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435; &#x438;&#x437; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438;, &#x442;&#x438;&#x43F;&#x44B; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x435;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44F; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;:</p><pre><code class="language-csharp">public static ValueTask&lt;T?&gt; BindAsync(HttpContext context, ParameterInfo parameter);
public static ValueTask&lt;T?&gt; BindAsync(HttpContext context);</code></pre><p>&#x41F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x442;&#x438;&#x43F; <code>MyType</code>, &#x443; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>BindAsync</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x432; minimal API.</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (MyType t) =&gt; {});</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>t</code>, <code>CreateArgument()</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L1770">&#x43C;&#x435;&#x442;&#x43E;&#x434; <code>BindParameterFromBindAsync()</code></a>. &#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; <code>Func&lt;HttpContext, ValueTask&lt;object?&gt;&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>BindAsync</code> &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">// &#x422;&#x443;&#x442; &#x432;&#x441;&#x451; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E;, &#x437;&#x430; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43C;&#x438; &#x440;&#x430;&#x437;&#x44A;&#x44F;&#x441;&#x43D;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x438;&#x434;&#x438;&#x442;&#x435; &#x432; 
// https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Shared/ParameterBindingMethodCache.cs#L195
MethodInfo bindAsyncMethod = typeof(MyType).GetMethod(&quot;BindAsync&quot;);

var bindAsyncDelegate = Expression.Lambda&lt;Func&lt;HttpContext, ValueTask&lt;object?&gt;&gt;&gt;(
    bindAsyncMethod, HttpContextExpr).Compile();</code></pre><p>&#x41A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x43C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>Func&lt;&gt;</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>MyType</code> &#x441; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C; <code>HttpContext</code> (&#x438;&#x43B;&#x438; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;).</p><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code> &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; <code>bindAsyncDelegate</code> &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; <code>RequestDelegateFactoryContext.ParameterBinders</code>. <code>RequestDelegateFactory.Create()</code> &#x437;&#x430;&#x442;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x44D;&#x442;&#x43E;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x434;&#x43B;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x432;&#x441;&#x435;&#x445; <code>BindAsync</code>-&#x43E;&#x432;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; &quot;&#x442;&#x435;&#x43B;&#x430;&quot; <code>RequestDelegate</code>.</p><p>&#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; <code>RequestDelegate</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>Create()</code>, &#x430; &#x43D;&#x435; <code>CreateArgument()</code>, &#x43D;&#x43E; &#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x435;&#x433;&#x43E; &#x446;&#x435;&#x43B;&#x438;&#x43A;&#x43E;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F;. &#x42F;, &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x43F;&#x440;&#x43E;&#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B; &#x43A;&#x43E;&#x434;, &#x43D;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x445; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;:</p><ul><li>&#x437;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x43C;&#x435;&#x441;&#x44C; &#x43A;&#x43E;&#x434;&#x430;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>Expression</code> &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438;, &#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x445; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x439; <code>Func&lt;&gt;</code>. &#x41A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E; &#x43D;&#x438;&#x436;&#x435;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x443;&#x447;&#x448;&#x435;&#x439; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x43E;&#x439; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438; <code>Expression</code> &#x438; &#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x441; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x43C;&#x438; <code>Func&lt;&gt;</code>, &#x43D;&#x43E; &#x43E;&#x43D; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x435;&#x442;&#x43A;&#x438;&#x43C; &#x442;&#x435;&#x442;-&#x430;-&#x442;&#x435;&#x442; &#x441; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43A;&#x43E;&#x434;&#x43E;&#x43C;.</li><li>&#x412;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; <code>Func&lt;&gt;</code> (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43B; <code>generateResult</code>) &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x437;&#x430;&#x445;&#x432;&#x430;&#x447;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F;. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; &#x44F; &#x43D;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x43B; &#x43D;&#x430; &#x44D;&#x442;&#x43E; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x44F;, &#x43D;&#x43E; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x43E;, &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44F; <code>ParameterBindings</code> &#x437;&#x430;&#x445;&#x432;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;.</li><li>&#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x432;&#x43E; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D;&#x438;&#x438; &#x2014; &#x44D;&#x442;&#x43E; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x414;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; &#x44D;&#x442;&#x43E; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430;, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x438; <code>null</code>.</li></ul><p>&#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>RequestDelegateFactory.Create()</code>, &#x44F; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x438;&#x43B; &#x442;&#x435; &#x447;&#x430;&#x441;&#x442;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; <code>CreateArgument</code> &#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;.</p><pre><code class="language-csharp">// &#x41E;&#x43D;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x43D;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; RequestDelegate &#x438; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x432;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; 
// &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x435;&#x43C; RequeustDelegate Func&lt;&gt;
var binders = factoryContext.ParameterBinders.ToArray();
// &#x414;&#x43B;&#x438;&#x43D;&#x430; &#x440;&#x430;&#x432;&#x43D;&#x430; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x445; BindAsync
var count = binders.Length;

async Task Invoke(HttpContext httpContext)
{
    // &#x446;&#x435;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x437;&#x434;&#x435;&#x441;&#x44C;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x43C; &quot;&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&quot;, &#x435;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x43A;&#x43E;&#x432;&#x43E;&#x439; &#x438;&#x43C;&#x435;&#x435;&#x442;&#x441;&#x44F;
    var Task Invoke(object? target, HttpContext httpContext)
    {
        // &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x435; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;
        // &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x44B; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; BindAsync &#x43A; HttpContext
        var boundValues = new object?[count];
        for (var i = 0; i &lt; count; i++)
        {
            // &#x412;&#x44B;&#x437;&#x43E;&#x432; Func&lt;&gt; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430;
            // &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x438;&#x43D; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; MyType
            boundValues[i] = await binders[i](httpContext);
        }

        // &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F;
        var generateResult = (object? target, HttpContext httpContext, object?[] boundValues) =&gt;
        {
            bool wasParamCheckFailure = false;

            // &#x42D;&#x442;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x432;&#x44B;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;
            // &#x438; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x43D;&#x43E;&#x439; &#x438;&#x437; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x438;&#x445; &#x447;&#x430;&#x441;&#x442;&#x435;&#x439;, &#x432;&#x44B;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; CreateArgument()
            if(boundValues[0] == null)
            {
                wasParamCheckFailure = true;
                Log.RequiredParameterNotProvided(httpContext, &quot;MyType&quot;, &quot;t&quot;, &quot;MyType.BindAsync(httpContext)&quot;, true);
            }

            if(wasParamCheckFailure)
            {
                httpContext.Response.StatusCode = 400;
                return Task.CompletedTask;
            }

            // CreateArgument() &#x432;&#x44B;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; 
            // &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A; &#x442;&#x438;&#x43F;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;, MyType
            target.handler.Invoke((MyType)boundValues[0]); 

            return Task.CompletedTask;
        };

        // &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; Func&lt;&gt;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x435;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;
        generateResult(target, httpContext, boundValues);
    }

    // &#x412;&#x44B;&#x437;&#x43E;&#x432;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x446;&#x435;&#x43B;&#x438;
    return Invoke(target: Program.&lt;&gt;c, httpContext);
}</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C;, &#x44F; &#x432;&#x430;&#x441; &#x43D;&#x435; &#x432;&#x438;&#x43D;&#x44E;. &#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43D;&#x435;&#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x445; &quot;&#x43E;&#x431;&#x435;&#x440;&#x442;&#x43E;&#x43A;&quot; &#x432;&#x43E; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; <code>Func</code>, &#x447;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x445; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;&#x445; &#x44F; &quot;&#x441;&#x433;&#x43B;&#x430;&#x434;&#x438;&#x43B;&quot; &#x44D;&#x442;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x44B; <code>Func&lt;&gt;</code>, &#x43D;&#x43E; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x438;&#x445; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B;. &#x42F; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x43D;&#x435; &#x440;&#x435;&#x448;&#x438;&#x43B;, &#x436;&#x430;&#x43B;&#x435;&#x44E; &#x43B;&#x438; &#x44F; &#x43E;&#x431; &#x44D;&#x442;&#x43E;&#x43C; &#x432;&#x44B;&#x431;&#x43E;&#x440;&#x435; &#x1F605;.</p><blockquote>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; <code>RequestDelegateFactory</code>, &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; <code>Func&lt;&gt;</code>, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; <code>generateResult</code> &#x438; &#x442;.&#x434;.. <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L1101-L1119">&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; <code>Func&lt;&gt;</code> &#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x438; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x439;</a>. &#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x448;&#x435; &#x2014; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x44F; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; , &#x43D;&#x435; &#x437;&#x430;&#x446;&#x438;&#x43A;&#x43B;&#x438;&#x432;&#x430;&#x44F;&#x441;&#x44C; &#x43D;&#x430; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x44F;&#x445; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;!</blockquote><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D1%82%D0%B5%D0%BB%D0%B0-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%BA-%D1%82%D0%B8%D0%BF%D1%83">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43A; &#x442;&#x438;&#x43F;&#x443;.</h2><p>&#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x44F; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x438;&#x43B; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x443;&#x440;&#x43E;&#x434;&#x441;&#x442;&#x432;&#x430; <code>Func&lt;&gt;</code>; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x437; &#x443;&#x440;&#x43E;&#x434;&#x441;&#x442;&#x432;, &#x433;&#x434;&#x435; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;, &#x43D;&#x43E; &#x437;&#x430;&#x43C;&#x430;&#x436;&#x443; &#x432;&#x441;&#x435; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435;. &#x412;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x44F; &#x438;&#x43C;&#x435;&#x44E; &#x432; &#x432;&#x438;&#x434;&#x443;...</p><p>&#x41F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x442;&#x43E;&#x442; &#x436;&#x435; API, &#x43D;&#x43E; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x442; &#x440;&#x430;&#x437; &#x442;&#x438;&#x43F; <code>MyType</code> &#x43D;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; <code>BindAsync</code>:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (MyType t) =&gt; {});</code></pre><p>&#x41F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x44D;&#x442;&#x43E;&#x442; API &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>t</code> &#x441; &#x442;&#x435;&#x43B;&#x43E;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x42D;&#x442;&#x43E; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x435;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x43E;&#x43C; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>TryReadBodyAsync</code>. &#x41A;&#x430;&#x43A; &#x438; &#x440;&#x430;&#x43D;&#x44C;&#x448;&#x435;, &#x43F;&#x43E;&#x447;&#x442;&#x438; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; <code>RequestDelegateFactory.Create()</code>, &#x430; &#x43D;&#x435; <code>CreateArgument()</code>, &#x43D;&#x43E; &#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x44D;&#x442;&#x43E; &#x441;&#x44E;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B;.</p><pre><code class="language-csharp">async Task Invoke(HttpContext httpContext)
{
    // &#x43F;&#x44B;&#x442;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;
    var (bodyValue, successful) = await TryReadBodyAsync(
        httpContext,
        typeof(MyType),
        &quot;MyType&quot;,
        &quot;t&quot;,
        false, // factoryContext.AllowEmptyRequestBody
        true); // factoryContext.ThrowOnBadRequest

    // &#x435;&#x441;&#x43B;&#x438; &#x447;&#x442;&#x43E; &#x442;&#x43E; &#x43F;&#x43E;&#x448;&#x43B;&#x43E; &#x43D;&#x435; &#x442;&#x430;&#x43A;, &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x438;&#x43C;
    if (!successful)
    {
        return;
    }

    // &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x43C; Func&lt;&gt; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;
    var generateResponse = (object? target, HttpContext httpContext, object? bodyValue) =&gt;
    {
        bool wasParamCheckFailure = false;
        
        if (bodyValue == null) // &#x44D;&#x442;&#x43E; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43E; &#x432; CreateArgument()
        {
            wasParamCheckFailure = true;
            Log.ImplicitBodyNotProvided(httpContext, &quot;MyType&quot;, true);
        }

        handler.Invoke((MyType)bodyValue);  // &#x43A;&#x430;&#x441;&#x442;&#x443;&#x435;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x432; CreateArgument()

        return Task.CompletedTask;
    };

    // &#x412;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432; null &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x446;&#x435;&#x43B;&#x438;
    await generateResponse(target: null, httpContext, bodyValue);
}

// &#x42D;&#x442;&#x430; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; 
// &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; System.Text.Json
static async Task&lt;(object? FormValue, bool Successful)&gt; TryReadBodyAsync(
    HttpContext httpContext,
    Type bodyType,
    string parameterTypeName,
    string parameterName,
    bool allowEmptyRequestBody,
    bool throwOnBadRequest)
{
    object? defaultBodyValue = null;

    if (allowEmptyRequestBody &amp;&amp; bodyType.IsValueType)
    {
        defaultBodyValue = CreateValueType(bodyType);
    }

    var bodyValue = defaultBodyValue;
    var feature = httpContext.Features.Get&lt;IHttpRequestBodyDetectionFeature&gt;();

    if (feature?.CanHaveBody == true)
    {
        if (!httpContext.Request.HasJsonContentType())
        {
            Log.UnexpectedJsonContentType(httpContext, httpContext.Request.ContentType, throwOnBadRequest);
            httpContext.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;
            return (null, false);
        }
        try
        {
            bodyValue = await httpContext.Request.ReadFromJsonAsync(bodyType);
        }
        catch (IOException ex)
        {
            Log.RequestBodyIOException(httpContext, ex);
            return (null, false);
        }
        catch (JsonException ex)
        {
            Log.InvalidJsonRequestBody(httpContext, parameterTypeName, parameterName, ex, throwOnBadRequest);
            httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
            return (null, false);
        }
    }

    return (bodyValue, true);</code></pre><p>&#x41E;&#x434;&#x43D;&#x430; &#x432;&#x435;&#x449;&#x44C;, &#x43D;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x432; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x448;&#x435; &#x43A;&#x43E;&#x434;&#x435;, &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; <code>CreateArgument()</code> &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code> &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x430;&#x43A; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>InferMetadata</code>, &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44F;, &#x447;&#x442;&#x43E; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442; &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; <code>JSON</code> <code>MyType</code>.</p><blockquote>&#x42D;&#x442;&#x43E;&#x442; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x432; <code>Func&lt;&gt;</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>TryReadFormAsync()</code> &#x43F;&#x440;&#x438; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x438; <code>IFormFile</code>. &#x421;&#x445;&#x435;&#x43C;&#x430; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x435;&#x43B;&#x430; &#x438;&#x434;&#x435;&#x43D;&#x442;&#x438;&#x447;&#x43D;&#x430;, &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x442;&#x435;&#x43B;&#x430;.</blockquote><p>&#x41C;&#x44B; &#x437;&#x430;&#x43A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x438;. &#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x431;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x44B;: &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;, &#x43D;&#x43E; &#x43C;&#x44B; &#x443;&#x436;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x440;&#x435;&#x43F;&#x440;&#x435;&#x437;&#x435;&#x43D;&#x442;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B;, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x44B; &#x43E;&#x442; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E;.</p><p>&#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x44B; &#x438;&#x437; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; <code>CreateArgument()</code> &#x438;&#x43D;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B;. &#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>int[]</code>, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;. &#x412; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x43E;&#x442; &#x44D;&#x442;&#x43E;&#x433;&#x43E;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; DI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x443; &#x2014; &#x44D;&#x442;&#x43E; &#x442;&#x440;&#x438;&#x432;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;!</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x434;&#x440;&#x443;&#x433;&#x443;&#x44E; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; <code>RequestDelegate</code>: &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x442;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x414;&#x43E; &#x441;&#x438;&#x445; &#x43F;&#x43E;&#x440; &#x44F; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x43E;&#x43C; void, &#x43D;&#x43E; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C; &#x447;&#x442;&#x43E; &#x443;&#x433;&#x43E;&#x434;&#x43D;&#x43E; &#x438;&#x437; &#x432;&#x430;&#x448;&#x438;&#x445; API.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.CreateArgument()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; API &#x43A; <code>HttpContext</code>. <code>RequestDelegateFactory.Create()</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x44D;&#x442;&#x438; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; ASP.NET Core &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><p>&#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x438; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;&#x445; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x43D;&#x430;&#x447;&#x430;&#x43B; &#x441; &#x434;&#x435;&#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; DI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x432; &#x438; &#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432; <code>IFormFile</code>.</p><p>&#x414;&#x430;&#x43B;&#x435;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>BindAsync</code>, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x420;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x438;&#x439; <code>RequestDelegate</code>, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x44D;&#x442;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445;, &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x43D;&#x435; <code>CreateArgument()</code>, &#x43D;&#x43E; &#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x435;&#x433;&#x43E; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B;.</p><p>&#x41A;&#x43E;&#x434; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445; <code>Func&lt;&gt;</code>. &#x42D;&#x442;&#x43E; &#x431;&#x43B;&#x438;&#x436;&#x435; &#x43A; &quot;&#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C;&#x443;&quot; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44E; &#x441;&#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>, &#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;!</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>: &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; minimal API &#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;.</p><p>&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-5-generating-argument-expressions-for-minimal-apis-continuted/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Генерация выражений аргументов для minimal API]]></title><description><![CDATA[<p>&#x42D;&#x442;&#x430; &#x447;&#x435;&#x442;&#x432;&#x435;&#x440;&#x442;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; <a href="https://zznob.ru/izuchieniie-loghiki-priviazki-modieli-minimal-api/">&#x43F;</a></p>]]></description><link>https://zznob.ru/gienieratsiia-vyrazhienii-arghumientov-dlia-minimal-api/</link><guid isPermaLink="false">641fc87b170f3a000101882f</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 26 Mar 2023 06:37:20 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1622228862437-aa0316bb3b93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDV8fEdlbmVyYXRlfGVufDB8fHx8MTY3OTgwOTg3NQ&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1622228862437-aa0316bb3b93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDV8fEdlbmVyYXRlfGVufDB8fHx8MTY3OTgwOTg3NQ&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x434;&#x43B;&#x44F; minimal API"><p>&#x42D;&#x442;&#x430; &#x447;&#x435;&#x442;&#x432;&#x435;&#x440;&#x442;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; <a href="https://zznob.ru/izuchieniie-loghiki-priviazki-modieli-minimal-api/">&#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;</a> &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code> &#x438; &#x443;&#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x432; minimal API, &#x432;&#x44B;&#x431;&#x438;&#x440;&#x430;&#x44F; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x451;.</p><p>&#x41C;&#x44B; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B;&#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; <code>Expression</code> &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x43C;&#x44B; &#x43F;&#x43E;&#x433;&#x440;&#x443;&#x437;&#x438;&#x43C;&#x441;&#x44F; &#x432; &#x43D;&#x435;&#x451; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43D;&#x430; (&#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x439;) &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; <code>CreateArgument()</code>.</p><h2 id="%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9-%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-requestdelegatefactorycreateargument">&#x41A;&#x440;&#x430;&#x442;&#x43A;&#x438;&#x439; &#x43E;&#x431;&#x437;&#x43E;&#x440; RequestDelegateFactory.CreateArgument().</h2><p>&#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x43D;&#x430;&#x438;&#x431;&#x43E;&#x43B;&#x435;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x43C;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x438; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x44B;, &#x443;&#x447;&#x430;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x432; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432;, &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; ASP.Net Core &#x432; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x441;&#x442;&#x432;&#x438;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;:</p><ul><li><code>RouteEndpointDataSource</code> - &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442; &quot;&#x441;&#x44B;&#x440;&#x443;&#x44E;&quot; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x43C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; ( <code>delegate</code> &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, <code>RoutePattern</code> &#x438; &#x442;. &#x434;.), &#x438;&#x43D;&#x438;&#x446;&#x438;&#x438;&#x440;&#x443;&#x435;&#x442; &#x438;&#x445; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x443; &#x432; <code>RequestDelegate</code> &#x438; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</li><li><code>RequestDelegateFactory.InferMetadata()</code>- &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x431; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x437;&#x430; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; <code>Expression</code> &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x441;&#x442;&#x432;&#x438;&#x438; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>.</li><li><code>RequestDelegateFactory.Create()</code>- &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; ASP.NET Core &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x443;&#x442;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438; <code>Expression</code> &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</li></ul><p>&#x414;&#x43E; &#x441;&#x438;&#x445; &#x43F;&#x43E;&#x440; &#x43C;&#x44B; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>InferMetadata()</code>, &#x430; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x43D;&#x430; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;: <code>CreateArgument()</code>. <code>CreateArgument()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x435;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>HttpContext httpContext</code>.</p><p>&#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x44F;&#x449;&#x438;&#x439; &#x442;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">app.MapGet(&quot;/{id}&quot;, (string id, HttpRequest request, ISomeService service) =&gt; {});</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, ASP.NET Core &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;: &#x42F; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x438;&#x43B; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#xA0;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; <code>CreateArgument()</code> &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x1F448;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    // &#x420;&#x430;&#x437;&#x431;&#x43E;&#x440; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; `id` &#x438;&#x437; RouteValues
    bool wasParamCheckFailure = false;
    
    string id_local = httpContext.Request.RouteValues[&quot;id&quot;];  // &#x1F448;
    if (id_local == null)                                     // &#x1F448;
    {                                                         // &#x1F448;
        wasParamCheckFailure = true;                          // &#x1F448;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;id&quot;, &quot;route&quot;);  // &#x1F448;
    }                                                         // &#x1F448;

    if(wasParamCheckFailure)
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }
     
    // handler &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.
    // &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; HttpRequest &#x431;&#x44B;&#x43B; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D; &#x438;&#x437; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; HttpContext.
    // &#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; ISomeService &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D; &#x438;&#x437; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; DI
    string text = handler.Invoke(
        id_local,                                                      // &#x1F448;
        httpContext.Request,                                           // &#x1F448;
        httpContext.RequestServices.GetRequiredService&lt;ISomeService&gt;() // &#x1F448;
    ); 

    // &#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x438; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C;
    httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
    return httpContext.Response.WriteAsync(text);
}</code></pre><p>&#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430; (&#x445;&#x43E;&#x442;&#x44F; &#x438; &#x43D;&#x435; &#x432;&#x435;&#x441;&#x44C;) &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; <code>CreateArgument()</code> &#x43A;&#x430;&#x43A; &#x434;&#x435;&#x440;&#x435;&#x432;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;. &#x412; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x43E;&#x43D; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43A;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x430;&#x44E;&#x449;&#x435;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; <code>httpContext</code>, &#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; (&#x43D;&#x435; <code>null</code>).</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x43A;&#x43E;&#x434;, &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;), &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x442; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x438; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x435;&#x433;&#x43E; &#x43E;&#x431;&#x43D;&#x443;&#x43B;&#x435;&#x43D;&#x438;&#x44F;.</p><h2 id="%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9">&#x414;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;.</h2><p>&#x424;&#x443;&#x43D;&#x434;&#x430;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43D;&#x446;&#x435;&#x43F;&#x446;&#x438;&#x44F;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x430;&#x44F; <code>RequestDelegateFactory</code>, &#x2014; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x438; &#x438;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x44F; &#x432; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C;&#x44B;&#x439; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;.</p><blockquote>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x43E; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x432; <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/?ref=zznob.ru">&#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438;</a>. &#x422;&#x430;&#x43C; &#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x435;&#x435; &#x432;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F;&#x43C;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;. &#x41E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x430;&#x43C;&#x44B;&#x445; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x445; &#x441;&#x43E;&#x432;&#x435;&#x442;&#x43E;&#x432; - &#x43A;&#x430;&#x43A; &#x43E;&#x442;&#x43B;&#x430;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; Visual Studio &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</blockquote><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code> &#x43F;&#x43E;&#x442;&#x435;&#x43D;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;:</p><ul><li>&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44E;&#x449;&#x435;&#x435;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x438;&#x437; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</li><li>&#x41B;&#x44E;&#x431;&#x44B;&#x435; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x438; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;.</li><li>&#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x434;&#x43E;&#x441;&#x442;&#x43E;&#x432;&#x435;&#x440;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;.</li></ul><p>&#x412;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x44B;&#x43C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B;, &#x43D;&#x43E; &#x44F; &#x445;&#x43E;&#x442;&#x435;&#x43B; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x438;&#x445;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x43D;&#x430; &#x442;&#x43E;, &#x447;&#x442;&#x43E; <em><em>nullability</em></em> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x445; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; Expression &#x438; &#x432;&#x43D;&#x43E;&#x441;&#x438;&#x442; &#x441;&#x432;&#x43E;&#x439; &#x432;&#x43A;&#x43B;&#x430;&#x434; &#x432; &#x442;&#x43E;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x438;&#x43B;&#x438; &#x43D;&#x435;&#x442;.</p><p>&#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; :</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string query, int id) =&gt; {})</code></pre><p>&#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; <code>query</code> &#x438; <code>id</code> &#x43D;&#x435; &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x44E;&#x442; <code>null</code> &#x432; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438;. &#x421;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43E;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; <code>query</code> &#x438; <code>id</code> &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x44E;&#x442; <code>null</code> &#x432; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438; &#x438;&#x43B;&#x438; &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string? query, int id = -1) =&gt; {})</code></pre><p>&#x412; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x43E;&#x442;&#x441;&#x43B;&#x435;&#x436;&#x438;&#x432;&#x430;&#x442;&#x44C;, &#x431;&#x44B;&#x43B;&#x438; &#x43B;&#x438; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x41F;&#x430;&#x440;&#x441;&#x438;&#x43D;&#x433; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>int id</code> &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x435;&#x43D; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;. &#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x441;&#x435;&#x431;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C;, &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44F;&#x435;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;!</p><h2 id="%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B4%D0%BB%D1%8F-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D1%85-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2">&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;.</h2><p>&#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;, <code>CreateArgument()</code> &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; <code>[From*]</code>, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C;&#x44B;&#x445; &#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;, &#x43D;&#x43E; &#x44F; &#x43F;&#x43E;&#x43A;&#x430; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x449;&#x443; &#x44D;&#x442;&#x43E;&#x442; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43A; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x43C; &#x442;&#x438;&#x43F;&#x430;&#x43C;.</p><p>&#x41A;&#x430;&#x43A; &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x43B; &#x440;&#x430;&#x43D;&#x435;&#x435;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x438;&#x43D;&#x436;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x43A;&#x430;&#x43A; <code>HttpContext</code> &#x438; <code>CancellationToken</code>, &#x438; &#x43E;&#x43D;&#x438; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43A; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430;&#x43C; <code>HttpContext</code>, &#x438;&#x43D;&#x436;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>. &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x44D;&#x442;&#x438; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E;, &#x44D;&#x442;&#x43E; &#x441;&#x430;&#x43C;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; (&#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x441; &#x43D;&#x438;&#x445; &#x438; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x43C;)!</p><p><code>CreateArgument()</code> &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x446;&#x435;&#x43B;&#x443;&#x44E; &#x43A;&#x443;&#x447;&#x443; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x445; &#x44D;&#x442;&#x438; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;. &#x412; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x44D;&#x442;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; &#x434;&#x43B;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;:</p><pre><code class="language-csharp">static readonly ParameterExpression HttpContextExpr = 
    Expression.Parameter(typeof(HttpContext), &quot;httpContext&quot;);

static readonly MemberExpression HttpRequestExpr = 
    Expression.Property(HttpContextExpr, typeof(HttpContext).GetProperty(nameof(HttpContext.Request))!);</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x434;&#x432;&#x430; &#x442;&#x438;&#x43F;&#x430; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;. &#x41F;&#x435;&#x440;&#x432;&#x43E;&#x435; - <code>ParameterExpression</code>, &#x43E;&#x43D;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x442;&#x438;&#x43F; &#x438; &#x438;&#x43C;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;. &#x412;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x2014; &#x44D;&#x442;&#x43E; <code>MemberExpression</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x443;. &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; <code>HttpContextExpr</code> &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>Expression.Property</code>, &#x44D;&#x442;&#x43E; &#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442;&#x43D;&#x43E; &#x43A;&#x43E;&#x434;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">httpContext.Request</code></pre><p>&#x41D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435;, &#x43F;&#x440;&#x430;&#x432;&#x434;&#x430;? &#x1F604; &#x41D;&#x43E; &#x44D;&#x442;&#x43E; &#x432;&#x441;&#x435;, &#x447;&#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code>CreateArgument()</code> &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;; &#x44D;&#x442;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443; &#x441; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C; <code>HttpRequest</code>. &#x422;&#x43E; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x435; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x441;&#x44F; &#x438; &#x43A; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x443; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x445; &quot;&#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x445;&quot; &#x442;&#x438;&#x43F;&#x43E;&#x432;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x44D;&#x442;&#x43E;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (HttpContext c, HttpRequest r, CancellationToken c, Stream s) =&gt; {})</code></pre><p><code>CreateArgument()</code> &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43E;&#x434;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;. &#x41E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C; (&#x433;&#x434;&#x435; handler &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x441;&#x44F; &#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430; &#x432; minimal API):</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext,
        httpContext.Request,
        httpContext.RequestAborted,
        httpContext.Body); 

    return Task.CompletedTask;
}</code></pre><p>&#x414;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x430;&#x43A;&#x43A;&#x443;&#x440;&#x430;&#x442;&#x43D;&#x43E;!</p><p>&#x41A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x43D;&#x435; &#x432;&#x441;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x442;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;. &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x438;, &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43A;&#x43E;&#x435;-&#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;: &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;&#x43C;.</p><h2 id="%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8-%D0%BA-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC-%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B0-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%B8-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC">&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;&#x43C;.</h2><p>&#x41F;&#x440;&#x435;&#x436;&#x434;&#x435; &#x447;&#x435;&#x43C; &#x43C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C;, &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x430;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x441;&#x442;&#x44C; &#x437;&#x430;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x43C;&#x443; &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x449;&#x435;&#x433;&#x43E;:</p><ul><li>&#x412;&#x441;&#x435; &#x43E;&#x43D;&#x438; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x44B; &#x434;&#x43B;&#x44F; <code>HttpRequest</code>: <code>HttpRequest.RouteValues</code>, <code>HttpRequest.Query</code> &#x438; <code>HttpRequest.Headers</code>.</li><li>&#x412;&#x441;&#x435; &#x43E;&#x43D;&#x438; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x432; &#x432;&#x438;&#x434;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x43E;&#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x430;&#x442;&#x43E;&#x440;&#x430; ( <code>Item</code>), &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43A;&#x43B;&#x44E;&#x447; &#x432; <code>string</code> .</li><li>&#x41A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x438;&#x437; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x439; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>StringValues</code>.</li></ul><p>&#x418;&#x437;-&#x437;&#x430; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x445;&#x43E;&#x434;&#x441;&#x442;&#x432;&#x430; &#x43A;&#x43E;&#x434; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x432; <code>CreateArgument()</code> &#x432;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43C; &#x43E;&#x434;&#x438;&#x43D;&#x430;&#x43A;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43D;&#x438;&#x445;. &#x41F;&#x43E; &#x44D;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x435; &#x43C;&#x44B; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x43C;&#x441;&#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43A;&#x43E;&#x434;&#x430;, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43D;&#x438;&#x445; - &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43C;&#x44B; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x434;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x449;&#x438;&#x439; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443;, &#x447;&#x435;&#x441;&#x442;&#x43D;&#x43E; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44F;, &#x43E;&#x43D; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x43D;.</p><p>&#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x438;&#x43C; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;: &#x42F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x438; &#x43C;&#x44B; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43D;&#x430; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434;, &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x433;&#x43E;. &#x417;&#x430;&#x442;&#x435;&#x43C; &#x43C;&#x44B; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x434;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x435;&#x433;&#x43E; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; <code>nullable</code> &#x438;&#x43B;&#x438; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x43C; &#x442;&#x438;&#x43F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;) &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x434;. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x438;&#x442; &#x43D;&#x430;&#x43C; &#x438;&#x437;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x435; &#x443;&#x432;&#x44F;&#x437;&#x430;&#x44F; &#x432; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430;&#x445; &#x43F;&#x440;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x44C; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; (&#x43D;&#x43E; &#x432;&#x44B;, &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L640">&#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x439; &#x442;&#x435;&#x43A;&#x441;&#x442;</a>, &#x435;&#x441;&#x43B;&#x438; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435;)!</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0-%D0%BA-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</h2><p>&#x41C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x441; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x43E; &#x436;&#x435;&#x43B;&#x430;&#x43D;&#x438;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string? q) =&gt; {});</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435;&#x441;&#x44C; &#x43A; &#x441;&#x445;&#x435;&#x43C;&#x435; &#x438;&#x437; &#x43C;&#x43E;&#x435;&#x439; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438;, &#x442;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; <code>CreateArgument()</code> &#x440;&#x435;&#x448;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; (&#x430; &#x43D;&#x435; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x442;&#x430;&#x43A;&#x43E;&#x432;&#x44B;&#x445; &#x43D;&#x435; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442;). &#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; (&#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43D;&#x430; <code>null</code>) &#x438; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; (&#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;), &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x438;&#x440;&#x443;&#x44E;&#x449;&#x438;&#x439; <code>RequestDelegate</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.Request.Query[&quot;q&quot;] != null 
            ? httpContext.Request.Query[&quot;q&quot;]
            : (string) null); 

    return Task.CompletedTask;
}</code></pre><p>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x435; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438;, &#x447;&#x442;&#x43E; &#x443;&#x43F;&#x440;&#x43E;&#x449;&#x430;&#x435;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x441; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C;&#x438; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x440;&#x438;&#x44F;&#x43C;&#x438;, &#x43D;&#x43E; &#x432; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43D;&#x435; &#x442;&#x430;&#x43A; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x442;&#x435;&#x43C; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x44F;, &#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x434;&#x432;&#x438;&#x433;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0-%D1%81%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;.</h2><p>&#x414;&#x43B;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x440;&#x438;&#x44F; &#x43C;&#x44B; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435; &#x431;&#x44B;&#x43B; <code>nullable</code>, &#x438; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x434;&#x430;&#x434;&#x438;&#x43C; &#x435;&#x43C;&#x443; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;. &#x41B;&#x44F;&#x43C;&#x431;&#x434;&#x44B; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x44E;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x445;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x434;&#x43B;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; &#x43C;&#x44B; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x43C; &#x438;&#x445; &#x432; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;, &#x43D;&#x43E; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x433;&#x43E; &#x432;&#x43B;&#x438;&#x44F;&#x43D;&#x438;&#x44F; &#x43D;&#x430; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, Handler);
void Handler(string q = &quot;N/A&quot;) { }</code></pre><p>&#x41A;&#x430;&#x43A; &#x436;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43B;&#x438;&#x44F;&#x435;&#x442; &#x43D;&#x430; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434;? &#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x43D;&#x438;&#x436;&#x435;, &#x43E;&#x43D; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;! &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43A; <code>null</code> &#x43C;&#x44B; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;, &#x43A;&#x430;&#x43A; &#x438; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43B;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    handler.Invoke(
        httpContext.Request.Query[&quot;q&quot;] != null 
            ? httpContext.Request.Query[&quot;q&quot;]
            : (string) &quot;N/A&quot;); // &#x1F448; &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; `null`.

    return Task.CompletedTask;
}</code></pre><p>&#x418;&#x442;&#x430;&#x43A;, &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;, &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x43A; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;.</h2><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x432;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x43C;&#x443; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443;, &#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>string</code> &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; <code>string?</code> :</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (string q) =&gt; {});</code></pre><p>&#x41F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;, &#x43C;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x443;&#x431;&#x435;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x43E;&#x43D; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;, &#x438; &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x437;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; &#x432; &#x436;&#x443;&#x440;&#x43D;&#x430;&#x43B;. &#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; <code>CreateArgument()</code> &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x442;&#x440;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x435; &#x438;&#x437; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E; &#x43D;&#x438;&#x436;&#x435;.</p><p>&#x412;&#x43E;-&#x43F;&#x435;&#x440;&#x432;&#x44B;&#x445;, &#x43C;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x442;&#x438;&#x43F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; ( <code>string</code>) &#x438; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x430; &#x432; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x438; &#x441; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x43C;:</p><pre><code class="language-csharp">string q_local;</code></pre><p>&#x414;&#x430;&#x43B;&#x435;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x43D;&#x430; <code>null</code>, &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; <code>wasParamCheckFailure</code> &#x438; &#x43F;&#x440;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; &#x432; &#x436;&#x443;&#x440;&#x43D;&#x430;&#x43B;:</p><pre><code class="language-csharp">q_local = httpContext.Request.RouteValues[&quot;q&quot;]
if (q_local == null)
{
     wasParamCheckFailure = true;
     Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;q&quot;, &quot;query&quot;);
}</code></pre><p>&#x418;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>wasParamCheckFailure</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x437;&#x436;&#x435;, &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>RequestDelegateFactory.Create()</code>, &#x430; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L2281-L2290"><code>Log</code> &#x437;&#x434;&#x435;&#x441;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x430;&#x43C;&#x43E;&#x439; <code>RequestDelegateFactory</code>.</a></p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; -&#x2014; &#x44D;&#x442;&#x43E; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; <code>q_local</code> .</p><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x438; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x438;&#x442;&#x44C; &#x441; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x44F;&#x43C;&#x438;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;&#x438; <code>RequestDelegateFactory.Create()</code>, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x441;&#x44F; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    bool wasParamCheckFailure = false; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; RequestDelegateFactory.Create()
    string q_local;

    q_local = httpContext.Request.RouteValues[&quot;q&quot;]
    if (q_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;q&quot;, &quot;query&quot;);
    }

    if(wasParamCheckFailure) // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x441;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;! &#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x435;&#x449;&#x435; &#x43E;&#x434;&#x438;&#x43D; &#x443;&#x440;&#x43E;&#x432;&#x435;&#x43D;&#x44C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x438; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x447;&#x435;&#x43C;&#x443;-&#x43B;&#x438;&#x431;&#x43E;, &#x43A;&#x440;&#x43E;&#x43C;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;, &#x433;&#x434;&#x435; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <code>TryParse</code> &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0-int-%D0%BA-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; int &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</h2><p>&#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43D;&#x430;&#x437;&#x430;&#x434; &#x43A; &#x43D;&#x430;&#x448;&#x435;&#x43C;&#x443; &#x438;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C;&#x443; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x443; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43C;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>int</code> &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. </p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (int? q) =&gt; {});</code></pre><p>&#x41F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434; &#x43E;&#x442; <code>string?</code> &#x43A; <code>int?</code> &#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x435; &#x432;&#x43B;&#x438;&#x44F;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x43A;&#x43E;&#x434;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x435;&#x43C;&#x443; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x443;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C;:</p><ul><li>&#x420;&#x430;&#x431;&#x43E;&#x442;&#x430; &#x441; nullable &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438;. Nullable &#x442;&#x438;&#x43F;&#x44B; &#x2014; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, <a href="https://github.com/DataDog/dd-trace-dotnet/blob/a8abc21d58ea9d91bc0b5b2ba5f9d265f97e41d9/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcNetClient/GrpcCallFinishCallPre243Integration.cs?ref=zznob.ru#L48-L49">&#x43F;&#x43E;&#x432;&#x435;&#x440;&#x44C;&#x442;&#x435; &#x43C;&#x43D;&#x435;</a> &#x1F605;</li><li>&#x41F;&#x430;&#x440;&#x441;&#x438;&#x43D;&#x433; <code>string</code> &#x432; <code>int</code> &#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A;</li><li>&#x412;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x43C;&#x435;&#x436;&#x443;&#x442;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;</li></ul><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x438; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x438;&#x442;&#x44C; &#x441; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x43E;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; <code>RequestDelegateFactory.Create()</code>, &#x442;&#x43E; &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x441;&#x44F; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string tempSourceString; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; RequestDelegateFactory.Create()
    bool wasParamCheckFailure = false; // Added by RequestDelegateFactory.Create()
    int? q_local;

    tempSourceString = httpContext.Request.RouteValues[&quot;q&quot;]
    if (tempSourceString != null)
    {
        if (int.TryParse(tempSourceString, out int parsedValue))
        {
            q_local = (int?)parsedValue;
        }
        else
        {
            wasParamCheckFailure = true;
            Log.ParameterBindingFailed(httpContext, &quot;Int32&quot;, &quot;q&quot;, tempSourceString)
        }
    }

    if(wasParamCheckFailure) // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><p>&#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BD%D0%B5%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0-int-%D1%81%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; int &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;.</h2><p>&#x41A;&#x430;&#x43A; &#x438; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x441;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x439;, &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x435;&#x43C; &#x43A; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44E; &#x43D;&#x435;&#x43D;&#x443;&#x43B;&#x435;&#x432;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, Handler);
void Handler(int q = 42) { }</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code> &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436; &#x43D;&#x430; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;. &#x415;&#x441;&#x442;&#x44C; &#x442;&#x440;&#x438; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x445; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x44F;:</p><ul><li>&#x41A;&#x430;&#x43A; &#x438; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43B;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C;, &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>int</code>, &#x430; &#x43D;&#x435; <code>int?</code></li><li>&#x41C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x43E;&#x438;&#x442;&#x44C; <code>q_local</code> &#x432; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; <code>TryParse</code>, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x44D;&#x442;&#x43E; <code>int</code>, &#x430; &#x43D;&#x435; <code>int?</code>. &#x42D;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x43D;&#x432;&#x435;&#x440;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x435; <code>if</code>, &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x432; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44E;</li><li>&#x41C;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; <code>else</code> &#x434;&#x43B;&#x44F; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; <code>tempSourceString</code> &#x440;&#x430;&#x432;&#x435;&#x43D; <code>null</code>, &#x438; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x430;&#x438;&#x432;&#x430;&#x435;&#x43C; <code>q_local</code> &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;.</li></ul><p><code>RequestDelegate</code> &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string tempSourceString; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; RequestDelegateFactory.Create()
    bool wasParamCheckFailure = false; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437;  RequestDelegateFactory.Create()
    int q_local; // &#x1F448; int &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; int?

    tempSourceString = httpContext.Request.RouteValues[&quot;q&quot;]
    if (tempSourceString != null)
    {
        // &#x417;&#x434;&#x435;&#x441;&#x44C; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x441;&#x432;&#x43E;&#x438;&#x442;&#x44C; q_local &#x1F447;
        if (!int.TryParse(tempSourceString, out q_local)) // &#x1F448; &#x447;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x43D;&#x432;&#x435;&#x440;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; if
        {
            wasParamCheckFailure = true;
            Log.ParameterBindingFailed(httpContext, &quot;Int32&quot;, &quot;q&quot;, tempSourceString)
        }
    }
    else
    {
        q_local = 42; // &#x1F448; &#x41F;&#x440;&#x438;&#x441;&#x432;&#x43E;&#x438;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;, &#x435;&#x441;&#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442;
    }

    if(wasParamCheckFailure) // Added by RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><p>&#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x442;&#x44B; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x44D;&#x43A;&#x432;&#x438;&#x432;&#x430;&#x43B;&#x435;&#x43D;&#x442;&#x43D;&#x44B;&#x439; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;, &#x433;&#x434;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0-int">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; int</h2><p>&#x412; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>int</code>:</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, (int q) =&gt; {});</code></pre><p>&#x421;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x434; &#x434;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F; &#x43F;&#x43E;&#x445;&#x43E;&#x436; &#x43D;&#x430; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x443;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E;, &#x433;&#x434;&#x435; &#x443; &#x43D;&#x430;&#x441; &#x431;&#x44B;&#x43B;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;, &#x441; &#x434;&#x432;&#x443;&#x43C;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438;:</p><ul><li>&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x435;&#x434;&#x432;&#x430;&#x440;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43D;&#x43E;&#x435; &#x438;&#x437; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x430;, &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x443;&#x43B;&#x435;&#x432;&#x44B;&#x43C;.</li><li>&#x41E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; <code>else</code> &#xA0;&#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;</li></ul><p>&#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; <code>RequestDelegate</code> &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string tempSourceString; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    bool wasParamCheckFailure = false; // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    int q_local;

    tempSourceString = httpContext.Request.RouteValues[&quot;q&quot;]
    
    if (tempSourceString == null) // &#x1F448; &#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430;
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;Int32&quot;, &quot;q&quot;);
    }
    
    if (tempSourceString != null)
    {
        if (!int.TryParse(tempSourceString, out q_local))
        {
            wasParamCheckFailure = true;
            Log.ParameterBindingFailed(httpContext, &quot;Int32&quot;, &quot;q&quot;, tempSourceString)
        }
    } // &#x1F448; &#x422;&#x443;&#x442; &#x43D;&#x435;&#x442; else &#x431;&#x43B;&#x43E;&#x43A;&#x430;

    if(wasParamCheckFailure) // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x438;&#x437; RequestDelegateFactory.Create()
    {
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }

    handler.Invoke(q_local); 

    return Task.CompletedTask;
}</code></pre><p>&#x41D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F;:</p><ul><li>&#x418;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; <code>HttpContext</code> &#x438; <code>HttpRequest</code></li><li>&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; <code>string</code> &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;&#x43C;.</li><li>&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; <code>TryParse()</code> (&#x43D;&#x430; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435;, <code>int</code>) &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;&#x43C;.</li></ul><p>&#x41E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x43E;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43B;&#x438;&#x448;&#x44C; &#x43D;&#x435;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x435; &#x447;&#x438;&#x441;&#x43B;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F;, &#x43D;&#x43E; &#x44D;&#x442;&#x430; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x443;&#x436;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x434;&#x43B;&#x438;&#x43D;&#x43D;&#x43E;&#x439;. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x438;&#x43C; &#x441; &#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x441;&#x442;&#x430;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x438;&#x441;&#x44C;, &#x438; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x448;&#x438;&#x43C;&#x441;&#x44F; &#x442;&#x438;&#x43F;&#x430;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.CreateArgument()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; minimal API &#x43A; <code>HttpContext</code>. <code>RequestDelegateFactory.Create()</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x44D;&#x442;&#x438; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; ASP.NET Core &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;. &#x42F; &#x43D;&#x430;&#x447;&#x430;&#x43B; &#x441; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; <code>HttpRequest</code> &#x438; <code>CancellationToken</code>, &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x44E;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x438;&#x435; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x441;&#x43E; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430;&#x43C;&#x438; <code>HttpContext</code>. &#x42D;&#x442;&#x43E; &#x441;&#x430;&#x43C;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x438;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D;&#x438; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x44E;&#x442; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;.</p><p>&#x414;&#x430;&#x43B;&#x435;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x438; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;. &#x412;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; (string?) &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x431;&#x44B;&#x43B;&#x438; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C;&#x438;, &#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; (string) &#x43C;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x430;&#x43B;&#x438;&#x434;&#x430;&#x446;&#x438;&#x44F;.</p><p>&#x413;&#x43E;&#x440;&#x430;&#x437;&#x434;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x431;&#x44B;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x43D;&#x44B; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; <code>int</code>. &#x41D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x43B;&#x438; &#x432;&#x44B; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x438;&#x43B;&#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43E;&#x43D;&#x438; &#x442;&#x440;&#x435;&#x431;&#x443;&#x44E;&#x442; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x435;&#x43F;&#x435;&#x43D;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435;&#x43C;&#x443; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x443; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430; &#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438;. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x438;&#x43C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x445; &#x432; <code>CreateArgument()</code> &#x434;&#x43B;&#x44F; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;.</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-4-generating-argument-expressions-for-minimal-apis/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Изучение логики привязки модели minimal API]]></title><description><![CDATA[<p>&#x42D;&#x442;&#x430; &#x442;&#x440;&#x435;&#x442;&#x44C;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; &#x43F;&#x440;&#x435;&#x434;</p>]]></description><link>https://zznob.ru/izuchieniie-loghiki-priviazki-modieli-minimal-api/</link><guid isPermaLink="false">640e0b7ef07f800001bbf77d</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Tue, 21 Mar 2023 14:03:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1452888546723-9bbd4e131e33?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHRpZSUyMGElMjBrbm90fGVufDB8fHx8MTY3ODY0MjE0MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1452888546723-9bbd4e131e33?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHRpZSUyMGElMjBrbm90fGVufDB8fHx8MTY3ODY0MjE0MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x418;&#x437;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; minimal API"><p>&#x42D;&#x442;&#x430; &#x442;&#x440;&#x435;&#x442;&#x44C;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.InferMetadata()</code> &#x438; &#x442;&#x43E;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x431; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; minimal API. &#x412; &#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x439; &#x448;&#x430;&#x433; &#x2014; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.CreateArgument()</code>. &#x421;&#x435;&#x433;&#x43E;&#x434;&#x43D;&#x44F; &#x43C;&#x44B; &#x438;&#x441;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x43C; &#x43A;&#x43E;&#x434; &#x432; <code>CreateArgument()</code> &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x444;&#x443;&#x43D;&#x434;&#x430;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x432; minimal API.</p><h2 id="%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9-%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-requestdelegatefactory">&#x41A;&#x440;&#x430;&#x442;&#x43A;&#x438;&#x439; &#x43E;&#x431;&#x437;&#x43E;&#x440; RequestDelegateFactory</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x435; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x44B; &#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x443;&#x447;&#x430;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x431; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; &#x438;, &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435;, &#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; ASP.NET Core:</p><ul><li><code>RouteEndpointDataSource</code>&#x2014;&#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x435;&#x442; &#xAB;&#x43D;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43D;&#x43D;&#x44B;&#x435;&#xBB; &#x441;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x43E; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x43C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; (&#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, <code>RoutePattern</code> &#x438; &#x442;. &#x434;.) &#x438; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x438;&#x440;&#x443;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; &#x432; <code>RequestDelegate</code> &#x438; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x445; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</li><li><code>RequestDelegateFactory.InferMetadata()</code>&#x2014;&#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x431; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x445; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x437;&#x430; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; (<code>Expression</code>) &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x441;&#x442;&#x432;&#x438;&#x438; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>.</li><li><code>RequestDelegateFactory.Create()</code>&#x2014;&#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; ASP.NET Core &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43F;&#x443;&#x442;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438; <code>Expression</code> &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</li></ul><p>&#x414;&#x43E; &#x441;&#x438;&#x445; &#x43F;&#x43E;&#x440; &#x43C;&#x44B; &#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43D;&#x430; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; <code>InferMetadata()</code>, &#x430; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x43D;&#x430; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;: <code>CreateArgument()</code>. &#x41D;&#x430;&#x43F;&#x43E;&#x43C;&#x43D;&#x44E;, &#x432;&#x43E;&#x442; &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; <code>InferMetadata()</code>:</p><pre><code class="language-csharp">public static RequestDelegateMetadataResult InferMetadata(
    MethodInfo methodInfo, RequestDelegateFactoryOptions? options = null)
{
    var factoryContext = CreateFactoryContext(options);
    factoryContext.ArgumentExpressions = 
        CreateArgumentsAndInferMetadata(methodInfo, factoryContext);

    return new RequestDelegateMetadataResult
    {
        EndpointMetadata = AsReadOnlyList(factoryContext.EndpointBuilder.Metadata),
    };
}</code></pre><p><code>CreateArgumentsAndInferMetadata()</code>, &#x432; &#x441;&#x432;&#x43E;&#x44E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x44C;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>CreateArguments()</code>, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x43A;&#x430;&#x43A; ParameterInfo[]:</p><pre><code class="language-csharp">private static Expression[] CreateArgumentsAndInferMetadata(
    MethodInfo methodInfo, RequestDelegateFactoryContext factoryContext)
{
    var args = CreateArguments(methodInfo.GetParameters(), factoryContext);
    // ...
    return args;
}</code></pre><p>&#x418; <code>CreateArguments()</code> &#x432; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>CreateArgument()</code> &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; <code>ParameterInfo</code>:</p><pre><code class="language-csharp">private static Expression[] CreateArguments(
    ParameterInfo[]? parameters, RequestDelegateFactoryContext factoryContext)
{
    // ...
    var args = new Expression[parameters.Length];

    for (var i = 0; i &lt; parameters.Length; i++)
    {
        args[i] = CreateArgument(parameters[i], factoryContext); // &#x1F448;
    }
    // ...
    return args;
}</code></pre><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x443; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>CreateArgument()</code>.</p><h2 id="%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8-createargument">&#x41E;&#x431;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; CreateArgument</h2><p>&#x418;&#x441;&#x445;&#x43E;&#x434;&#x44F; &#x438;&#x437; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x438; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x44B;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x443;&#x43C;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; <code>CreateArgument</code> &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;, &#x438; &#x432; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x441;&#x43C;&#x44B;&#x441;&#x43B;&#x435; &#x442;&#x430;&#x43A; &#x43E;&#x43D;&#x43E; &#x438; &#x435;&#x441;&#x442;&#x44C;: &#x43E;&#x43D; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; (<code>Expression</code>), &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x432; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F; &#x43A; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; httpContext HttpContext.</p><p>&#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">app.MapGet(&quot;/{id}&quot;, (string id, HttpRequest request, ISomeService service) =&gt; {});</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, ASP.NET Core &#x432; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;&#x43C; &#x438;&#x442;&#x43E;&#x433;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    // &#x420;&#x430;&#x437;&#x431;&#x43E;&#x440; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; `id` &#x438;&#x437; RouteValues
    bool wasParamCheckFailure = false;
    
    string id_local = httpContext.RouteValues[&quot;id&quot;];
    if (id_local == null)
    {
        wasParamCheckFailure = true;
        Log.RequiredParameterNotProvided(httpContext, &quot;string&quot;, &quot;id&quot;, &quot;route&quot;);
    }

    if(wasParamCheckFailure)
    {
        // &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x43B;&#x430;&#x441;&#x44C;, &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; &#x43A;&#x43E;&#x434; 400
        httpContext.Response.StatusCode = 400;
        return Task.CompletedTask;
    }
     
    // handler, &#x44D;&#x442;&#x43E; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43B;&#x44F;&#x43C;&#x431;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.
    // &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; HttpRequest &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; HttpContext
    // &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; ISomeService &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x437; DI &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;
    string text = handler.Invoke(
        id_local,
        httpContext.Request,
        httpContext.RequestServices.GetRequiredService&lt;ISomeService&gt;());

    // &#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x438; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C;.
    httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
    return httpContext.Response.WriteAsync(text);
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;! &#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x435;&#x433;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x44C; (&#x445;&#x43E;&#x442;&#x44F; &#x438; &#x43D;&#x435; &#x432;&#x441;&#x44F;) &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; <code>CreateArgument()</code> &#x432; &#x432;&#x438;&#x434;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x430; <code>Expression</code>. &#x418;&#x437; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x443;&#x447;&#x430;&#x441;&#x442;&#x43A;&#x430; &#x43A;&#x43E;&#x434;&#x430; &#x432;&#x438;&#x434;&#x43D;&#x43E;, &#x447;&#x442;&#x43E; <code>CreateArgument()</code> &#x43A;&#x43E;&#x441;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;:</p><ul><li>&#x41E;&#x43D; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43E;&#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x435;&#x439;. &#x422;&#x43E;&#x442; &#x444;&#x430;&#x43A;&#x442;, &#x447;&#x442;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; id &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x443; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x430; &#x43D;&#x435; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>CreateArgument()</code>.</li><li>&#x41E;&#x43D; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438; &#x43D;&#x435;&#x443;&#x434;&#x430;&#x447;&#x43D;&#x43E;&#x43C; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x435;&#x439;. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x438; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438; &#x438;&#x445; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440;&#x435;.</li></ul><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x438;&#x43C;&#x441;&#x44F; &#x43D;&#x430; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439; &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x435;&#x439;, &#x440;&#x430;&#x437;&#x431;&#x435;&#x440;&#x435;&#x43C; &#x43A;&#x430;&#x43A; &#x43A;&#x43E;&#x434; &#x432; <code>CreateArgument()</code> &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; minimal API.</p><blockquote>&#x417;&#x434;&#x435;&#x441;&#x44C; &#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x438;&#x445; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; <code>CreateArgument</code> &#x432;&#x44B;&#x431;&#x438;&#x440;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A;&#x43E;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;.</blockquote><h2 id="%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0-%D0%BE%D1%82-%D0%BD%D0%B5%D0%B4%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D1%85-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-createargument">&#x417;&#x430;&#x449;&#x438;&#x442;&#x430; &#x43E;&#x442; &#x43D;&#x435;&#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x445; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x432; CreateArgument().</h2><p>&#x41A;&#x430;&#x43A; &#x438; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43B;&#x43E; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x442;&#x44C;, &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x435;, &#x447;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; <code>CreateArgument()</code>, &#x2014; &#x44D;&#x442;&#x43E; &#x437;&#x430;&#x449;&#x438;&#x449;&#x430;&#x435;&#x442; &#x43E;&#x442; &#x43D;&#x435;&#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x445; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;. &#x41E;&#x43D; &#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; 2 &#x432;&#x435;&#x449;&#x438;:</p><ul><li>&#x423; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x435;&#x441;&#x442;&#x44C; &#x438;&#x43C;&#x44F; (<code>ParameterInfo.Name is not null</code>). &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x438;&#x43C;&#x44F; &#x432; &#x432;&#x430;&#x448;&#x438;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&#x445;, <a href="https://github.com/dotnet/runtime/issues/73188?ref=zznob.ru#issuecomment-1201715264">&#x43D;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x442;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B; &#x432; IL</a>.</li><li>&#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440;&#x44B; <code>in</code>, <code>out</code>, &#x438;&#x43B;&#x438; <code>ref</code>. &#x41E;&#x43D;&#x438; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432; minimal API.</li></ul><p>&#x412; &#x43E;&#x431;&#x43E;&#x438;&#x445; &#x44D;&#x442;&#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; <code>CreateArgument()</code> &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x44F; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x424;&#x440;&#x430;&#x433;&#x43C;&#x435;&#x43D;&#x442; &#x43D;&#x438;&#x436;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A; <code>CreateArgument()</code> &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438;:</p><pre><code class="language-csharp">private static Expression CreateArgument(
    ParameterInfo parameter, RequestDelegateFactoryContext factoryContext)
{
    if (parameter.Name is null)
    {
        throw new InvalidOperationException(
            $&quot;&#x41E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x442;&#x438;&#x43F;&#x430; &apos;{parameter.ParameterType}&apos; &#x431;&#x435;&#x437; &#x438;&#x43C;&#x435;&#x43D;&#x438;. &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x438;&#x43C;&#x44F;.&quot;);
    }

    if (parameter.ParameterType.IsByRef)
    {
        var attribute = &quot;ref&quot;;

        if (parameter.Attributes.HasFlag(ParameterAttributes.In))
        {
            attribute = &quot;in&quot;;
        }
        else if (parameter.Attributes.HasFlag(ParameterAttributes.Out))
        {
            attribute = &quot;out&quot;;
        }

        throw new NotSupportedException(
            $&quot;&#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43F;&#x43E; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435; &apos;{attribute} {TypeNameHelper.GetTypeDisplayName(parameter.ParameterType, fullName: false)} {parameter.Name}&apos; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;.&quot;);
    }
 
    // ..
}</code></pre><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x44D;&#x442;&#x438; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43F;&#x440;&#x43E;&#x439;&#x434;&#x435;&#x43D;&#x44B;, &#x43C;&#x44B; &#x43E;&#x441;&#x442;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x441; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>CreateArgument()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439;, &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x433;&#x438;&#x433;&#x430;&#x43D;&#x442;&#x441;&#x43A;&#x438;&#x439; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440; if...else if! &#x418;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x43E;&#x43D; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x43E;&#x440;&#x438;&#x442;&#x435;&#x442;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x432; minimal API.</p><h2 id="%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D0%B0-%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8-%D0%B2-minimal-api">&#x41F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x438;&#x43E;&#x440;&#x438;&#x442;&#x435;&#x442;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x432; minimal API.</h2><p>&#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x442;&#x43E;&#x433;&#x43E; &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L665-L826">&#x432;&#x441;&#x435; 150(!)</a> &#x441;&#x442;&#x440;&#x43E;&#x43A; if`&#x43E;&#x432;, &#x43C;&#x44B; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x441; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x445; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; <code>CreateArgument()</code>, &#x432; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435; &#x43F;&#x440;&#x438;&#x43E;&#x440;&#x438;&#x442;&#x435;&#x442;&#x430;:</p><ol><li>&#x418;&#x43C;&#x435;&#x435;&#x442; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; [From*]? &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x43A; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x43C;&#x443; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x443;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; [FromHeader], &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;.</li><li>&#x42F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &quot;&#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x43C;&quot; &#x442;&#x438;&#x43F;&#x43E;&#x43C;, &#x442;&#x430;&#x43A;&#x438;&#x43C; &#x43A;&#x430;&#x43A; <code>HttpContext</code> &#x438;&#x43B;&#x438; <code>HttpRequest</code>? &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x442;&#x438;&#x43F; &#x438;&#x437; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</li><li>&#x415;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x443; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <a href="https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis?ref=zznob.ru#bindasync">&#x43C;&#x435;&#x442;&#x43E;&#x434; <code>BindAsync()</code></a>? &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;.</li><li>&#x42F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x439;, &#x438;&#x43B;&#x438; &#x443; &#x43D;&#x435;&#x433;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>TryParse</code> (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; int &#x438; Guid, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x44B;). &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;: - <em>&#x411;&#x44B;&#x43B;&#x438; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x43D;&#x44B; &#x438;&#x437; <code>RoutePattern</code>? (&#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x435;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;? &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x438;&#x437; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;. &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x435;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.) -&#x415;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x43D;&#x435; &#x431;&#x44B;&#x43B;&#x438; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x43D;&#x44B; &#x438;&#x437; <code>RoutePattern</code>, &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x431;&#x443;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x443; <code>RouteValues</code>, &#x438;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43D;&#x435; &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D;, &#x432;&#x435;&#x440;&#x43D;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43D;&#x435;&#x433;&#x43E;.</em></li><li>&#x415;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x430; &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x43C; &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x445; <code>TryParse</code> (&#x438;&#x43B;&#x438; <code>string</code>/`StringValues`), &#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43E;&#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</li><li>&#x42F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <a href="https://andrewlock.net/exploring-dotnet-6-part-10-new-dependency-injection-features-in-dotnet-6/?ref=zznob.ru#detecting-if-a-service-is-registered-in-the-di-container">&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x43C; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x43C; DI</a>? &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x43A; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x435; DI.</li><li>&#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43F;&#x443;&#x442;&#x435;&#x43C; &#x434;&#x435;&#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x432; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x435; JSON.</li></ol><p>&#x425;&#x43E;&#x440;&#x43E;&#x448;&#x43E;... &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x44D;&#x442;&#x43E; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x442;&#x440;&#x443;&#x434;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;. &#x412; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x43B;&#x44C;&#x442;&#x435;&#x440;&#x43D;&#x430;&#x442;&#x438;&#x432;&#x44B; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &quot;if&quot; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x431;&#x43B;&#x43E;&#x43A;-&#x441;&#x445;&#x435;&#x43C;&#x443;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/03/image-2.png" class="kg-image" alt="&#x418;&#x437;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; minimal API" loading="lazy" width="1123" height="1602" srcset="https://zznob.ru/content/images/size/w600/2023/03/image-2.png 600w, https://zznob.ru/content/images/size/w1000/2023/03/image-2.png 1000w, https://zznob.ru/content/images/2023/03/image-2.png 1123w" sizes="(min-width: 720px) 720px"></figure><p>&#x41A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x432;&#x44B;&#x448;&#x435;&#x43F;&#x435;&#x440;&#x435;&#x447;&#x438;&#x441;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x448;&#x430;&#x433;&#x43E;&#x432; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x432; &#x441;&#x435;&#x431;&#x44F; &#x434;&#x430;&#x43B;&#x44C;&#x43D;&#x435;&#x439;&#x448;&#x438;&#x435; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x430;&#x445; &#x44F; &#x43F;&#x440;&#x43E;&#x439;&#x434;&#x443;&#x441;&#x44C; &#x43F;&#x43E; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x43C;&#x443; &#x438;&#x437; &#x43D;&#x438;&#x445; &#x438; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x443; &#x438;&#x445; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435;.</p><blockquote>&#x41E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x430;&#x441;&#x43F;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443; &#x437;&#x430;&#x442;&#x440;&#x430;&#x433;&#x438;&#x432;&#x430;&#x442;&#x44C;, &#x44D;&#x442;&#x43E; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x438; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x44B;&#x431;&#x440;&#x43E;&#x441; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x432; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x42D;&#x442;&#x43E; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x440;&#x435;&#x448;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x430; &#x43D;&#x435; &#x43D;&#x430; &#x44D;&#x442;&#x430;&#x43F;&#x435; &quot;&#x432;&#x44B;&#x431;&#x43E;&#x440;&#x430; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;&quot;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x44B; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x438;&#x43C;&#x441;&#x44F; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;.</blockquote><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-from">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; [From*]</h2><p>&#x41D;&#x430;&#x438;&#x432;&#x44B;&#x441;&#x448;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x43E;&#x440;&#x438;&#x442;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x2014; &#x44D;&#x442;&#x43E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x438;&#x43B;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[From*]</code> &#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x443;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; <code>[FromRoute]</code> &#x438;&#x43B;&#x438; <code>[FromQuery]</code>:</p><pre><code class="language-csharp">app.MapGet(&quot;/{id}&quot;, ([FromRoute] int id, [FromQuery]string search) =&gt; &quot;Hello world&quot;);</code></pre><p><code>CreateArgument</code> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x43F;&#x43E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x438; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; <code>[From]</code>; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;. &#x412; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432; <code>CreateArgument</code> &quot;&#x432;&#x441;&#x43B;&#x435;&#x43F;&#x443;&#x44E;&quot; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;, &#x445;&#x43E;&#x442;&#x44F; &#x43E;&#x43D; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x443; &#x43D;&#x435;&#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x445; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x439; &#x438; &#x43F;&#x440;&#x438; &#x438;&#x445; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x438; &#x43D;&#x435;&#x43C;&#x435;&#x434;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;:</p><ul><li>&#x415;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[FromRoute]</code>, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x431;&#x44B;&#x43B;&#x438; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x43D;&#x44B; &#x438;&#x437; <code>RoutePattern</code>, &#x43D;&#x43E; &#x438;&#x43C;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; (&#x438;&#x43B;&#x438; &#x438;&#x43C;&#x44F;, &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x432; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x435;) &#x43D;&#x435; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43E;&#x432;, &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; <code>InvalidOperationException()</code>;</li><li>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[FromFile]</code> &#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>IFormFile</code> &#x438;&#x43B;&#x438; <code>IFormFileCollection</code>, &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; <code>NotSupportedException</code>.</li><li>&#x415;&#x441;&#x43B;&#x438; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x438;&#x43C;&#x44F; &#x432; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x435; <code>[FromFile]</code>, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C;&#x43E;&#x43C; &#x43A; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; <code>IFormFileCollection</code>, &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; <code>NotSupportedException</code> (&#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x435; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; <code>IFormFile</code>).</li><li>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x430;&#x435;&#x442;&#x435;&#x441;&#x44C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &quot;&#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x435;&quot; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; <code>[AsParameters]</code> (&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x44F; <code>[AsParameters]</code> &#x43A; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x443;), &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; <code>NotSupportedException</code>.</li></ul><p>&#x42D;&#x442;&#x438; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x430;&#x44E;&#x442; &#x441;&#x440;&#x430;&#x437;&#x443; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; <code>CreateArgument</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x43D;&#x438;&#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;, &#x438; &#x432;&#x430;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;.</p><p><code>CreateArgument()</code> &#x438;&#x449;&#x435;&#x442; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; <code>[From*]</code> &#x432; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435;, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x432; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43D;&#x438;&#x436;&#x435; &#x444;&#x440;&#x430;&#x433;&#x43C;&#x435;&#x43D;&#x442;&#x435;. &#x42D;&#x442;&#x43E; &#x43D;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; C#, &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43F;&#x441;&#x435;&#x432;&#x434;&#x43E;&#x43A;&#x43E;&#x434; (&#x442;&#x430;&#x43A; &#x447;&#x442;&#x43E; &#x43D;&#x435; &#x43A;&#x440;&#x438;&#x447;&#x438;&#x442;&#x435; &#x43D;&#x430; &#x43C;&#x435;&#x43D;&#x44F;), &#x43D;&#x43E; &#x44F; &#x434;&#x443;&#x43C;&#x430;&#x44E;, &#x447;&#x442;&#x43E; &#x442;&#x430;&#x43A; &#x43B;&#x435;&#x433;&#x447;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43E;&#x43A; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x438; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x43D;&#x44F;&#x442;&#x44B;&#x445; &quot;&#x43F;&#x43E;&#x434;&quot; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x439;.</p><pre><code class="language-csharp">switch =&gt;
{
    // If the parameter has a [FromRoute] attribute, bind to route parameter if it exists
    // if the parameter doesn&apos;t exist, throw an InvalidOperationException
    [FromRoute] when &quot;param&quot; exists =&gt; HttpContext.Request.RouteValues[&quot;param&quot;],
    [FromRoute] =&gt; throw new InvalidOperationException(),

    // If the parameter has a [FromQuery] attribute, bind to query parameter
    [FromQuery] =&gt; HttpContext.Request.Query[&quot;param&quot;],

    // If the parameter has a [FromHeader] attribute, bind to header parameter
    [FromHeader] =&gt; HttpContext.Request.Headers[&quot;param&quot;],

    // If the parameter has a [FromBody] attribute, bind to the request stream or request body
    // depending on the parameter type
    [FromBody] =&gt; switch parmeterType
    {
        Stream stream =&gt; HttpContext.Request.Body,
        PipeReader reader =&gt; HttpContext.Request.BodyReader,
        // If a generic type, add metadata indicating the API accepts &apos;application/json&apos; with type T 
        T _ =&gt; JsonSerializer.Deserialize&lt;T&gt;(HttpContext.Request.Body),
    },

    // If the parameter has a [FromForm] attribute, bind to the request body as a form
    // This also adds metadata indicating the API accepts the &apos;multipart/form-data&apos; content-type
    [FromForm] =&gt; switch parameterType
    {
        IFormFileCollection collection =&gt; HttpRequest.Form.Files,
        IFormFile file =&gt; HttpRequest.Form.Files[&quot;param&quot;],
        _ =&gt; throw new NotSupportedException(),
    },

    // If the parameter has a [FromServices] attribute, bind to a service in DI
    [FromServices] =&gt; HttpContext.RequestServices.GetRequiredService(parameterType),

    // If the parameter has an [AsParameters] attribute, recursively bind the properties of the parameter
    [AsParameters] =&gt; goto start!
}</code></pre><p>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; <code>CreateArgument</code> &#x442;&#x430;&#x43A;&#x436;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code>, &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x438;&#x435; &#x43D;&#x430; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x444;&#x43E;&#x440;&#x43C;&#x443; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x432;&#x44B;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x438;&#x437; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D1%85-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432;</h2><p>&#x415;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x430; <code>[From*]</code>, <code>CreateArgument</code> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43E;&#x43D; &#x442;&#x438;&#x43F;&#x43E;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; <code>HttpContext</code>. &#x412; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x442;&#x438;&#x43F;&#x44B; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435;:</p><ul><li><code>HttpContext</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext</code>)</li><li><code>HttpRequest</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext.Request</code>)</li><li><code>HttpResponse</code> (&#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; <code>httpContext.Response</code>)</li><li><code>ClaimsPrincipal</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext.User</code>)</li><li><code>CancellationToken</code> (&#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; <code>httpContext.RequestAborted</code>)</li><li><code>IFormFileCollection</code> (&#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; <code>httpContext.Request.Form.Files</code> &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code>)</li><li><code>IFormFile</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext.Request.Form.Files[&quot;param&quot;]</code>, &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code>)</li><li><code>Stream</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext.Request.Body</code>)</li><li><code>PipeReader</code> (&#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; <code>httpContext.Request.BodyReader</code>)</li></ul><p>&#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x438;&#x437; &#x43D;&#x438;&#x445; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C;&#x438; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430;&#x43C;&#x438;, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43E;&#x43D;&#x438; &#x431;&#x443;&#x43A;&#x432;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x442;&#x438;&#x43F;&#x44B;, &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x435; &#x432; <code>HttpContext</code>. &#x422;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; <code>IFormFile</code> &#x438; <code>IFormFileCollection</code> &#x442;&#x440;&#x435;&#x431;&#x443;&#x44E;&#x442; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%89%D0%B8%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-bindasync">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; BindAsync</h2><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x442;&#x43E;&#x433;&#x43E;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; <code>Type</code> &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x43C; &#x442;&#x438;&#x43F;&#x43E;&#x43C;, <code>CreateArgument()</code> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x435;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x443; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>BindAsync</code>. &#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x443;.</p><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x434;&#x432;&#x443;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; <code>BindAsync</code>:</p><pre><code class="language-csharp">public static ValueTask&lt;T?&gt; BindAsync(HttpContext context, ParameterInfo parameter);
public static ValueTask&lt;T?&gt; BindAsync(HttpContext context);</code></pre><p>&#x41E;&#x43D;&#x438; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x43A;&#x430;&#x43A; &#x442;&#x430;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E;, ASP.NET Core &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x43E;&#x442;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x442;&#x43E;&#x433;&#x43E;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x43B;&#x438; &#x442;&#x438;&#x43F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x438; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Shared/ParameterBindingMethodCache.cs?ref=zznob.ru">&#x43A;&#x44D;&#x448;&#x438;&#x440;&#x443;&#x435;&#x442; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;</a>.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%B8-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-tryparse">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; TryParse</h2><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43D;&#x435; &#x443;&#x43A;&#x430;&#x436;&#x435;&#x442;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[From*]</code>, &#x442;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, <code>int</code> &#x438; <code>string</code>) &#x431;&#x443;&#x434;&#x443;&#x442; &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x43C;&#x438; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x438;&#x43B;&#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x42D;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x441;&#x44F; &#x43A; &#x43B;&#x44E;&#x431;&#x44B;&#x43C; &#x442;&#x438;&#x43F;&#x430;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44E;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441; <code>IParseable</code> (&#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432; C#11, &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x44B;&#x445; &#x447;&#x43B;&#x435;&#x43D;&#x43E;&#x432;) &#x438;&#x43B;&#x438; &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; <code>TryParse</code>:</p><pre><code class="language-csharp">public static bool TryParse(string value, T out result);
public static bool TryParse(string value, IFormatProvider provider, T out result);</code></pre><p>&#x410;&#x43D;&#x430;&#x43B;&#x43E;&#x433;&#x438;&#x447;&#x43D;&#x43E; <code>BindAsync</code>, &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>TryParse</code> <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Shared/ParameterBindingMethodCache.cs?ref=zznob.ru">&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43E;&#x442;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F;</a>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x442;&#x438;&#x43F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437;.</p><p>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x441; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x44B;&#x43C; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;. &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x43E;&#x43D; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><p>&#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x430;&#x44F; &#x442;&#x440;&#x435;&#x442;&#x44C;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x438;&#x437; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430; <code>RoutePattern</code> &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;. &#x42F; &#x43D;&#x435; &#x443;&#x432;&#x435;&#x440;&#x435;&#x43D;, &#x432; &#x43A;&#x430;&#x43A;&#x438;&#x445; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x440;&#x438;&#x44F;&#x445; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x43E;&#x439;&#x442;&#x438;, &#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x442;&#x430;&#x43A;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x438; &#x43A; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x443;, &#x438; &#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x443;. &#x412;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F;, &#x435;&#x441;&#x43B;&#x438; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x441; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x44B;&#x43C; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C;, &#x43E;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x43E;, &#x432; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43D; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2-%D0%BA-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;</h2><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x430;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x43E;&#x439;. &#x41E;&#x43D;&#x430; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x435;&#x441;&#x43B;&#x438;:</p><ul><li>&#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>string[]</code>, <code>StringValues</code>, <code>StringValues?</code>, &#x438;&#x43B;&#x438; <code>T[]</code>, &#x433;&#x434;&#x435; <code>T</code> &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>TryParse()</code></li><li><code>DisableInferredFromBody</code> &#x440;&#x430;&#x432;&#x43D;&#x43E; <code>true</code> (&#x447;&#x442;&#x43E; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; <code>GET</code> &#x438; <code>DELETE</code>).</li></ul><p>&#x415;&#x441;&#x43B;&#x438; &#x43E;&#x431;&#x430; &#x44D;&#x442;&#x438; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F; &#x438;&#x441;&#x442;&#x438;&#x43D;&#x43D;&#x44B;, &#x442;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><blockquote>&#x41F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; URL &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x43E;&#x432; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x438; &#x442;&#x43E;&#x433;&#x43E; &#x436;&#x435; &#x43A;&#x43B;&#x44E;&#x447;&#x430;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#xA0;<code>?q=1&amp;q=2&amp;q=3</code>. &#x414;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x442;&#x438;&#x43F;&#x430; <code>(int[] q) =&gt; {}</code> &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>q</code> &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x441; &#x442;&#x440;&#x435;&#x43C;&#x44F; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438;: <code>new [] {1, 2, 3}</code>.</blockquote><p>&#x42D;&#x442;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x430; &#x442;&#x435;&#x43C;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; <code>int[]</code>, &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; <code>GET</code> &#x438; <code>POST</code>, &#x43D;&#x43E; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x441;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x43D;&#x43E; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x439;. &#x42D;&#x442;&#x43E; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x432;&#x441;&#x435;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x43E;&#x432; &#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435;, &#x433;&#x434;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43B;&#x438;&#x431;&#x43E; &#x438;&#x434;&#x435;&#x43D;&#x442;&#x438;&#x447;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432; HTTP (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; <code>[From*]</code> &#x438;&#x43B;&#x438; <code>BindAsync</code>), &#x43B;&#x438;&#x431;&#x43E; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x442;&#x438;&#x43F;&#x43E;&#x432; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x441;&#x43A;&#x43E;&#x440;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x438;&#x43C;).</p><p>&#x41D;&#x43E; <code>int[]</code> &#x2014; &#x44D;&#x442;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x435;. &#x41E;&#x43D; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x439; &#x447;&#x430;&#x441;&#x442;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x430; HTTP: &#x434;&#x43B;&#x44F; <code>GET</code> (&#x438; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x445;) &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x43E;&#x43D; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x430; &#x434;&#x43B;&#x44F; <code>POST</code> (&#x438; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x445;) &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; - &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43A;&#x430;&#x43A; &#x438; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x439; &#x442;&#x438;&#x43F;.</p><h2 id="%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2">&#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x432;</h2><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x438;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;, &#x437;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435; DI, &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; minimal API, &#x438; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D; &#x438; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x435;&#x43D;.</p><p>ASP.NET Core &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x43E;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x438;&#x442;&#x44C;, &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; (&#x441; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x43C; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C;) <code>IServiceProviderIsService</code>. &#x42D;&#x442;&#x43E;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441; &#x431;&#x44B;&#x43B; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D; &#x432; .NET 6 &#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x439; &#x446;&#x435;&#x43B;&#x438;. &#x412;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; <code>serviceProviderIsService.IsService(type)</code>, &#x438; &#x435;&#x441;&#x43B;&#x438; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; DI &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x435;&#x43D; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; &#x442;&#x438;&#x43F;&#x430;, &#x442;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; true.</p><blockquote>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; DI-&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D;&#x43D;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44F; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E;, &#x442;&#x43E; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code>IServiceProviderIsService</code>. &#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;&#x445;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; <code>Autofac</code> &#x438; <code>Lamar</code>, &#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x430;&#x448; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x43D;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x44D;&#x442;&#x43E;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;, &#x432;&#x44B; &#x43D;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430;&#x43C;, &#x438; &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x432;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code>[FromService]</code>.</blockquote><h2 id="%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9-%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82-%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%BA-%D1%82%D0%B5%D0%BB%D1%83">&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;: &#x41F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x442;&#x435;&#x43B;&#x443;</h2><p>&#x415;&#x441;&#x43B;&#x438; &#x43D;&#x438; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x43E;&#x432; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x438;&#x442;, &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; - &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x442; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43D;&#x435;&#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E; &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x43D;&#x430;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x432; <code>GET</code> &#x438;&#x43B;&#x438; <code>DELETE</code>, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; <code>DisableInferredFromBody</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x441;&#x442;&#x438;&#x43D;&#x43D;&#x44B;&#x43C;. &#x42D;&#x442;&#x43E; &quot;&#x43D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x435;&quot; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x437;&#x436;&#x435; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>CreateArguments()</code> &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43A;&#x430;&#x43A; &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;:</p><pre><code class="language-csharp">// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x432;&#x43E;&#x434; &#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x43A; &#x442;&#x435;&#x43B;&#x443;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43D;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43B;&#x43E;?
if (factoryContext.HasInferredBody &amp;&amp; factoryContext.DisableInferredFromBody)
{
    var errorMessage = BuildErrorMessageForInferredBodyParameter(factoryContext);
    throw new InvalidOperationException(errorMessage);
}

// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x43A; &#x442;&#x435;&#x43B;&#x443; JSON, &#x442;&#x430;&#x43A; &#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x444;&#x43E;&#x440;&#x43C;&#x44B;?
if (factoryContext.JsonRequestBodyParameter is not null &amp;&amp;
    factoryContext.FirstFormRequestBodyParameter is not null)
{
    var errorMessage = BuildErrorMessageForFormAndJsonBodyParameters(factoryContext);
    throw new InvalidOperationException(errorMessage);
}

// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x440;&#x430;&#x437;? 
if (factoryContext.HasMultipleBodyParameters)
{
    var errorMessage = BuildErrorMessageForMultipleBodyParameters(factoryContext);
    throw new InvalidOperationException(errorMessage);
}</code></pre><p>&#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443;, &#x43F;&#x440;&#x438; &#x43D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43C;&#x44B; &#x43D;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x443; &#x441;&#x440;&#x430;&#x437;&#x443;, &#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x430; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x44B; &#x432;&#x44B;&#x431;&#x440;&#x43E;&#x441;&#x438;&#x43C; <code>InvalidOperationException</code>, &#x431;&#x43B;&#x43E;&#x43A;&#x438;&#x440;&#x443;&#x44F; &#x434;&#x430;&#x43B;&#x44C;&#x43D;&#x435;&#x439;&#x448;&#x443;&#x44E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;.</p><p>&#x41F;&#x43E;&#x43C;&#x438;&#x43C;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x434;&#x435;&#x440;&#x435;&#x432;&#x430; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x44D;&#x442;&#x430;&#x43F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code> &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44F;, &#x447;&#x442;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442; JSON-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;, &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x442;&#x438;&#x43F;&#x443; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;.</p><p>&#x418; &#x43D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x43E;&#x448;&#x43B;&#x438; &#x43A; &#x43A;&#x43E;&#x43D;&#x446;&#x443; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x434;&#x43B;&#x438;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x435;&#x439; &#x432; minimal API! &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x441;&#x435;&#x440;&#x438;&#x438; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43A;&#x430;&#x436;&#x434;&#x443;&#x44E; &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43E;&#x43A;, &#x438;&#x437;&#x443;&#x447;&#x438;&#x432; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x442; <code>RequestDelegateFactory</code>!</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RequestDelegateFactory.CreateArgument()</code> &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x434;&#x43B;&#x44F; minimal API. <code>CreateArgument()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; minimal API, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43E;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x44E;&#x449;&#x438;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;, &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;: &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x438;, &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, DI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x438; &#x442;. &#x434;.</p><p>&#x42F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x447;&#x442;&#x43E; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; API &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x447;&#x435;&#x440;&#x435;&#x437; &#x441;&#x435;&#x43C;&#x44C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x439; &#x43F;&#x440;&#x438; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x438; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;: <code>[From*]</code> &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B;, &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; <code>BindAsync()</code>, &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; <code>TryParse()</code>, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x43A; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; (&#x434;&#x43B;&#x44F; GET-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;), DI-&#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B; &#x438;, &#x43D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;, &#x441; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x441;&#x43E;&#x432;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;. &#x42D;&#x442;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x44F;&#x442; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; <code>Expression</code>!</p><p>&#x421; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-3-exploring-the-model-binding-logic-of-minimal-apis/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Извлечение метаданных из обработчика Minimal API]]></title><description><![CDATA[<p>&#x42D;&#x442;&#x430; &#x432;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; &#x43F;&#x440;&#x435;&#x434;</p>]]></description><link>https://zznob.ru/izvliechieniie-mietadannykh-iz-obrabotchika-minimal-api/</link><guid isPermaLink="false">640d66dbf07f800001bbf42e</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Sun, 12 Mar 2023 08:53:50 GMT</pubDate><media:content url="https://zznob.ru/content/images/2023/03/metadata-extraction-graphic-1024x873-1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://zznob.ru/content/images/2023/03/metadata-extraction-graphic-1024x873-1-.png" alt="&#x418;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; Minimal API"><p>&#x42D;&#x442;&#x430; &#x432;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x438;&#x437; &#x441;&#x435;&#x440;&#x438;&#x438; &quot;&#x417;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x430;&#x43C;&#x438; Minimal API&quot; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;. &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43C;&#x44B; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B;&#x438;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; minimal API <code>MapGet(&quot;/&quot;, () =&gt; &quot;Hello world&quot;</code>, &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; <code>EndpointMiddleware</code>. &#x412; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x44F; &#x441;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x43E;&#x447;&#x443;&#x441;&#x44C; &#x43D;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>RequestDelegateFactory.InferMetadata()</code> &#x438; &#x440;&#x430;&#x437;&#x431;&#x435;&#x440;&#x443;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;.</p><h2 id="%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D1%82-%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B0%D1%82%D0%B0">&#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x442; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430;</h2><p> &#x412; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435; &#x443;&#x434;&#x435;&#x43B;&#x44F;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443; <code>CreateRouteEndpointBuilder()</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x43F;&#x435;&#x440;&#x432;&#x44B;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;, &#x438; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; <code>RouteEntry</code> &#x438; <code>RoutePattern</code>, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x441; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x43C;, &#x432; <code>RouteEndpointBuilder</code>. &#x417;&#x430;&#x442;&#x435;&#x43C; &#x432;&#x441;&#x451; &#x44D;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>RouteEndpoint</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><p><code>CreateRouteEndpointBuilder()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x43A; &#x437;&#x430; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x442;&#x430;&#x43A; &#x438; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x435;&#x433;&#x43E; <code>RequestDelegate</code>. &#x41D;&#x430;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43C;, &#x447;&#x442;&#x43E; <code>RequestDelegate</code> &#x2014; &#x44D;&#x442;&#x43E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">public delegate Task RequestDelegate(HttpContext context);</code></pre><p>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x430; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x430; &#x43D;&#x435; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x43B;&#x438; &#x432; <code>MapGet</code>, &#x432; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; Hello World - <code>() =&gt; &#xAB;Hello world!&#xBB;</code> &#x438;&#x43C;&#x435;&#x435;&#x442; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><pre><code class="language-csharp">public string SomeMethod();</code></pre><p><code>CreateRouteEndpointBuilder()</code> &#x432; &#x441;&#x43E;&#x447;&#x435;&#x442;&#x430;&#x43D;&#x438;&#x438; &#x441; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x43C; <code>RequestDelegateFactory</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x435; <code>RequestDelegate</code> &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430;.</p><p>&#x412; &#x440;&#x430;&#x43C;&#x43A;&#x430;&#x445; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>RequestDelegateFactory</code> &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x43F;&#x440;&#x43E;&#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x442;&#x438;&#x43F;&#x44B; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x43C;. &#x42D;&#x442;&#x430; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x443;&#x436;&#x43D;&#x430; &#x444;&#x430;&#x431;&#x440;&#x438;&#x43A;&#x435; <code>RequestDelegateFactory</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D;&#x430; &#x43C;&#x43E;&#x433;&#x43B;&#x430; &#x432;&#x44B;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x434;, &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x441;&#x43E; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x430;&#x43C;&#x438; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435; DI &#x438;&#x43B;&#x438;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441; &#x442;&#x435;&#x43B;&#x43E;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</p><p>&#x420;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x43D;&#x435;&#x434;&#x440;&#x44F;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>HttpRequest</code> &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;: <code>MapGet(&quot;/&quot;, (HttpRequest request) =&gt; &quot;Hello world!&quot;)</code>. <code>RequestDelegateFactory</code> &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x43E;&#x439; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439; <code>RequestDelegate</code>, &#x43D;&#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;. &#x41E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    // handler &#x2014; &#x43E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.
    // &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; HttpRequest &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; HttpContext &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;
    string text = handler.Invoke(httpContext.Request);

    // &#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x438; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C;.
    httpContext.Response.ContentType ??= &quot;text/plain; charset=utf-8&quot;;
    return httpContext.Response.WriteAsync(text);
}</code></pre><blockquote>&#x418;&#x43D;&#x444;&#x440;&#x430;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x430; minimal API &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; <code>Expersion</code>, &#x447;&#x442;&#x43E; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x43D;&#x43E;&#x439; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D; &#x432;&#x44B;&#x441;&#x43E;&#x43A;&#x43E;&#x439; &#x441;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x438; minimal API. &#x42D;&#x442;&#x43E; &#x440;&#x430;&#x432;&#x43D;&#x43E;&#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x442;&#x43E;&#x43C;&#x443;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x43D;&#x430;&#x43F;&#x438;&#x448;&#x435;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x43A;&#x43E;&#x434; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x438;&#x437; &#x432;&#x430;&#x448;&#x438;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432;. &#x41A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x43E;, &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x44D;&#x442;&#x438;&#x445; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x440;&#x438;&#x432;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44D;&#x442;&#x430; &#x441;&#x435;&#x440;&#x438;&#x44F; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43B;&#x438;&#x43D;&#x43D;&#x430;&#x44F;!</blockquote><p>&#x41D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44F; &#x43E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x438; &#x435;&#x435; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x445; &#x44F;&#x432;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x43F;&#x43E;&#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>RequestDelegateFactory.InferMetadata()</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x44D;&#x442;&#x430; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44F;.</p><h2 id="%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4-%D0%BC%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0">&#x412;&#x44B;&#x432;&#x43E;&#x434; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;</h2><p>&#x412; <a href="https://zznob.ru/piervyi-vzghliad-za-kulisy-endpointov-minimal-api/">&#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;</a> &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>RouteEndpointDataSource.CreateRDFOptions()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>RequestDelegateFactoryOptions</code> &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; <code>RouteEntry</code> &#x438; <code>RoutePattern</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x431;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43D;&#x430;&#x431;&#x43E;&#x440; &#x43E;&#x43F;&#x446;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>. &#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44F;&#x442; &#x441;&#x430;&#x43C;&#x438; &#x437;&#x430; &#x441;&#x435;&#x431;&#x44F;, &#x43D;&#x43E; &#x44F; &#x43F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x430;&#x43B; &#x438;&#x445; &#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x438;&#x436;&#x435;:</p><pre><code class="language-csharp">public sealed class RequestDelegateFactoryOptions
{
    // DI &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x43D;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;
    public IServiceProvider? ServiceProvider { get; init; }

    // &#x418;&#x43C;&#x435;&#x43D;&#x430; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x432; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x435;.
    // &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; /view/{organization}/{id}
    // &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x434;&#x432;&#x430; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &quot;organization&quot; &#x438; &quot;id&quot;
    public IEnumerable&lt;string&gt;? RouteParameterNames { get; init; }

    // True &#x435;&#x441;&#x43B;&#x438; RequestDelegate &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43F;&#x440;&#x435;&#x440;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43B;&#x43E;&#x445;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B;
    public bool ThrowOnBadRequest { get; init; }

    // &#x414;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x43B;&#x438; RequestDelegate &#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x442;&#x435;&#x43B;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;
    // &#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x443;&#x44E; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x435;&#x43D;&#x438;&#x44F;
    public bool DisableInferBodyFromParameters { get; init; }

    // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; RequestDelegate &#x438; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43A; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;&#x43C;
    public EndpointBuilder? EndpointBuilder { get; init; }
}</code></pre><p>&#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>CreateRouteEndpointBuilder()</code> &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x432;&#x44B;&#x437;&#x432;&#x430;&#x432; <code>CreateRDFOptions</code> &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;. &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>RequestDelegateFactory.InferMetadata</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x438;&#x436;&#x435;.</p><pre><code class="language-csharp">public static RequestDelegateMetadataResult InferMetadata(
    MethodInfo methodInfo, // &#x1F448; &#x418;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x431; &#x43E;&#x442;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
    RequestDelegateFactoryOptions? options = null) // &#x1F448; &#x41E;&#x43F;&#x446;&#x438;&#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;
{
    // &#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &quot;context&quot; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x44C; (&#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D; &#x43A;&#x440;&#x430;&#x442;&#x43A;&#x43E;)
    RequestDelegateFactoryContext factoryContext = CreateFactoryContext(options);

    // &#x427;&#x438;&#x442;&#x430;&#x435;&#x442; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E;&#x431; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x442;&#x430;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;
    factoryContext.ArgumentExpressions = CreateArgumentsAndInferMetadata(methodInfo, factoryContext);

    // &#x421;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x441;&#x442;&#x432;&#x438;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; RequestDelegate
    return new RequestDelegateMetadataResult
    {
        EndpointMetadata = AsReadOnlyList(factoryContext.EndpointBuilder.Metadata),
    };
}</code></pre><p>&#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>MethodInfo</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x432;&#x441;&#x44E; &#xAB;&#x43E;&#x442;&#x440;&#x430;&#x436;&#x430;&#x44E;&#x449;&#x443;&#x44E;&#xBB; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435;. &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x432; &#x43C;&#x43E;&#x438;&#x445; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; API &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x43B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x432; &#x432;&#x438;&#x434;&#x435; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x43E; &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x438; &#x431;&#x44B; &#x442;&#x43E; &#x436;&#x435; &#x441;&#x430;&#x43C;&#x43E;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x431;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43B;&#x438; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430; &#x438;&#x43B;&#x438; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</p><p><code>InferMetadata</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x432;&#x44B;&#x448;&#x435;, &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x438;&#x437; &#x434;&#x432;&#x443;&#x445; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x445; &#x448;&#x430;&#x433;&#x43E;&#x432;:</p><ul><li>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &quot;context&quot; &#xA0;<code>RequestDelegateFactoryContext</code> </li><li>&#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x438; &#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;</li></ul><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>CreateFactoryContext</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x437;&#x434;&#x435;&#x441;&#x44C;, &#x432; <code>InferMetadata()</code>, &#x442;&#x430;&#x43A; &#x438; &#x43F;&#x43E;&#x437;&#x436;&#x435;, &#x43F;&#x440;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; <code>RequestDelegate</code> &#x432; <code>RequestDelegateFactory.Create()</code>, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x43D; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;. &#x41F;&#x440;&#x438; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; &#x43D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F;. &#x421;&#x445;&#x435;&#x43C;&#x430; &#x43D;&#x438;&#x436;&#x435; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L257-L283">&#x443;&#x43F;&#x440;&#x43E;&#x449;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; <code>CreateFactoryContext</code></a> &#x441; &#x443;&#x447;&#x435;&#x442;&#x43E;&#x43C; &#x44D;&#x442;&#x43E;&#x433;&#x43E;:</p><pre><code class="language-csharp">private static RequestDelegateFactoryContext CreateFactoryContext(
    RequestDelegateFactoryOptions? options,
    RequestDelegateMetadataResult? metadataResult = null, // &#x1F448; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; null &#x432; InferMetadata
    Delegate? handler = null) // &#x1F448; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; null &#x432; InferMetadata
{
    if (metadataResult?.CachedFactoryContext is not null)
    {
        // &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438; &#x441;&#x43A;&#x440;&#x44B;&#x442;&#x44B;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443;&#x447;&#x442;&#x43E;  metadataResult &#x440;&#x43E;&#x432;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; null &#x432; InferMetadata &#x438; &#x43D;&#x435; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;
    }

    // ServiceProvider  &#x43D;&#x435; null &#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; CreateRDFOptions()
    IServiceProvider serviceProvider = options?.ServiceProvider;
    
    // EndpointBuilder &#x440;&#x43E;&#x432;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; null &#x432; InferMetadata, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x431;&#x438;&#x43B;&#x434;&#x435;&#x440;
    var endpointBuilder = options?.EndpointBuilder ?? new RDFEndpointBuilder(serviceProvider);

    var factoryContext = new RequestDelegateFactoryContext
    {
        Handler = handler, // null, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43D;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D; &#x432; InferMetadata
        ServiceProvider = options.ServiceProvider,
        ServiceProviderIsService = serviceProvider.GetService&lt;IServiceProviderIsService&gt;(),
        RouteParameters = options?.RouteParameterNames?.ToList(),
        ThrowOnBadRequest = options?.ThrowOnBadRequest ?? false,
        DisableInferredFromBody = options?.DisableInferBodyFromParameters ?? false,
        EndpointBuilder = endpointBuilder
        MetadataAlreadyInferred = metadataResult is not null, // false
    };

    return factoryContext;
}</code></pre><p>&#x41A;&#x430;&#x43A; &#x432;&#x438;&#x434;&#x43D;&#x43E; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435; &#x444;&#x440;&#x430;&#x433;&#x43C;&#x435;&#x43D;&#x442;&#x430;, <code>RequestDelegateFactoryContext</code> &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43A;&#x43E;&#x43F;&#x438;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; &#x438;&#x437; <code>RequestDelegateFactoryOptions</code>. <code>RDFEndpointBuilder</code> &#x2014; &#x44D;&#x442;&#x43E; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x430;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; <code>EndpointBuilder</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>Build()</code>. </p><pre><code class="language-csharp">private sealed class RDFEndpointBuilder : EndpointBuilder
{
    public RDFEndpointBuilder(IServiceProvider applicationServices)
    {
        ApplicationServices = applicationServices;
    }

    public override Endpoint Build() =&gt; throw new NotSupportedException();
}</code></pre><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>RequestDelegateFactoryContext</code> &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x448;&#x430;&#x433; &#x2014; &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x438;&#x445; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; (&#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x441;&#x43B;&#x443;&#x436;&#x431; &#x438; &#x442;. &#x434;.), &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</p><h2 id="%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0">&#x410;&#x43D;&#x430;&#x43B;&#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;</h2><p><code>RequestDelegateFactory</code> &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; <code>MethodInfo</code> &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x432; <code>CreateArgumentsAndInferMetadata()</code>, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430;:</p><pre><code class="language-csharp">private static Expression[] CreateArgumentsAndInferMetadata(
    MethodInfo methodInfo, RequestDelegateFactoryContext factoryContext)
{
    // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43B;&#x44E;&#x431;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;.
    // &#x41F;&#x440;&#x438; &#x44D;&#x442;&#x43E;&#x43C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x435;&#x444;&#x43B;&#x435;&#x43A;&#x448;&#x435;&#x43D;&#x43E;&#x432; &#x438; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;,
    // &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x44B; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; RequestDelegateFactoryOptions.FactoryContext,
    // &#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x432; RequestDelegateFactory.Create().
    var args = CreateArguments(methodInfo.GetParameters(), factoryContext);

    if (!factoryContext.MetadataAlreadyInferred)
    {
        PopulateBuiltInResponseTypeMetadata(methodInfo.ReturnType, factoryContext.EndpointBuilder);

        // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x43E;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; 
        // &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430; &#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x432;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;
        EndpointMetadataPopulator.PopulateMetadata(
            methodInfo,
            factoryContext.EndpointBuilder,
            factoryContext.Parameters);
    }

    return args;
}</code></pre><p>&#x41A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x438; &#x438; &#x438;&#x43C;&#x435;&#x43D;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x44F;&#x44E;&#x442;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442;, &#x43D;&#x43E; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x432;&#x430;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x431;&#x435;&#x440;&#x435;&#x43C; <code>MethodInfo</code> &#x438; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; <code>Expression[]</code> (&#x43E;&#x434;&#x43D;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;).</p><blockquote>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C;&#x2026; &#x442;&#x440;&#x443;&#x434;&#x43E;&#x435;&#x43C;&#x43A;&#x438;&#x43C;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x430; &#x432; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x445; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; API.</blockquote><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435; &#x43C;&#x44B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>CreateArguments()</code>, &#x433;&#x434;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</p><h2 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;.</h2><p>&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x432; <code>CreateArgumentsAndInferMetadata()</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <code>CreateArguments()</code>, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x441;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; <code>ParameterInfo[]</code> &#x434;&#x43B;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430;. <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L575-L638">&#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x43B;&#x438;&#x448;&#x43A;&#x43E;&#x43C; &#x43E;&#x431;&#x44A;&#x435;&#x43C;&#x43D;&#x44B;&#x439;</a> &#x434;&#x43B;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x43E;&#x434;&#x43D;&#x43E;&#x43C; &#x431;&#x43B;&#x43E;&#x43A;&#x435; &#x43A;&#x43E;&#x434;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x44C;&#x44E; &#x435;&#x433;&#x43E; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44B; &#x438; &#x431;&#x443;&#x434;&#x443; &#x43E;&#x431;&#x441;&#x443;&#x436;&#x434;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x43F;&#x43E; &#x445;&#x43E;&#x434;&#x443; &#x434;&#x435;&#x43B;&#x430;.</p><pre><code class="language-csharp">private static Expression[] CreateArguments(
    ParameterInfo[]? parameters, RequestDelegateFactoryContext factoryContext)
{
    if (parameters is null || parameters.Length == 0)
    {
        return Array.Empty&lt;Expression&gt;();
    }

    var args = new Expression[parameters.Length];
    
    factoryContext.ArgumentTypes = new Type[parameters.Length];
    factoryContext.BoxedArgs = new Expression[parameters.Length];
    factoryContext.Parameters = new List&lt;ParameterInfo&gt;(parameters);

    var hasFilters = factoryContext.EndpointBuilder.FilterFactories.Count &gt; 0;

    // ...
}</code></pre><p>&#x410;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>ParameterInfo</code> &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;. &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A; &#x43D;&#x435; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x438;&#x445; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432;, &#x442;&#x43E; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43F;&#x443;&#x441;&#x442;, &#x438; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43D;&#x435;&#x447;&#x435;&#x433;&#x43E;. &#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43C;&#x44B; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x445;. &#x41C;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x43A; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x443; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43B;&#x438;&#x431;&#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x439;, &#x435;&#x441;&#x43B;&#x438; &#x438;&#x445; &#x43D;&#x435;&#x442;.</p><blockquote>&#x42F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E;, &#x43A;&#x430;&#x43A; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432; RequestDelegateFactory, &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44D;&#x442;&#x43E;&#x439; &#x441;&#x435;&#x440;&#x438;&#x438;. &#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x435;&#x43D;&#x438;&#x435; <a href="https://blog.safia.rocks/endpoint-filters-exploration.html?ref=zznob.ru">&#x421;&#x430;&#x444;&#x438;&#x438; &#x410;&#x431;&#x434;&#x430;&#x43B;&#x43B;&#x44B;</a>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43B;&#x430; &#x43D;&#x430;&#x434; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x435;&#x439; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;!</blockquote><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x432;&#x441;&#x435;&#x445; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x43E;&#x432; &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; <code>Expression</code>, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x43A; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x443;:</p><pre><code class="language-csharp">for (var i = 0; i &lt; parameters.Length; i++)
{
    args[i] = CreateArgument(parameters[i], factoryContext);

    if (hasFilters)
    {
        // &#x415;&#x441;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; expression`&#x44B; 
        // &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; EndpointFilterInvocationContext
    }

    factoryContext.ArgumentTypes[i] = parameters[i].ParameterType;
    factoryContext.BoxedArgs[i] = Expression.Convert(args[i], typeof(object));
}</code></pre><p><a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L640">&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>CreateArgument()</code></a> &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B;. &#x41E;&#x43D; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; <code>ParameterInfo</code> &#x438; &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C;, &#x43A;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; <code>Expression</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#xAB;&#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F;&#xBB; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x443;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x435; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x441;&#x442;&#x430; &#x432;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438;, &#x447;&#x442;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; <code>HttpRequest</code> &#x431;&#x44B;&#x43B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; <code>httpContext.Request</code>:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string text = handler.Invoke(httpContext.Request);
    // ...
}</code></pre><p>&#x412; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x430; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; (&#x442;. &#x435;. &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;) &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x43D; &#x43A; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; <code>MapGet(&quot;/&quot;, (string? search) =&gt; search)</code>, &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43E; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x441;&#x447;&#x438;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;:</p><pre><code class="language-csharp">Task Invoke(HttpContext httpContext)
{
    string text = handler.Invoke(httpContext.Request.Query[&quot;search&quot;]);
    // ...
}</code></pre><p>&#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430; <code>Expression</code>, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x439;</p><pre><code class="language-csharp">httpContext.Request.Query[&quot;search&quot;]</code></pre><p>&#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x435;&#x43D; &#x438;&#x437; <code>CreateArgument()</code> &#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D; &#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x435; <code>args</code>. &#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x441;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x432; <code>RequestDelegateFactoryContext</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x434;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43E;&#x43A; &#x432; <code>RequestDelegateFactory.Create()</code>. &#x41F;&#x440;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; <code>CreateArgument</code> &#x442;&#x430;&#x43A;&#x436;&#x435; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; <code>[Accepts]</code> &#x43E;&#x431; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x43E;&#x43C; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x435; &#x442;&#x435;&#x43B;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x438;&#x445; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</p><blockquote>&#x422;&#x43E;&#x447;&#x43D;&#x430;&#x44F; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430; &#x432; <code>CreateArgument()</code> &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x438; &#x43F;&#x440;&#x438;&#x43E;&#x440;&#x438;&#x442;&#x435;&#x442;&#x43E;&#x43C; &#x434;&#x43B;&#x44F; minimal API &#x438; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435;.</blockquote><p>&quot;&#x417;&#x430;&#x43F;&#x430;&#x43A;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x430;&#x44F;&quot; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; <code>Expression</code> (&#x433;&#x434;&#x435; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x43A; <code>object</code>) &#x442;&#x430;&#x43A;&#x436;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x432; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; (&#x433;&#x434;&#x435; &#x44D;&#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;), &#x430; &#x442;&#x438;&#x43F;&#x44B; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432; <code>factoryContext</code>.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x43C; &#x448;&#x430;&#x433;&#x43E;&#x43C; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>CreateArguments()</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43E;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x43E;&#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x440;&#x430;&#x441;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43D;&#x435;&#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x440;&#x438;&#x435;&#x432; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x43E;&#x43C; &#x441;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; <code>Expression[]</code>.</p><pre><code class="language-csharp">// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x432;&#x43E;&#x434; &#x43E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x435; &#x43A; &#x442;&#x435;&#x43B;&#x443;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B;?
// (&#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43E; &#x442;&#x43E;&#x43C;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x447;&#x438;&#x441;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; DisableInferredFromBody, &#x441;&#x43C;. &#x432; &#x43F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;)
if (factoryContext.HasInferredBody &amp;&amp; factoryContext.DisableInferredFromBody)
{
    var errorMessage = BuildErrorMessageForInferredBodyParameter(factoryContext);
    throw new InvalidOperationException(errorMessage);
}

// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A;&#x430;&#x43A; &#x43A; &#x442;&#x435;&#x43B;&#x443; JSON, &#x442;&#x430;&#x43A; &#x438; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x444;&#x43E;&#x440;&#x43C;&#x44B;?
// &#x41D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x438; &#x442;&#x43E;&#x433;&#x43E;, &#x438; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x433;&#x43E;!
if (factoryContext.JsonRequestBodyParameter is not null &amp;&amp;
    factoryContext.FirstFormRequestBodyParameter is not null)
{
    var errorMessage = BuildErrorMessageForFormAndJsonBodyParameters(factoryContext);
    throw new InvalidOperationException(errorMessage);
}

// &#x41F;&#x44B;&#x442;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x43B;&#x438; &#x43C;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x440;&#x430;&#x437;?
if (factoryContext.HasMultipleBodyParameters)
{
    var errorMessage = BuildErrorMessageForMultipleBodyParameters(factoryContext);
    throw new InvalidOperationException(errorMessage);
}

return args;</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443; &#x43D;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x435;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D; &#x441; &#x443;&#x447;&#x435;&#x442;&#x43E;&#x43C; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; <code>HttpContext</code>. &#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x448;&#x430;&#x433;&#x43E;&#x43C; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x435;&#x433;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x430; HTTP-&#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x43C;.</p><h2 id="%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4-%D1%82%D0%B8%D0%BF%D0%B0-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B0-http-%D0%B8%D0%B7-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0">&#x412;&#x44B;&#x432;&#x43E;&#x434; &#x442;&#x438;&#x43F;&#x430; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430; HTTP &#x438;&#x437; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</h2><p>&#x41C;&#x435;&#x442;&#x43E;&#x434; <code>PopulateBuiltInResponseTypeMetadata()</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x443;&#x44E; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x443; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442; <code>[Produces]</code> &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;. &#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x443;&#x44E; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Http.Extensions/src/RequestDelegateFactory.cs?ref=zznob.ru#L929">&#x437;&#x434;&#x435;&#x441;&#x44C;</a>, &#x43D;&#x43E; &#x43E;&#x43D; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C;.</p><ul><li>&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F; <code>Task&lt;T&gt;</code> &#x438;&#x43B;&#x438; <code>ValueTask&lt;T&gt;</code> (&#x438;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; <code>await</code> &#x442;&#x438;&#x43F;&#x44B;)? (&#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x442;&#x438;&#x43F; <code>&#x422;</code> &#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F;.).</li><li>&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F; <code>void</code>, <code>Task</code>, <code>ValueTask</code>, &#x438;&#x43B;&#x438; <code>IResult</code>? (&#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x442;&#x43E; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x442;&#x438;&#x43F; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x438;&#x43C;).</li><li>&#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F; <code>string</code>? (&#x415;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x442;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; <code>[Produces(&quot;text/plain&quot;)]</code>, &#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x442;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; <code>[Produces(returnType)]</code>)</li></ul><p>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x44F; &#x441; .NET 7 &#x442;&#x438;&#x43F;&#x44B; <code>IResult</code> &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x442;&#x44C; <code>IEndpointMetadataProvider</code> &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; <code>[Produces]</code> &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x438; (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x43D;&#x438;&#x43A;&#x43E;&#x432; <code>TypedResults</code>), &#x43D;&#x43E; <code>IEndpointMetadataProvider</code> &#x43D;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>PopulateBuiltInResponseTypeMetadata()</code>. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E;, &#x43E;&#x43D; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435;.</p><h2 id="%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8%D0%B7-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D1%81-%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC">&#x417;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x441; &#x441;&#x430;&#x43C;&#x43E;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;&#x43C;.</h2><p>&#x412; .NET 7 &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x44B; <code>IEndpointMetadataProvider</code> &#x438; <code>IEndpointParameterMetadataProvider</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B; &#x431;&#x44B;&#x43B;&#x438; &#xAB;&#x441;&#x430;&#x43C;&#x43E;&#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x43C;&#x438;&#xBB;. &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44E;&#x442; &#x43E;&#x434;&#x438;&#x43D; (&#x438;&#x43B;&#x438; &#x43E;&#x431;&#x430;) &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x43E;&#x432;, &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43E; &#x441;&#x435;&#x431;&#x435;, &#x447;&#x442;&#x43E; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x43E;&#x432; &#x438; &#x433;&#x438;&#x431;&#x43A;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; &#x432;&#x430;&#x448;&#x438;&#x445; API &#x434;&#x43B;&#x44F; OpenAPI.</p><p>&#x41E;&#x431;&#x430; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x442; &#x43E;&#x434;&#x438;&#x43D; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x44B; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442;&#x435; &#x438;&#x445;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432; &#x441;&#x432;&#x43E;&#x435;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435;:</p><pre><code class="language-csharp">public interface IEndpointMetadataProvider
{
    static abstract void PopulateMetadata(MethodInfo method, EndpointBuilder builder);
}

public interface IEndpointParameterMetadataProvider
{
    static abstract void PopulateMetadata(ParameterInfo parameter, EndpointBuilder builder);
}</code></pre><p>&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x432;&#x430;&#x436;&#x43D;&#x430;, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; <code>RequestDelegateFactory</code> &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437;, &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x44F; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;. &#x42D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>RequestDelegateFactory.PopulateBuiltInResponseTypeMetadata()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; <code>EndpointMetadataPopulator.PopulateMetadata()</code>, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, <code>EndpointBuilder</code> &#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;.</p><p><a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Shared/EndpointMetadataPopulator.cs?ref=zznob.ru">&#x42F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x43B; <code>EndpointMetadataPopulator</code></a> &#x43D;&#x438;&#x436;&#x435; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x43E;&#x44F;&#x441;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x435;&#x432;. &#x41C;&#x435;&#x442;&#x43E;&#x434; <code>PopulateMetadata()</code> &#x43F;&#x435;&#x440;&#x435;&#x431;&#x438;&#x440;&#x430;&#x435;&#x442; &#x43A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x43B;&#x438; &#x43E;&#x43D; &#x43A;&#x430;&#x43A;&#x43E;&#x439;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x437; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x43E;&#x432;, &#x438;, &#x435;&#x441;&#x43B;&#x438; &#x434;&#x430;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E;. &#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x440;&#x435;&#x444;&#x43B;&#x435;&#x43A;&#x441;&#x438;&#x438;, &#x447;&#x442;&#x43E; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;!</p><pre><code class="language-csharp">internal static class EndpointMetadataPopulator
{
    public static void PopulateMetadata(
        MethodInfo methodInfo, 
        EndpointBuilder builder,
        IEnumerable&lt;ParameterInfo&gt;? parameters = null)
    {
        // &#x42D;&#x442;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x434;&#x435;&#x441;&#x44C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;
        // &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;, &#x443;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x430;&#x44F; &#x430;&#x43B;&#x43E;&#x43A;&#x430;&#x446;&#x438;&#x44E;
        object?[]? invokeArgs = null;
        parameters ??= methodInfo.GetParameters();

        // &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x442;&#x438;&#x43F;&#x430;
        foreach (var parameter in parameters)
        {
            if (typeof(IEndpointParameterMetadataProvider)
                .IsAssignableFrom(parameter.ParameterType))
            {
                // &#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x442;&#x438;&#x43F;&#x430; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44E;&#x442; IEndpointParameterMetadataProvider
                invokeArgs ??= new object[2];
                invokeArgs[0] = parameter;
                invokeArgs[1] = builder;

                // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x440;&#x435;&#x444;&#x43B;&#x435;&#x43A;&#x441;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; PopulateMetadata &#x434;&#x43B;&#x44F; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;
                 // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x443;&#x43D;&#x438;&#x432;&#x435;&#x440;&#x441;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x43D;&#x438;&#x43C;&#x438; &#x2014; &#x445;&#x438;&#x442;&#x440;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x44F;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;
                PopulateMetadataForParameterMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
            }

            if (typeof(IEndpointMetadataProvider).IsAssignableFrom(parameter.ParameterType))
            {
                // Parameter type implements IEndpointMetadataProvider
                invokeArgs ??= new object[2];
                invokeArgs[0] = methodInfo;
                invokeArgs[1] = builder;

                // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x440;&#x435;&#x444;&#x43B;&#x435;&#x43A;&#x441;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; PopulateMetadata &#x434;&#x43B;&#x44F; &#x442;&#x438;&#x43F;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;
                 // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x443;&#x43D;&#x438;&#x432;&#x435;&#x440;&#x441;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x43D;&#x438;&#x43C;&#x438; &#x2014; &#x445;&#x438;&#x442;&#x440;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x44F;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;
                PopulateMetadataForEndpointMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
            }
        }

        // &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430;
        var returnType = methodInfo.ReturnType;
        if (AwaitableInfo.IsTypeAwaitable(returnType, out var awaitableInfo))
        {
            // If it&apos;s a Task&lt;T&gt; or ValueTask&lt;T&gt;, use the T as the returnType
            returnType = awaitableInfo.ResultType;
        }

        if (returnType is not null 
            &amp;&amp; typeof(IEndpointMetadataProvider).IsAssignableFrom(returnType))
        {
            // Return type implements IEndpointMetadataProvider
            invokeArgs ??= new object[2];
            invokeArgs[0] = methodInfo;
            invokeArgs[1] = builder;
            
            // &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x440;&#x435;&#x444;&#x43B;&#x435;&#x43A;&#x441;&#x438;&#x44F;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; PopulateMetadata &#x434;&#x43B;&#x44F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430;.
            PopulateMetadataForEndpointMethod.MakeGenericMethod(returnType).Invoke(null, invokeArgs);
        }
    }

    // &#x412;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x438; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430; &#x434;&#x43B;&#x44F; &#x44D;&#x444;&#x444;&#x435;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x447;&#x43B;&#x435;&#x43D;&#x43E;&#x432; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430;
    private static readonly MethodInfo PopulateMetadataForParameterMethod = typeof(EndpointMetadataPopulator).GetMethod(nameof(PopulateMetadataForParameter), BindingFlags.NonPublic | BindingFlags.Static)!;
 
    private static readonly MethodInfo PopulateMetadataForEndpointMethod = typeof(EndpointMetadataPopulator).GetMethod(nameof(PopulateMetadataForEndpoint), BindingFlags.NonPublic | BindingFlags.Static)!;

    private static void PopulateMetadataForParameter&lt;T&gt;(ParameterInfo parameter, EndpointBuilder builder)
        where T : IEndpointParameterMetadataProvider
    {
        T.PopulateMetadata(parameter, builder);
    }

    private static void PopulateMetadataForEndpoint&lt;T&gt;(MethodInfo method, EndpointBuilder builder)
        where T : IEndpointMetadataProvider
    {
        T.PopulateMetadata(method, builder);
    }
}</code></pre><p>&#x42D;&#x442;&#x43E; &#x43F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43D;&#x430;&#x441; &#x43A; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x43C;&#x443; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443; &#xA0;<code>RequestDelegateFactory.CreateArgumentsAndInferMetadata()</code>. &#x41D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; <code>Expression</code> &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43E;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43E;&#x442;&#x43A;&#x443;&#x434;&#x430; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; (&#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; API &#x2014; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435; &#x43E;&#x431; &#x44D;&#x442;&#x43E;&#x43C; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;). &#x412;&#x441;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441; &#x44D;&#x442;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x43E;&#x43C;, &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x44B; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x432; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; <code>EndpointBuilder</code>. &#x41D;&#x430; &#x44D;&#x442;&#x43E;&#x43C; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x43E;&#x441;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C; <code>RequestDelegateMetadataResult</code> &#x438;&#x437; <code>InferMetadata()</code>, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x439; &#x432;&#x441;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x438; &#x438;&#x437; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;-&#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;:</p><pre><code class="language-csharp">public static RequestDelegateMetadataResult InferMetadata(MethodInfo methodInfo, RequestDelegateFactoryOptions? options = null)
{
    var factoryContext = CreateFactoryContext(options);
    factoryContext.ArgumentExpressions = CreateArgumentsAndInferMetadata(methodInfo, factoryContext);

    // &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43A;&#x430;&#x43A;  IReadOnlyList&lt;T&gt;
    return new RequestDelegateMetadataResult
    {
        EndpointMetadata = AsReadOnlyList(factoryContext.EndpointBuilder.Metadata),
    };
}</code></pre><blockquote>&#x42F; &#x431;&#x44B;&#x43B; &#x443;&#x434;&#x438;&#x432;&#x43B;&#x435;&#x43D;, &#x443;&#x432;&#x438;&#x434;&#x435;&#x432;, &#x447;&#x442;&#x43E; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E; <code>CachedFactoryContext</code> &#x43D;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x430;. &#x42D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x43C;&#x443; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x443; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, <a href="https://github.com/dotnet/aspnetcore/pull/45865?ref=zznob.ru">&#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43F;&#x43E;&#x434;&#x43D;&#x44F;&#x43B; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x438;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430; &#x434;&#x43B;&#x44F; .NET 8</a> &#x438;, &#x43D;&#x430;&#x434;&#x435;&#x44E;&#x441;&#x44C;, &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x435;&#x441;&#x435;&#x43D;&#x430; &#x432; .NET 7!</blockquote><p>&#x41D;&#x430;&#x43A;&#x43E;&#x43D;&#x435;&#x446;, &#x43C;&#x44B; &#x434;&#x43E;&#x431;&#x440;&#x430;&#x43B;&#x438;&#x441;&#x44C; &#x434;&#x43E; &#x43A;&#x43E;&#x43D;&#x446;&#x430; &#x43D;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x433;&#x43E; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434;&#x430; &#x43D;&#x430; <code>RequestDelegateFactory.InferMetadata()</code>. &#x41E;&#x434;&#x438;&#x43D; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x44F; &#x443;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B; &#x438;&#x437; &#x432;&#x438;&#x434;&#x443;, &#x2014; &#x44D;&#x442;&#x43E; <code>CreateArgument()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x435;&#x432; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x44E;&#x442; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438;&#x437; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; <code>HttpContext</code>, &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432; <code>RequestDelegate</code>.</p><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E; &#x430;&#x43B;&#x433;&#x43E;&#x440;&#x438;&#x442;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; <code>CreateArgument()</code> &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; <code>Expression</code>, &#x438;, &#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x434;&#x43B;&#x44F; minimal API.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;.</h2><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x432;&#x43F;&#x435;&#x440;&#x432;&#x44B;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B; &#x43A;&#x43B;&#x430;&#x441;&#x441; <code>RequestDelegateFactory</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430; <code>RequestDelegate</code> &#x438;&#x437; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; API, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x432; <code>EndpointMiddleware</code>. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43B; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; <code>InferMetadata()</code>.</p><p><code>InferMetadata()</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x434;&#x43B;&#x44F; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; &#x442;&#x438;&#x43F;&#x44B; &#x435;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x442;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43F;&#x43E;&#x434;&#x440;&#x430;&#x437;&#x443;&#x43C;&#x435;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B; <code>[Produces]</code> &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x441;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x44F;. &#x412; &#x440;&#x430;&#x43C;&#x43A;&#x430;&#x445; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430; <code>InferMetadata()</code> &#x442;&#x430;&#x43A;&#x436;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442; &#x434;&#x435;&#x440;&#x435;&#x432;&#x44C;&#x44F; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438;&#x437; <code>HttpContext</code> &#x432; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; <code>RequestDelegate</code>.</p><p>&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-2-extracting-metadata-from-a-minimal-api-handler/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Воспроизведение аудио и видео в приложениях .NET MAUI с новым MediaElement]]></title><description><![CDATA[<p>&#x412;&#x44B;&#x43F;&#x443;&#x449;&#x435;&#x43D; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x430;&#x43C;&#x44B;&#x445; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; .NET</p>]]></description><link>https://zznob.ru/vosproizviedieniie-audio-i-vidieo-v-prilozhieniiakh-net-maui-s-novym-mediaelement/</link><guid isPermaLink="false">640afa75f07f800001bbf36d</guid><category><![CDATA[.Net MAUI]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Fri, 10 Mar 2023 10:05:03 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1651600444588-54790c125d30?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE1fHxNZWRpYXxlbnwwfHx8fDE2Nzg0NDI2NjA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1651600444588-54790c125d30?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE1fHxNZWRpYXxlbnwwfHx8fDE2Nzg0NDI2NjA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x412;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x430;&#x443;&#x434;&#x438;&#x43E; &#x438; &#x432;&#x438;&#x434;&#x435;&#x43E; &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445; .NET MAUI &#x441; &#x43D;&#x43E;&#x432;&#x44B;&#x43C; MediaElement"><p>&#x412;&#x44B;&#x43F;&#x443;&#x449;&#x435;&#x43D; &#x43E;&#x434;&#x438;&#x43D; &#x438;&#x437; &#x441;&#x430;&#x43C;&#x44B;&#x445; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x43C;&#x44B;&#x445; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; .NET MAUI - <code>MediaElement</code>. &#x421; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>MediaElement</code> &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x430;&#x443;&#x434;&#x438;&#x43E; &#x438; &#x432;&#x438;&#x434;&#x435;&#x43E; &#x438;&#x437; &#x441;&#x432;&#x43E;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; .NET MAUI. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x432;&#x44B; &#x443;&#x437;&#x43D;&#x430;&#x435;&#x442;&#x435; &#x432;&#x441;&#x435;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x43E; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439; &#x432;&#x435;&#x440;&#x441;&#x438;&#x438; &#x438; &#x43E; &#x43F;&#x43B;&#x430;&#x43D;&#x430;&#x445; &#x43D;&#x430; &#x431;&#x443;&#x434;&#x443;&#x449;&#x435;&#x435; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430;! <code>MediaElement</code> &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; <a href="https://github.com/communityToolkit/Maui/?ref=zznob.ru">.NET MAUI Community Toolkit</a>, &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x430;&#x43C;&#x435;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&#x43C;&#x438; &#x43F;&#x43E; &#x432;&#x441;&#x435;&#x43C;&#x443; &#x43C;&#x438;&#x440;&#x443; &#x43A;&#x430;&#x43A; &#x438;&#x437; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x441;&#x442;&#x432;&#x430;, &#x442;&#x430;&#x43A; &#x438; &#x438;&#x437; Microsoft.</p><h2 id="%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-mediaelement">&#x427;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x43E;&#x435; MediaElement?</h2><p>&#x421; <code>MediaElement</code> &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442;&#x435; &#x43C;&#x43E;&#x449;&#x43D;&#x44B;&#x439; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x43C;&#x443;&#x43B;&#x44C;&#x442;&#x438;&#x43C;&#x435;&#x434;&#x438;&#x430; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; .NET MAUI.</p><p>&#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x432;&#x44B; &#x443;&#x436;&#x435; &#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x44B; &#x441; <code>MediaElement</code> &#x438;&#x437; Xamarin Community Toolkit, &#x43A;&#x443;&#x434;&#x430; &#x43E;&#x43D; &#x431;&#x44B;&#x43B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D; &#x431;&#x43B;&#x430;&#x433;&#x43E;&#x434;&#x430;&#x440;&#x44F; &#x437;&#x430;&#x43C;&#x435;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x447;&#x43B;&#x435;&#x43D;&#x430; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x441;&#x442;&#x432;&#x430; &#x41F;&#x438;&#x442;&#x435;&#x440;&#x430; &#x424;&#x443;&#x442;&#x430;. &#x425;&#x43E;&#x442;&#x44C; &#x44D;&#x442;&#x430; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x443;&#x436;&#x435; &#x431;&#x44B;&#x43B;&#x430; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x430;, &#x432; &#x43D;&#x435;&#x439; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x431;&#x44B;&#x43B;&#x43E; &#x43C;&#x435;&#x441;&#x442;&#x43E; &#x434;&#x43B;&#x44F; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x435;&#x43D;&#x438;&#x439;, &#x43E;&#x441;&#x43E;&#x431;&#x435;&#x43D;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; Android.</p><p>&#x412;&#x43E;&#x442; &#x43F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x43F;&#x440;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x43E;&#x441;&#x435; <code>MediaElement</code> &#x43D;&#x430; .NET MAUI &#x43C;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x441; &#x43D;&#x443;&#x43B;&#x44F;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43C;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x443;&#x436;&#x435; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E;, &#x438; &#x443;&#x43B;&#x443;&#x447;&#x448;&#x438;&#x442;&#x44C; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F;.</p><h2 id="%D0%BF%D0%BE%D0%B4-%D0%BA%D0%B0%D0%BF%D0%BE%D1%82%D0%BE%D0%BC">&#x41F;&#x43E;&#x434; &#x43A;&#x430;&#x43F;&#x43E;&#x442;&#x43E;&#x43C;</h2><p>&#x414;&#x43B;&#x44F; Android &#x43C;&#x44B; &#x440;&#x435;&#x448;&#x438;&#x43B;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; <code><a href="https://exoplayer.dev/?ref=zznob.ru">ExoPlayer</a></code> &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x430;&#x43D;&#x430;&#x43B;&#x43E;&#x433;&#x430; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x432; <code>Android MediaPlayer</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43B;&#x438; &#x434;&#x43B;&#x44F; Xamarin. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43C;&#x44B; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x439;, &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x445; &#x43D;&#x430;&#x43C; &#x438;&#x437; &#x43A;&#x43E;&#x440;&#x43E;&#x431;&#x43A;&#x438;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x438;&#x434;&#x435;&#x43E; HTTP Live Streaming (HLS), &#x432;&#x435;&#x43B;&#x438;&#x43A;&#x43E;&#x43B;&#x435;&#x43F;&#x43D;&#x44B;&#x435; &#x442;&#x440;&#x430;&#x43D;&#x441;&#x43F;&#x43E;&#x440;&#x442;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x44B; &#x438; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x435; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x435;.</p><p>&#x412; iOS &#x438; macOS &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x443; <code><a href="https://developer.apple.com/documentation/avfoundation/media_playback/creating_a_basic_video_player_ios_and_tvos?ref=zznob.ru">AVPlayer</a></code>, &#x43A;&#x430;&#x43A; &#x438; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x441; Xamarin MediaElement. &#x422;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x435; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x43B;&#x441;&#x44F; Tizen, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; <code><a href="https://docs.tizen.org/application/dotnet/guides/multimedia/media-playback/?ref=zznob.ru">Tizen.Multimedia.Player</a></code>.</p><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; .NET MAUI &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x432;&#x435;&#x440;&#x445; WinUI, &#x430; &#x43D;&#x435; UWP, &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; <code><a href="https://learn.microsoft.com/windows/apps/design/controls/media-playback?ref=zznob.ru">MediaPlayerElement</a></code>. &#x425;&#x43E;&#x442;&#x44F; &#x44D;&#x442;&#x43E;&#x442; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x432; WinUI, &#x43E;&#x43D; &#x443;&#x436;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x441;&#x43E;&#x432;&#x435;&#x440;&#x448;&#x435;&#x43D;&#x435;&#x43D; &#x438; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43E;&#x431;&#x435;&#x449;&#x430;&#x44E;&#x449;&#x435;.</p><p>&#x41F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x430; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x434;&#x438;&#x430;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x43E;&#x432; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B; (&#x438;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x43E;&#x442; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x43E;&#x434;&#x435;&#x43A;&#x438; &#x432;&#x44B; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x43B;&#x438;), &#x43D;&#x43E;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x434;&#x438;&#x430;&#x43F;&#x43B;&#x435;&#x435;&#x440;&#x44B; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;, &#x43C;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x432;&#x441;&#x44E; &#x43C;&#x43E;&#x449;&#x44C; &#x438; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x441; &#x44D;&#x442;&#x438;&#x43C; &#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;.</p><h2 id="%D0%BF%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%BF%D0%B0%D0%B5%D0%BC-%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5">&#x41F;&#x440;&#x438;&#x441;&#x442;&#x443;&#x43F;&#x430;&#x435;&#x43C; &#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;</h2><p>&#x41D;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x441; <code>MediaElement</code> &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;. &#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43F;&#x430;&#x43A;&#x435;&#x442; NuGet <code><a href="https://nuget.org/packages/CommunityToolkit.Maui.MediaElement?ref=zznob.ru">CommunityToolkit.Maui.MediaElement</a></code>. &#x42D;&#x442;&#x43E; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43F;&#x430;&#x43A;&#x435;&#x442; &#x43E;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x430; Community Toolkit.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; nuget &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x430;, &#x43E;&#x442;&#x43A;&#x440;&#x43E;&#x439;&#x442;&#x435; <code>MauiProgram.cs</code> &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x443;&#x44E; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x432; <code>MauiAppBuilder</code>:</p><pre><code class="language-csharp">public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp&lt;App&gt;()
        // &#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x439;&#x442;&#x435; .NET MAUI Community Toolkit MediaElement &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x43A;&#x43E;&#x434; &#x43D;&#x438;&#x436;&#x435;
        .UseMauiCommunityToolkitMediaElement()
        // &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; .NET MAUI Community Toolkit, &#x43F;&#x440;&#x438; &#x436;&#x435;&#x43B;&#x430;&#x43D;&#x438;&#x438;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x448;&#x440;&#x438;&#x444;&#x442;&#x44B; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x432;&#x435;&#x449;&#x438;
        .ConfigureFonts(fonts =&gt;
        {
            fonts.AddFont(&quot;OpenSans-Regular.ttf&quot;, &quot;OpenSansRegular&quot;);
            fonts.AddFont(&quot;OpenSans-Semibold.ttf&quot;, &quot;OpenSansSemibold&quot;);
        });

    // &#x41F;&#x440;&#x43E;&#x434;&#x43E;&#x43B;&#x436;&#x430;&#x435;&#x43C; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; .NET MAUI &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;

    return builder.Build();
}</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x44B; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x44B; &#x43D;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; MediaElement &#x432; &#x441;&#x432;&#x43E;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;! &#x41F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43D;&#x430; XAML &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43D;&#x438;&#x436;&#x435;.</p><pre><code class="language-xml">&lt;ContentPage xmlns=&quot;http://schemas.microsoft.com/dotnet/2021/maui&quot;
             xmlns:x=&quot;http://schemas.microsoft.com/winfx/2009/xaml&quot;
             xmlns:toolkit=&quot;http://schemas.microsoft.com/dotnet/2022/maui/toolkit&quot;
             x:Class=&quot;MediaElementDemos.GettingStarted&quot;
             Title=&quot;MediaElement Getting Started&quot;&gt;

    &lt;toolkit:MediaElement x:Name=&quot;mediaElement&quot;
                      ShouldAutoPlay=&quot;True&quot;
                      ShouldShowPlaybackControls=&quot;True&quot;
                      Source=&quot;https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&quot;
                      HeightRequest=&quot;300&quot;
                      WidthRequest=&quot;400&quot;
                      ... /&gt;
&lt;/ContentPage&gt;</code></pre><p>&#x42D;&#x442;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; <code>MediaElement</code> &#x43D;&#x430; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x443;, &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x442;&#x441;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x440;&#x438; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x435; &#x432;&#x438;&#x434;&#x435;&#x43E;, &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x43D;&#x430; iOS &#x438; Windows &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x43D;&#x438;&#x436;&#x435;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://zznob.ru/content/images/2023/03/image-1.png" class="kg-image" alt="&#x412;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435; &#x430;&#x443;&#x434;&#x438;&#x43E; &#x438; &#x432;&#x438;&#x434;&#x435;&#x43E; &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445; .NET MAUI &#x441; &#x43D;&#x43E;&#x432;&#x44B;&#x43C; MediaElement" loading="lazy" width="1000" height="800" srcset="https://zznob.ru/content/images/size/w600/2023/03/image-1.png 600w, https://zznob.ru/content/images/2023/03/image-1.png 1000w" sizes="(min-width: 720px) 720px"><figcaption>MediaElement &#x432; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x438;</figcaption></figure><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443; &#x432;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43E; &#x431;&#x43E;&#x433;&#x430;&#x442;&#x44B;&#x445; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;&#x445;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443;&#x436;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x432; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439; &#x432;&#x435;&#x440;&#x441;&#x438;&#x438;, &#x43D;&#x43E; &#x432;&#x430;&#x436;&#x43D;&#x43E; &#x43E;&#x442;&#x43C;&#x435;&#x442;&#x438;&#x442;&#x44C; &#x43E;&#x434;&#x43D;&#x443; &#x432;&#x435;&#x449;&#x44C;. &#x412;&#x44B;, &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;, &#x43D;&#x435;&#x441;&#x435;&#x442;&#x435; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x437;&#x430; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432; <code>MediaElement</code>. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x432;&#x438;&#x434;&#x435;&#x43E; &#x432; &#x440;&#x435;&#x436;&#x438;&#x43C;&#x435; &#xAB;&#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x43A;&#x430; &#x432; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x43A;&#x435;&#xBB; &#x438;&#x43B;&#x438; &#x432;&#x43E;&#x441;&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x437;&#x432;&#x443;&#x43A; &#x432; &#x444;&#x43E;&#x43D;&#x43E;&#x432;&#x43E;&#x43C; &#x440;&#x435;&#x436;&#x438;&#x43C;&#x435;, &#x432; &#x44D;&#x442;&#x438;&#x445; &#x441;&#x446;&#x435;&#x43D;&#x430;&#x440;&#x438;&#x44F;&#x445; &#x43D;&#x435;&#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43E;&#x447;&#x438;&#x449;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x44B; <code>MediaElement</code>.</p><p>&#x414;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x43E; &#x43E;&#x434;&#x43D;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x43A;&#x43E;&#x434;&#x430;. &#x412; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x43C; &#x43D;&#x438;&#x436;&#x435; &#x444;&#x440;&#x430;&#x433;&#x43C;&#x435;&#x43D;&#x442;&#x435; &#x43A;&#x43E;&#x434;&#x430; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x44B; &#x43E;&#x441;&#x432;&#x43E;&#x431;&#x43E;&#x436;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C; &#x443;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43E;&#x442; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; <code>ContentPage</code>, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; <code>MediaElement</code>.</p><pre><code class="language-csharp">public partial class FreeResourcesPage : ContentPage
{
    void ContentPage_Unloaded(object? sender, EventArgs e)
    {
        // Stop and cleanup MediaElement when we navigate away
        mediaElement.Handler?.DisconnectHandler();
    }
}</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x437;&#x43D;&#x430;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43E;&#x431;&#x43E; &#x432;&#x441;&#x435;&#x445; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x445; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;&#x445; <code>MediaElement</code>, &#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x44C;&#x442;&#x435;&#x441;&#x44C; &#x441; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E;&#x439; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x435;&#x439; <a href="https://learn.microsoft.com/dotnet/communitytoolkit/maui/views/mediaelement?ref=zznob.ru">&#x43D;&#x430; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Первый взгляд за кулисы эндпоинтов minimal API]]></title><description><![CDATA[<p>&#x414;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439; &#x438;&#x437; &#x446;&#x438;&#x43A;&#x43B;&#x430; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43E;&#x442; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430;</p>]]></description><link>https://zznob.ru/piervyi-vzghliad-za-kulisy-endpointov-minimal-api/</link><guid isPermaLink="false">640a14b7f07f800001bbf102</guid><category><![CDATA[ASP.Net Core]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Thu, 09 Mar 2023 18:43:50 GMT</pubDate><media:content url="https://zznob.ru/content/images/2023/03/aspnet-core-minimal-api-social-1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://zznob.ru/content/images/2023/03/aspnet-core-minimal-api-social-1-.png" alt="&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434; &#x437;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x44B; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; minimal API"><p>&#x414;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x439; &#x438;&#x437; &#x446;&#x438;&#x43A;&#x43B;&#x430; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x43E;&#x442; &#x42D;&#x43D;&#x434;&#x440;&#x44E; &#x41B;&#x43E;&#x43A;&#x430; &quot;Behind the scenes of minimal APIs&quot;.</p><p>Minimal API &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x440;&#x435;&#x43F;&#x443;&#x442;&#x430;&#x446;&#x438;&#x44E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x44B;&#x445;, &#x43D;&#x43E; &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x434;&#x43E;&#x431;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F;? &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x445; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E; &#x43A;&#x43E;&#x434;, &#x441;&#x442;&#x43E;&#x44F;&#x449;&#x438;&#x439; &#x437;&#x430; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;&#x43C;&#x438; minimal API, &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x44E;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x442;&#x43E;&#x433;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x437;&#x44F;&#x442;&#x44C; &#x432;&#x430;&#x448; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434; &#x438; &#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43D;&#x435;&#x447;&#x442;&#x43E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x44E;&#x449;&#x435;&#x435;&#x441;&#x44F;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x44E; &#x43A;&#x43E;&#x434; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x44B;&#x441;&#x43E;&#x43A;&#x43E;&#x433;&#x43E; &#x443;&#x440;&#x43E;&#x432;&#x43D;&#x44F;, &#x441;&#x442;&#x43E;&#x44F;&#x449;&#x438;&#x439; &#x437;&#x430; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; <code>MapGet(&quot;/&quot;, () =&gt; &quot;Hello World!&quot;)</code>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x437;&#x43D;&#x430;&#x442;&#x44C; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x44B; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E;&#x442; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; <em><code>RequestDelegate</code></em>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D; ASP.NET Core.</p><p><em>&#x412;&#x435;&#x441;&#x44C; &#x43A;&#x43E;&#x434; &#x432; &#x44D;&#x442;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x435; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x430;&#x43D; &#x43D;&#x430; &#x432;&#x44B;&#x43F;&#x443;&#x441;&#x43A;&#x435; .NET 7.0.1.</em></p><h2 id="minimal-api-%D0%BD%D0%B0-%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC-%D1%85%D0%BE%D1%81%D1%82%D0%B5">Minimal Api &#x43D;&#x430; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x445;&#x43E;&#x441;&#x442;&#x435;.</h2><p>&#x41C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; API &#x431;&#x44B;&#x43B;&#x438; &#x432;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x44B; &#x432; .NET 6 &#x432;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x441; &quot;&#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x445;&#x43E;&#x441;&#x442;&#x43E;&#x43C;&quot;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x438;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x430;&#x434;&#x430;&#x43F;&#x442;&#x430;&#x446;&#x438;&#x438; &#x43A; .NET. &#x412;&#x43C;&#x435;&#x441;&#x442;&#x435; &#x43E;&#x43D;&#x438; &#x443;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x44F;&#x44E;&#x442; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x442;&#x435;&#x43B;&#x43E;&#x434;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x439;, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x441; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;&#x43C; ASP.NET Core &#x43D;&#x430; &#x431;&#x430;&#x437;&#x435; &#x43E;&#x431;&#x449;&#x435;&#x433;&#x43E; &#x445;&#x43E;&#x441;&#x442;&#x430; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; MVC. &#x411;&#x430;&#x437;&#x43E;&#x432;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; hello world &#x432; MVC &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x44C; &#x438;&#x437; 50&#x2013;100 &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x43A;&#x43E;&#x434;&#x430;, &#x440;&#x430;&#x441;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x430;&#x43A; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x443;&#x43C; &#x43F;&#x43E; 3 &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;&#x43C;. &#x421; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; API &#x44D;&#x442;&#x43E; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;, &#x43A;&#x430;&#x43A;:</p><figure class="kg-card kg-code-card"><pre><code class="language-csharp">WebApplicationBuilder builder = new WebApplication.CreateBuilder(args);
WebApplication app = builder.Build();

app.MapGet(&quot;/&quot;, () =&gt; &quot;&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x43C;&#x438;&#x440;!&quot;);

app.Run();</code></pre><figcaption>&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; API &#x43D;&#x430; .Net 7</figcaption></figure><p>&#x41E;&#x447;&#x435;&#x432;&#x438;&#x434;&#x43D;&#x43E;, &#x447;&#x442;&#x43E; &#x432; &#x44D;&#x442;&#x438;&#x445; &#x447;&#x435;&#x442;&#x44B;&#x440;&#x435;&#x445; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430;&#x445; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x435;, &#x43E;&#x442; &#x447;&#x435;&#x433;&#x43E; &#x432;&#x44B; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x433;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43B;&#x438;&#x441;&#x44C;. &#x423; &#x432;&#x430;&#x441; &#x432;&#x441;&#x435; &#x435;&#x449;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x442;&#x435; &#x436;&#x435; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x447;&#x442;&#x43E; &#x438; &#x443; &#x43E;&#x431;&#x449;&#x435;&#x433;&#x43E; &#x445;&#x43E;&#x441;&#x442;&#x430;, &#x43D;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x430;&#x44F; &#x438;&#x445; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x441;&#x43A;&#x440;&#x44B;&#x442;&#x430; &#x43E;&#x442; &#x432;&#x430;&#x441;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x435; &#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; <em><code>WebApplication</code>, </em>&#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434; <em><code>() =&gt; &quot;Hello world!&quot;</code> </em>&#x43F;&#x440;&#x435;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; <em><code>RequestDelegate</code></em>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;.</p><h2 id="%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-requestdelegate">&#x427;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x43E;&#x435; RequestDelegate?</h2><p>&#x41F;&#x440;&#x435;&#x436;&#x434;&#x435; &#x447;&#x435;&#x43C; &#x434;&#x432;&#x438;&#x433;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435;, &#x43C;&#x44B; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x438;&#x442;&#x44C; &#x43D;&#x430; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;: &quot;<em>&#x427;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x43E;&#x435; <code>RequestDelegate</code></em>&quot;? &#x421;&#x43E;&#x433;&#x43B;&#x430;&#x441;&#x43D;&#x43E; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438;, <a href="https://learn.microsoft.com/ru-ru/dotnet/api/microsoft.aspnetcore.http.requestdelegate?ref=zznob.ru"><code>RequestDelegate</code> </a>&#x2014; &#x44D;&#x442;&#x43E;:</p><blockquote>&#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; HTTP-&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</blockquote><p>&#x427;&#x442;&#x43E; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x431;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x43D;&#x44B;&#x43C; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C;. &#x41D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x43D;&#x430; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430;, &#x442;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x43E;&#x43D;&#x43E; &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x43E; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E;:</p><pre><code class="language-csharp">public delegate Task RequestDelegate(HttpContext context);</code></pre><p>&#x418;&#x442;&#x430;&#x43A;, <code>RequestDelegate</code> &#x2014; &#x44D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; <code>HttpContext</code> &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; <code>Task</code>.</p><p>&#x414;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A; &quot;&#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439;&quot; <code>Func&lt;T&gt;</code>. &#x41E;&#x43D;&#x438; &#x432;&#x43E; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x438;, &#x445;&#x43E;&#x442;&#x44F; &#x443; &#x43D;&#x438;&#x445; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x435;&#x43C;&#x430;&#x43D;&#x442;&#x438;&#x43A;&#x430; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x439; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443; &#x437;&#x434;&#x435;&#x441;&#x44C; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C;).</p><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x44B; &#x441; ASP.NET Core, &#x432;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x441;&#x445;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x44C; &#x441; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x43E;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>Invoke</code> &#x434;&#x43B;&#x44F; middleware:</p><figure class="kg-card kg-code-card"><pre><code class="language-csharp">public class MyMiddleware
{
    private readonly RequestDelegate _next;
    public MyMiddleware(RequestDelegate next)
        =&gt; _next = next;

    public Task Invoke(HttpContext context)
    {
        // &#x427;&#x442;&#x43E; &#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C;...
        return _next(context);
    }
}</code></pre><figcaption>&#x43C;&#x435;&#x442;&#x43E;&#x434; Invoke</figcaption></figure><p>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x43C; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E;&#x43C; <em><code>RequestDelegate</code></em>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x438;&#x437; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x448;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;, &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x446;&#x435;&#x43F;&#x43E;&#x447;&#x43A;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x432;. &#x422;&#x430;&#x43A;, <em>Invoke </em>&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D; &#x43A; <em><code>RequestDelegate</code> </em>&#x438;, &#x432; &#x441;&#x432;&#x43E;&#x44E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x44C;, &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <em><code>RequestDelegate</code></em>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x430;&#x43C; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; <em><code>RequestDelegate</code></em>. &#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &quot;&#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x439;&#x435;&#x440; middleware&quot; &#x434;&#x43B;&#x44F; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;.</p><p>&#x418;&#x442;&#x430;&#x43A;, &#x435;&#x441;&#x43B;&#x438; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; endpoint API, &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x43A;&#x430;&#x43A;</p><pre><code class="language-csharp">app.MapGet(&quot;/&quot;, () =&gt; &quot;&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x43C;&#x438;&#x440;!&quot;);</code></pre><p>&#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x432;&#x437;&#x44F;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; endpoint`&#x430; (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; <em>RequestDelegate</em>, &#x43F;&#x43E;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x443; &#x43D;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;&#x44B;), &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; <em>RequestDelegate</em>. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x43D;&#x430; &#x432;&#x44B;&#x441;&#x43E;&#x43A;&#x43E;&#x43C; &#x443;&#x440;&#x43E;&#x432;&#x43D;&#x435;, &#x430; &#x432; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x431;&#x438;&#x440;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x442;&#x43E;&#x43D;&#x43A;&#x43E;&#x441;&#x442;&#x44F;&#x43C;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <em>RequestDelegate</em>.</p><h2 id="%D0%BE%D1%82-mapget-%D0%B4%D0%BE-routeentry">&#x41E;&#x442; MapGet &#x434;&#x43E; RouteEntry</h2><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; <em><code>MapGet()</code></em> &#x432; <code>WebApplication</code> (&#x438;&#x43B;&#x438; <em><code>MapPost()</code></em>, &#x438;&#x43B;&#x438; <em><code>MapFallback()</code></em>, &#x438;&#x43B;&#x438; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x439; Map*()), <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs?ref=zznob.ru">&#x432;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; <em>IEndpointRouteBuilder</em></a>. &#x412; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x43A;&#x43E;&#x43D;&#x446;&#x43E;&#x432;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x440;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x435; &#x437;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x430;&#x43C;&#x438; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x434;&#x430;&#x43B;&#x435;&#x43A;&#x43E; &#x432;&#x43D;&#x438;&#x437;, &#x432;&#x44B; &#x434;&#x43E;&#x441;&#x442;&#x438;&#x433;&#x43D;&#x435;&#x442;&#x435; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; Map(), &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">private static RouteHandlerBuilder Map(
    this IEndpointRouteBuilder endpoints,
    RoutePattern pattern,
    Delegate handler,
    IEnumerable&lt;string&gt;? httpMethods,
    bool isFallback)
{
    RouteEndpointDataSource dataSource = endpoints.GetOrAddRouteEndpointDataSource();
    return dataSource.AddRouteHandler(pattern, handler, httpMethods, isFallback);
}</code></pre><p>&#x410;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; <code>Delegate handler</code> &#x2014; &#x44D;&#x442;&#x43E; &#x43B;&#x44F;&#x43C;&#x431;&#x434;&#x430;-&#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x438; &#x43C;&#x430;&#x43F;&#x43F;&#x438;&#x43D;&#x433;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;. &#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x43D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x44D;&#x442;&#x430;&#x43F;&#x435; &#x44D;&#x442;&#x43E; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43E;&#x431;&#x449;&#x438;&#x439; &#x442;&#x438;&#x43F; <code>Delegate</code>, &#x43F;&#x43E;&#x437;&#x436;&#x435; &#x43D;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x438;&#x437; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x430; &#x438; &#x440;&#x435;&#x448;&#x438;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x438;&#x445; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C;, &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x438;&#x43B;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x44B; &#x438;&#x437; DI.</p><p>&#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x43A;&#x430;&#x435;&#x442; <code>RouteEndpointDataSource</code> &#x438;&#x437; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439;, &#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43E;&#x432; (&#x440;&#x43E;&#x443;&#x442;&#x43E;&#x432;) &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;. &#x41C;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E;, &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44F; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x433;&#x43E; <code>AddRouteHandler()</code>. &#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>RouteEntry</code> (&#x43F;&#x43E; &#x441;&#x443;&#x442;&#x438;, &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43F;&#x430;&#x43A;&#x435;&#x442; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;) &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E;. &#x41E;&#x43D; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>RouteHandlerBuilder</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x432;&#x430;&#x43C; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; endpoint, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x43A; &#x43D;&#x435;&#x439;, &#x43A; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x443;, &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;.</p><p>&#x412;&#x43E;&#x442;, &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;, &#x438; &#x432;&#x441;&#x435;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435; <code>MapGet</code>, &#x43E;&#x43D; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; endpoint`&#x43E;&#x432;. &#x412;&#x441;&#x435; &#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x441;&#x44F; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x44B;&#x43C;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; <code>app.Run()</code> &#x438; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p><h2 id="%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%8D%D0%BD%D0%B4%D0%BF%D0%BE%D0%B8%D0%BD%D1%82%D0%BE%D0%B2">&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432;</h2><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442;&#x435; &#x441;&#x432;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43A; ASP.NET Core, &#x433;&#x434;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43F;&#x43E;&#x43F;&#x430;&#x434;&#x430;&#x435;&#x442; &#x432; <code>EndpointRoutingMiddleware</code> (&#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x435;&#x44F;&#x432;&#x43D;&#x43E; &#x438;&#x43B;&#x438; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x43E;&#x43C; <code>UseRouting()</code>), middleware &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x441;&#x435;&#x445; &#x432;&#x430;&#x448;&#x438;&#x445; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; (&#x438; &#x433;&#x440;&#x430;&#x444;&#x430; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43E;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x43E;&#x43D;&#x438; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442;).</p><p>&#x414;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; <code>RouteEntry</code> &#x432; <code>RouteEndpointDataSource(&#x430;&#x445;)</code> &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43E;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>CreateRouteEndpointBuilder()</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440; <code>RouteEndpointBuilder</code>. &#x41E;&#x43D; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x432;&#x441;&#x435; &#x43E;&#x431;&#x449;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x431; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435;, &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x438;&#x43C;&#x44F;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; OpenAPI, &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x430;&#x432;&#x442;&#x43E;&#x440;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x438; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x432;&#x435;&#x442; &#x43D;&#x430; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.</p><p><a href="https://github.com/dotnet/aspnetcore/blob/001af9cf1aeae1f8e17ecc638f138f1cfda02a75/src/Http/Routing/src/RouteEndpointDataSource.cs?ref=zznob.ru#L127-L147">&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x444;&#x440;&#x430;&#x433;&#x43C;&#x435;&#x43D;&#x442;</a> &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x438;&#x43C;&#x44F; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43F;&#x44B;&#x442;&#x430;&#x44F;&#x441;&#x44C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x435; &quot;&#x440;&#x430;&#x437;&#x443;&#x43C;&#x43D;&#x43E;&#x435;&quot; &#x438;&#x43C;&#x44F;, &#x442;&#x430;&#x43A;&#x43E;&#x435; &#x43A;&#x430;&#x43A; &#x438;&#x43C;&#x44F; &#x43A;&#x43E;&#x43D;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x438;&#x43B;&#x438; &#x438;&#x43C;&#x44F; &#x43B;&#x43E;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;. &#x415;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; (&#x43A;&#x430;&#x43A; &#x432; &#x43D;&#x430;&#x448;&#x435;&#x43C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x43C; <code>() =&gt; &quot;Hello World!&quot;</code>), &#x432;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x435; &#x438;&#x43C;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D; HTTP: &#xA0;<code>HTTP: GET /</code>.</p><pre><code class="language-csharp">var displayName = pattern.RawText ?? pattern.DebuggerToString();

// &#x41D;&#x435; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x439;&#x442;&#x435; &#x438;&#x43C;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443; &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x435; &#x438;&#x43C;&#x44F; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &quot;Invoke&quot;.
// ApplicationBuilder.Build(). &#x42D;&#x442;&#x43E; &#x431;&#x44B;&#x43B;&#x43E; &#x437;&#x430;&#x43C;&#x435;&#x447;&#x435;&#x43D;&#x43E; &#x432; MapSignalRTests &#x438; &#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;. &#x412;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x43C;&#x44B; &#x43F;&#x440;&#x438;&#x434;&#x443;&#x43C;&#x430;&#x435;&#x43C;
// &#x43B;&#x443;&#x447;&#x448;&#x443;&#x44E; &#x44D;&#x432;&#x440;&#x438;&#x441;&#x442;&#x438;&#x43A;&#x443; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x43C;&#x44B; &#x441;&#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x433;&#x43E;. Inline lambdas - &#x44D;&#x442;&#x43E;
// &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x43D;&#x438; &#x43E;&#x442;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x430;&#x436;&#x435; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x43E;&#x432; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43E;&#x432;.
if (isRouteHandler &amp;&amp; TypeHelper.TryGetNonCompilerGeneratedMethodName(handler.Method, out var methodName))
{
    displayName = $&quot;{displayName} =&gt; {methodName}&quot;;
}

if (entry.HttpMethods is not null)
{
    // &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; HTTP &#x43A; DisplayName, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43D;&#x43E;&#x43C;&#x443; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430; + &#x438;&#x43C;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;
    displayName = $&quot;HTTP: {string.Join(&quot;, &quot;, entry.HttpMethods)} {displayName}&quot;;
}

if (isFallback)
{
    displayName = $&quot;Fallback {displayName}&quot;;
}</code></pre><p>&#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;. &#x42F; &#x43D;&#x435; &#x441;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;, &#x43D;&#x43E; &quot;&#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;&quot; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x432; &#x441;&#x435;&#x431;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432; &#x432; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A;</p><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, CreateRouteEndpointBuilder() &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x432; &#x442;&#x430;&#x43A;&#x43E;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435;:</p><ul><li><code>MethodInfo</code> &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F;.</li><li>&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>HttpMethodMetadata</code>, &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x438;&#x439; HTTP-&#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x44B;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;.</li><li>&#x414;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; route-group &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x43D;&#x446;&#x438;&#x438;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x433;&#x43B;&#x430;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43A; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;.</li><li>&#x427;&#x438;&#x442;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x438; &#x432;&#x44B;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x432;&#x441;&#x435; &#x435;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x44B; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x438; &#x438;&#x445; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;, &#x43A;&#x44D;&#x448;&#x438;&#x440;&#x443;&#x44F; &#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x44F;&#x44F; &#x438;&#x445; &#x43A;&#x430;&#x43A; <code>RequestDelegateMetadataResult</code>, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; <code>RequestDelegateFactory</code>.</li><li>&#x42D;&#x442;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; &#x448;&#x430;&#x433;, &#x433;&#x434;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430;&#x44F; &#x43C;&#x430;&#x433;&#x438;&#x44F;. &#x42F; &#x441;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x44E;&#x441;&#x44C; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x432; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;.</li><li>&#x414;&#x43E;&#x431;&#x44B;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43B;&#x44E;&#x431;&#x44B;&#x435; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x443;, &#x432; &#x43A;&#x430;&#x447;&#x435;&#x441;&#x442;&#x432;&#x435; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; (&#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x430;&#x43A; <code>[Authorize]</code> &#x438; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x435;).</li><li>&#x414;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x43D;&#x446;&#x438;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x433;&#x43B;&#x430;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43A; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;.</li><li>&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x440;&#x430;&#x43D;&#x435;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x44B;&#x439; <code>RequestDelegateMetadataResult</code> &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;.</li><li>&#x414;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &quot;&#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439;&quot; route-group &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x43D;&#x446;&#x438;&#x438;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x433;&#x43B;&#x430;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43A; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x443;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;.</li></ul><p>&#x412;&#x441;&#x435; &#x44D;&#x442;&#x438; &#x448;&#x430;&#x433;&#x438; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x441;&#x43F;&#x43B;&#x44B;&#x432;&#x447;&#x430;&#x442;&#x44B;, &#x43D;&#x43E; &#x43D;&#x430; &#x434;&#x432;&#x443;&#x445; &#x43D;&#x430;&#x438;&#x431;&#x43E;&#x43B;&#x435;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x445; &#x44D;&#x442;&#x430;&#x43F;&#x430;&#x445; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x44E;&#x442;&#x441;&#x44F; <code>RequestDelegateMetadataResult</code> &#x438; <code>RequestDelegate</code>. &#x41C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x44D;&#x442;&#x438; &#x448;&#x430;&#x433;&#x438; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x43F;&#x43E;&#x437;&#x436;&#x435; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x445;.</p><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; <code>RouteEndpointBuilder</code> &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442; <code>RequestDelegate</code> &#x438; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x437;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x44B;, <code>RouteEndpointDataSource</code> &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>RouteEndpointBuilder.Build()</code>. &#x42D;&#x442;&#x43E; &#x437;&#x430;&#x432;&#x435;&#x440;&#x448;&#x430;&#x435;&#x442; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x43A;&#x430;&#x43A; <code>RouteEndpoint</code>. &#x41A;&#x430;&#x43A; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432;&#x441;&#x435; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x44B;&#x435; &#x442;&#x43E;&#x447;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x44B;, <code>DfaMatcher</code> &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x435; &#x434;&#x435;&#x43B;&#x43E;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x433;&#x440;&#x430;&#x444; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x44B;&#x445; &#x432; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><figure class="kg-card kg-image-card"><img src="https://zznob.ru/content/images/2023/03/image.png" class="kg-image" alt="&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434; &#x437;&#x430; &#x43A;&#x443;&#x43B;&#x438;&#x441;&#x44B; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432; minimal API" loading="lazy" width="2000" height="801" srcset="https://zznob.ru/content/images/size/w600/2023/03/image.png 600w, https://zznob.ru/content/images/size/w1000/2023/03/image.png 1000w, https://zznob.ru/content/images/size/w1600/2023/03/image.png 1600w, https://zznob.ru/content/images/size/w2400/2023/03/image.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; <code>DfaMatcher</code> <code>EndpointRoutingMiddleware</code> &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x443;&#x44E; &#x442;&#x43E;&#x447;&#x43A;&#x443; &#x434;&#x43B;&#x44F; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x438; <code>RequestDelegate</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;.</p><h2 id="%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5-requestdelegatefactoryoptions-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-shoulddisableinferredbodyparameters">&#x41F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; RequestDelegateFactoryOptions &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; ShouldDisableInferredBodyParameters</h2><p>&#x420;&#x430;&#x43D;&#x435;&#x435; &#x44F; &#x443;&#x43F;&#x43E;&#x43C;&#x438;&#x43D;&#x430;&#x43B;, &#x447;&#x442;&#x43E; &#x432;&#x44B;&#x432;&#x43E;&#x434; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x431; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435; &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; <code>RequestDelegate</code> &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x43C;&#x438; &#x447;&#x430;&#x441;&#x442;&#x44F;&#x43C;&#x438; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;. &#x41F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x448;&#x430;&#x433;&#x43E;&#x43C; &#x434;&#x43B;&#x44F; &#x43D;&#x438;&#x445; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; <code>RequestDelegateFactoryOptions</code>. <a href="https://github.com/dotnet/aspnetcore/blob/v7.0.1/src/Http/Routing/src/RouteEndpointDataSource.cs?ref=zznob.ru#L258-L274">&#x42D;&#x442;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; <code>CreateRDFOptions()</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43D;&#x438;&#x436;&#x435;</a>.</p><pre><code class="language-csharp">private RequestDelegateFactoryOptions CreateRDFOptions(
    RouteEntry entry, RoutePattern pattern, RouteEndpointBuilder builder)
{
    var routeParamNames = new List&lt;string&gt;(pattern.Parameters.Count);
    foreach (var parameter in pattern.Parameters)
    {
        routeParamNames.Add(parameter.Name);
    }

    return new()
    {
        ServiceProvider = _applicationServices,
        RouteParameterNames = routeParamNames,
        ThrowOnBadRequest = _throwOnBadRequest,
        DisableInferBodyFromParameters = ShouldDisableInferredBodyParameters(entry.HttpMethods),
        EndpointBuilder = builder,
    };
}</code></pre><p>&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x448;&#x430;&#x433;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x442;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x441;&#x435;&#x445; &#x438;&#x43C;&#x435;&#x43D; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x438;&#x437; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x434;&#x43B;&#x44F; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x442;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x43A;&#x430;&#x43A; <code>/users/{id}</code>, &#x44D;&#x442;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A;, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x439; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x438;&#x434;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;.</p><blockquote><code>RoutePatternParser</code> &#x43E;&#x442;&#x432;&#x435;&#x447;&#x430;&#x435;&#x442; &#x437;&#x430; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x442;&#x438;&#x43F;&#x430; <code>/users/{id}</code> &#x438; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x435;&#x435; &#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>RoutePattern</code> &#x441;&#x43E; &#x432;&#x441;&#x435;&#x43C;&#x438; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x438;&#x434;&#x435;&#x43D;&#x442;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;&#x438; &#x441;&#x435;&#x433;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C;&#x438;, &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x43C;&#x438;, &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;. &#x422;&#x430;&#x43C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; 600 &#x441;&#x442;&#x440;&#x43E;&#x43A; &#x43A;&#x43E;&#x434;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43F;&#x440;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43B; &#x44D;&#x442;&#x43E;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x432; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435;!</blockquote><p>&#x41F;&#x43E;&#x43C;&#x438;&#x43C;&#x43E; &#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x43C;&#x435;&#x43D; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x430;, &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>options</code> &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x440;&#x443;&#x433;&#x438;&#x435; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438;. &#x41F;&#x43E;&#x43B;&#x435; <code>_applicationServices</code> &#x2014; &#x44D;&#x442;&#x43E; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; DI (IServiceProvider) &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x430; &#x43F;&#x43E;&#x43B;&#x435; <code>_throwOnBadRequest</code> &#x437;&#x430;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E;&#x43C; <code>RouteHandlerOptions.ThrowOnBadRequest</code> (&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; true &#x43F;&#x440;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x432; dev).</p><p>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; <code>CreateRDFOptions</code> &#x2014; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>ShouldDisableInferredBodyParameters</code>. &#x42D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432;&#x44B;&#x447;&#x438;&#x441;&#x43B;&#x44F;&#x435;&#x442;, &#x43A;&#x430;&#x43A; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430; &#x432; &#x432;&#x430;&#x448;&#x435;&#x43C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x435;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; <code>MapPost</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x438;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code class="language-csharp">app.MapPost(&quot;/users&quot;, (UserModel user) =&gt; {});</code></pre><p>&#x442;&#x43E;&#x433;&#x434;&#x430; minimal API &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>UserModel</code> &#x441; &#x442;&#x435;&#x43B;&#x43E;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x443; &#x432;&#x430;&#x441; &#x435;&#x441;&#x442;&#x44C; &#x442;&#x43E;&#x442; &#x436;&#x435; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442; &#x441; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x43C; <code>MapGet</code>:</p><pre><code class="language-csharp">app.MapGet(&quot;/users&quot;, (UserModel user) =&gt; {});</code></pre><p>&#x442;&#x43E;&#x433;&#x434;&#x430; API &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; <code>UserModel</code> &#x43A;&#x430;&#x43A; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x443; &#x432; DI, &#x438;, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D;&#x430; &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x430; (&#x447;&#x442;&#x43E;, &#x43F;&#x43E;-&#x432;&#x438;&#x434;&#x438;&#x43C;&#x43E;&#x43C;&#x443;, &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442;!) &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x442; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435; <code>InvalidOperationException</code>.</p><p>&#x414;&#x43E;&#x43B;&#x436;&#x43D;&#x430; &#x43B;&#x438; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x430;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x43F;&#x44B;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x438;&#x43B;&#x438; &#x43D;&#x435;&#x442;, &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E;&#x43C; <code>RequestDelegateFactoryOptions.DisableInferBodyFromParameters</code>, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x437;&#x430;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>ShouldDisableInferredBodyParameters()</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43D;&#x438;&#x436;&#x435;.</p><pre><code class="language-csharp">private static bool ShouldDisableInferredBodyParameters(IEnumerable&lt;string&gt;? httpMethods)
{
    static bool ShouldDisableInferredBodyForMethod(string method) =&gt;
        // GET, DELETE, HEAD, CONNECT, TRACE, and OPTIONS normally do not contain bodies
        method.Equals(HttpMethods.Get, StringComparison.Ordinal) ||
        method.Equals(HttpMethods.Delete, StringComparison.Ordinal) ||
        method.Equals(HttpMethods.Head, StringComparison.Ordinal) ||
        method.Equals(HttpMethods.Options, StringComparison.Ordinal) ||
        method.Equals(HttpMethods.Trace, StringComparison.Ordinal) ||
        method.Equals(HttpMethods.Connect, StringComparison.Ordinal);

    // If the endpoint accepts any kind of request, we should still infer parameters can come from the body.
    if (httpMethods is null)
    {
        return false;
    }

    foreach (var method in httpMethods)
    {
        if (ShouldDisableInferredBodyForMethod(method))
        {
            // If the route handler was mapped explicitly to handle an HTTP method that does not normally have a request body,
            // we assume any invocation of the handler will not have a request body no matter what other HTTP methods it may support.
            return true;
        }
    }

    return false;
}</code></pre><p>&#x41B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x437;&#x44E;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;:</p><ul><li>&#x41F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43B;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442; &#x432;&#x441;&#x435; &#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x44B; HTTP? &#x415;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x442;&#x430;&#x43A;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</li><li>&#x41F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43B;&#x438; &#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x437; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;: GET, DELETE, HEAD, CONNECT, TRACE, OPTIONS. &#x415;&#x441;&#x43B;&#x438; &#x44D;&#x442;&#x43E; &#x442;&#x430;&#x43A;, &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;.</li><li>&#x412; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443;.</li></ul><p>&#x412; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; <code>MapGet</code> &#x438;&#x43B;&#x438; <code>MapPost</code>, &#x432;&#x430;&#x448;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x44E;&#x442; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x438;&#x43D; HTTP-&#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43A; &#x442;&#x435;&#x43B;&#x443;.</p><blockquote>&#x41E;&#x431;&#x440;&#x430;&#x442;&#x438;&#x442;&#x435; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x43C;&#x443;&#x44E; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x443; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x412;&#x44B; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <code>[FromBody]</code> &#x438; &#x43F;&#x440;&#x438;&#x43D;&#x443;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; <code>GET</code>.</blockquote><p>&#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x442;&#x438;&#x43F; <code>RequestDelegateFactory</code> &#x438; &#x443;&#x437;&#x43D;&#x430;&#x435;&#x43C;, &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x43A;&#x430; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x432; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; API &#x438; &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; <code>RequestDelegate</code>.</p><h2 id="%D0%BF%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D1%8F-%D0%B8%D1%82%D0%BE%D0%B3">&#x41F;&#x43E;&#x434;&#x432;&#x43E;&#x434;&#x44F; &#x438;&#x442;&#x43E;&#x433;</h2><p><br>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x432;&#x44B;&#x441;&#x43E;&#x43A;&#x43E;&#x443;&#x440;&#x43E;&#x432;&#x43D;&#x435;&#x432;&#x43E;&#x435; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x432;&#x44B;&#x437;&#x43E;&#x432; <code>MapGet()</code> &#x432; <code>WebApplication</code> &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44E; <code>RequestDelegate</code> &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x412;&#x44B;&#x437;&#x43E;&#x432; <code>MapGet()</code> &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; <code>RouteEntry</code> &#x432; <code>RouteEndpointDataSource</code>, &#x43D;&#x43E; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x435; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x441;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x43E; &#x442;&#x435;&#x445; &#x43F;&#x43E;&#x440;, &#x43F;&#x43E;&#x43A;&#x430; &#x445;&#x43E;&#x441;&#x442; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x443;&#x449;&#x435;&#x43D; &#x438; &#x432;&#x44B; &#x43D;&#x435; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x442;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B;.</p><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; middleware &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x441;&#x432;&#x43E;&#x439; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;, &#x43E;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; <code>CreateRouteEndpointBuilder()</code> &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x433;&#x43E; <code>RouteEntry</code>. &#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x432;&#x441;&#x435;&#x445; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43A; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x443; (&#x438;&#x43B;&#x438; &#x43A; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x433;&#x440;&#x443;&#x43F;&#x43F;&#x435; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x43E;&#x432;, &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;), &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x43C;&#x43E;&#x435; &#x438;&#x43C;&#x44F; &#x434;&#x43B;&#x44F; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; <code>RequestDelegate</code>. &#x42D;&#x442;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; &#x433;&#x440;&#x430;&#x444;&#x430; DFA &#x434;&#x43B;&#x44F; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x43E;&#x432;.</p><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x430;&#x447;&#x430;&#x43B; &#x43F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x430;&#x442;&#x440;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x44F; <code>RequestDelegate</code>, &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44F;, &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x430; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x439; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440; &#x43A; &#x442;&#x435;&#x43B;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x43C;&#x44B;&#x43C;&#x438; HTTP-&#x433;&#x43B;&#x430;&#x433;&#x43E;&#x43B;&#x430;&#x43C;&#x438;. &#x412; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x43C;&#x44B; &#x432;&#x43E;&#x437;&#x44C;&#x43C;&#x435;&#x43C; &#x44D;&#x442;&#x438; &#x434;&#x435;&#x442;&#x430;&#x43B;&#x438; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x430;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E; &#x44D;&#x43D;&#x434;&#x43F;&#x43E;&#x438;&#x43D;&#x442;&#x435;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x43A;&#x43E;&#x43D;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; <code>RequestDelegate</code>.</p><p>&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; <a href="https://andrewlock.net/behind-the-scenes-of-minimal-apis-1-a-first-look-behind-the-scenes-of-minimal-api-endpoints/?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Предотвращаем случайное раскрытие секретов конфигураций]]></title><description><![CDATA[<p>&#x412; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x44B; (&#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x438;, &#x442;&#x43E;&#x43A;&#x435;&#x43D;&#x44B; &#x43E;&#x442;</p>]]></description><link>https://zznob.ru/priachiem-siekriety-konfighuratsii/</link><guid isPermaLink="false">6408c699f07f800001bbf0a0</guid><category><![CDATA[Заметки о dotNet]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Wed, 08 Mar 2023 17:49:17 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1553991562-9f24b119ff51?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fHNlY3JldHxlbnwwfHx8fDE2NzgyOTY4MjI&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1553991562-9f24b119ff51?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDZ8fHNlY3JldHxlbnwwfHx8fDE2NzgyOTY4MjI&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x41F;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E;&#x435; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x435; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43E;&#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x439;"><p>&#x412; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&#x445; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x44B; (&#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x438;, &#x442;&#x43E;&#x43A;&#x435;&#x43D;&#x44B; &#x43E;&#x442; API &#x438; &#x442;&#x430;&#x43A; &#x434;&#x430;&#x43B;&#x435;&#x435;) &#x434;&#x43B;&#x44F; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430; &#x43A; &#x431;&#x430;&#x437;&#x430;&#x43C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x43B;&#x438; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x43C; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x430;&#x43C;. &#x421;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x44B; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x444;&#x430;&#x439;&#x43B;&#x430; &#x438;&#x43B;&#x438; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x43B;&#x438;&#x449;&#x430; (Azure Vault, Google Secret Manager &#x438; &#x442;.&#x434;.). &#x42D;&#x442;&#x438; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x44B; &#x447;&#x430;&#x441;&#x442;&#x43E; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x44B; &#x432; &#x432;&#x438;&#x434;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;, &#x447;&#x442;&#x43E; &#x43E;&#x431;&#x43B;&#x435;&#x433;&#x447;&#x430;&#x435;&#x442; &#x438;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E;&#x435; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x435;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D; &#x432; &#x43B;&#x43E;&#x433; &#x438;&#x43B;&#x438; &#x441;&#x442;&#x430;&#x442;&#x44C; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; json. &#x41A;&#x440;&#x43E;&#x43C;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C;, &#x433;&#x434;&#x435; &#x432; &#x43A;&#x43E;&#x434;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x442;&#x438;&#x43F; string.</p><pre><code class="language-csharp">class MyDbConfiguration
{
    // 1. &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430;
    // 2. &#x422;&#x440;&#x443;&#x434;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x430; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43E;&#x43C;
    public string ConnectionString { get; set; }
}</code></pre><p>&#x412; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x435; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x432; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x432; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x43E;&#x43C; &#x432;&#x438;&#x434;&#x435; (&#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F;, &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x44B;&#x439; &#x444;&#x430;&#x439;&#x43B;), &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43D;&#x435;&#x442; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x437;&#x430;&#x449;&#x438;&#x449;&#x430;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438;. &#x426;&#x435;&#x43B;&#x44C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x438;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E;&#x435; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x435; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x430; &#x43D;&#x435; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x449;&#x438;&#x442;&#x438;&#x442;&#x44C; &#x438;&#x445;. &#x420;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x443;&#x44E; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x443; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43D;&#x435; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x438;&#x445; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x432;&#x430;&#x436;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x438; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; . &#x422;&#x430;&#x43A;&#x436;&#x435; &#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x430; &#x43D;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x430; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x442;&#x44C; <em>ToString</em>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x437;&#x431;&#x435;&#x436;&#x430;&#x442;&#x44C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439;&#x43D;&#x43E;&#x433;&#x43E; &#x440;&#x430;&#x441;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F;. &#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439; .NET &#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x43F;&#x430;&#x43A;&#x435;&#x442; <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration?WT.mc_id=DT-MVP-5003978&amp;ref=zznob.ru">Microsoft.Extensions.Configuration</a> &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438;. &#x41E;&#x43D; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x44F;&#x437;&#x430;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43A; &#x43B;&#x44E;&#x431;&#x43E;&#x43C;&#x443; &#x442;&#x438;&#x43F;&#x443; &#x43F;&#x440;&#x438; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x438; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x43E;&#x433;&#x43E; <a href="https://learn.microsoft.com/ru-ru/dotnet/api/system.componentmodel.typeconverter?WT.mc_id=DT-MVP-5003978&amp;ref=zznob.ru">TypeConverter`&#x430;</a>.</p><p>&#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x434;&#x43B;&#x44F; &#x43D;&#x430;&#x448;&#x438;&#x445; &#x441;&#x435;&#x43A;&#x440;&#x435;&#x442;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x43B;&#x430;&#x441;&#x441; <em>Secret</em> &#x438; &#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x440;&#x442;&#x435;&#x440; &#x442;&#x438;&#x43F;&#x430; &#x434;&#x43B;&#x44F; &#x43D;&#x435;&#x433;&#x43E;:</p><pre><code class="language-csharp">[TypeConverter(typeof(ConfigurationSecretTypeConverter))]
internal sealed class Secret
{
    // &#x41D;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; System.String, &#x442;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x44B; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44F;.
    // &#x41D;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442; System.Text.Json &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; ReadOnlyMemory&lt;char&gt;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x435;&#x433;&#x43E; &#x43D;&#x435;&#x43B;&#x44C;&#x437;&#x44F; &#x441;&#x435;&#x440;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;.
    private readonly ReadOnlyMemory&lt;char&gt; _data;

    public Secret(string value)
    {
        ArgumentException.ThrowIfNullOrEmpty(value);

        _data = value.ToCharArray();

        // &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x43E;&#x442;&#x432;&#x440;&#x430;&#x442;&#x438;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x432; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x438;, &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E;, &#x435;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43A;&#x440;&#x430;&#x442;&#x43D;&#x43E;&#x435; &#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x44C;,
        // &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; Pinned Heap: https://github.com/dotnet/runtime/blob/main/docs/design/features/PinnedHeap.md
        // var data = GC.AllocateUninitializedArray&lt;char&gt;(value.Length, pinned: true);
        // value.AsSpan().CopyTo(data);
        // _data = data;

        // &#x422;&#x430;&#x43A;&#x436;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E;&#x435;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C; &#x43D;&#x430; Microsoft.AspNetCore.DataProtection.Secret. &#x41D;&#x43E; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435;
        // &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x43E;&#x43C; Microsoft.Extensions.Configuration. &#x414;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;, Secret &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x434;&#x43D;&#x43E;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x44B;&#x43C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x43C;, &#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; IOptions&lt;T&gt; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x438;&#x442; // &#x43D;&#x435; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;.
        // &#x43D;&#x435; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x437;&#x430;&#x431;&#x43E;&#x442;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43E; &#x435;&#x433;&#x43E; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x441;&#x430;&#x43C;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;.
        // https://github.com/dotnet/aspnetcore/blob/ea683686bfac765690cb6e40f6ba7198cae26e65/src/DataProtection/DataProtection/src/Secret.cs
    }

    public string Reveal() =&gt; string.Create(_data.Length, _data, (span, data) =&gt; data.Span.CopyTo(span));

    [Obsolete($&quot;Use {nameof(Reveal)} instead&quot;)]
    public override string? ToString() =&gt; base.ToString();

    /// &lt;summary&gt;
    /// &#x420;&#x430;&#x437;&#x440;&#x435;&#x448;&#x430;&#x435;&#x442; Microsoft.Extensions.Configuration &#x438;&#x43D;&#x441;&#x442;&#x430;&#x43D;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;  &lt;seealso cref=&quot;Secret&quot; /&gt;
    /// &#x438;&#x437; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;.
    /// &lt;/summary&gt;
    private sealed class ConfigurationSecretTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
            =&gt; sourceType == typeof(string);

        public override bool CanConvertTo(ITypeDescriptorContext? context, [NotNullWhen(true)] Type? destinationType)
            =&gt; false;

        public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType)
            =&gt; throw new InvalidOperationException();

        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
            =&gt; value is string { Length: &gt; 0 } str ? new Secret(str) : null;
    }
}</code></pre><p>&#x412;&#x43E;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430; Secret &#x432; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x438;:</p><pre><code class="language-csharp">var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddInMemoryCollection(new Dictionary&lt;string, string?&gt;
{
    [&quot;UserName&quot;] = &quot;john&quot;,
    [&quot;Password&quot;] = &quot;Pa$$w0rd&quot;,
});

builder.Services.Configure&lt;SampleOptions&gt;(builder.Configuration);
await using var app = builder.Build();

var configuration = app.Services.GetRequiredService&lt;IOptions&lt;SampleOptions&gt;&gt;().Value;
Console.WriteLine(configuration.UserName);

 // &#x1F447; &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; Reveal &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x44F;
Console.WriteLine(configuration.Password?.Reveal());

class SampleOptions
{
    public string? UserName { get; set; }

     // &#x1F447; &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; &#x442;&#x438;&#x43F; Secret
    public Secret? Password { get; set; }
}</code></pre><p>&#x412;&#x44B; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x443;&#x431;&#x435;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x441; Secret &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x442;&#x430;&#x43A;, &#x43A;&#x430;&#x43A; &#x43E;&#x436;&#x438;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F;:</p><pre><code class="language-csharp">public sealed class SecretTests
{
    [Fact]
    public void RevealToString()
    {
        var secret = new Secret(&quot;foo&quot;);
        Assert.Equal(&quot;foo&quot;, secret.Reveal());
        Assert.NotEqual(&quot;foo&quot;, secret.ToString());
    }

    [Fact]
    public void SystemTestJsonDoesNotRevealValue()
    {
        var secret = new Secret(&quot;foo&quot;);
        var json = JsonSerializer.Serialize(secret);
        Assert.Equal(&quot;{}&quot;, json);
    }

    [Fact]
    public void SystemTestJsonDoesNotRevealValue_Field()
    {
        var secret = new Secret(&quot;foo&quot;);
        var options = new JsonSerializerOptions { IncludeFields = true };
        var json = JsonSerializer.Serialize(secret, options);
        Assert.Equal(&quot;{}&quot;, json);
    }

    [Fact]
    public void NewtonsoftJsonDoesNotRevealValue()
    {
        var secret = new Secret(&quot;foo&quot;);
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(secret);
        Assert.Equal(&quot;{}&quot;, json);
    }

    [Fact]
    public void CanConvertFromString()
    {
        var secret = (Secret)TypeDescriptor.GetConverter(typeof(Secret)).ConvertFromString(&quot;foo&quot;);
        Assert.Equal(&quot;foo&quot;, secret.Reveal());
    }

    [Fact]
    public void TypeConverterToStringDoesNotRevealValue()
    {
        var secret = new Secret(&quot;foo&quot;);
        Assert.Throws&lt;InvalidOperationException&gt;(() =&gt; TypeDescriptor.GetConverter(typeof(Secret)).ConvertToString(secret));
    }

    [Fact]
    public async Task CanBindConfiguration()
    {
        var builder = WebApplication.CreateBuilder();
        builder.WebHost.UseSetting(&quot;Password&quot;, &quot;Pa$$w0rd&quot;);
        builder.Services.Configure&lt;SampleOptions&gt;(builder.Configuration);
        await using var app = builder.Build();
        var configuration = app.Services.GetRequiredService&lt;IOptions&lt;SampleOptions&gt;&gt;().Value;

        Assert.Equal(&quot;Pa$$w0rd&quot;, configuration.Password.Reveal());
    }

    private class SampleOptions
    {
        public Secret? Password { get; set; }
    }
}</code></pre><p>&#x41E;&#x440;&#x438;&#x433;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x43F;&#x43E; <a href="https://www.meziantou.net/prevent-accidental-disclosure-of-configuration-secrets.htm?ref=zznob.ru">&#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x435;</a>.</p>]]></content:encoded></item><item><title><![CDATA[Шаблоны списков в C#11]]></title><description><![CDATA[<p>&#x412; C#11 &#x431;&#x44B;&#x43B;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; (List patterns). &#x428;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x440;&#x430;&#x441;&#x448;</p>]]></description><link>https://zznob.ru/list-patterns-v-c-11/</link><guid isPermaLink="false">6408aab6f07f800001bbefdc</guid><category><![CDATA[Заметки о dotNet]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Wed, 08 Mar 2023 17:17:07 GMT</pubDate><media:content url="https://zznob.ru/content/images/2023/03/using-pub-sub-in-c-net-to-build-a-chat-app@2x-1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://zznob.ru/content/images/2023/03/using-pub-sub-in-c-net-to-build-a-chat-app@2x-1-.png" alt="&#x428;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x432; C#11"><p>&#x412; C#11 &#x431;&#x44B;&#x43B;&#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; (List patterns). &#x428;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x44F;&#x44E;&#x442; pattern matching &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x435;&#x439; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x432; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x435; &#x438;&#x43B;&#x438; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x435;. &#x426;&#x435;&#x43B;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x438; &#x43D;&#x435; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x438;&#x442;&#x44C; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441;, &#x430; &#x440;&#x430;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x442;&#x44C;&#x441;&#x44F;, &#x43A;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F;. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x44B; &#x441; pattern matching &#x438; &#x441; List patterns &#x432; &#x447;&#x430;&#x441;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x44E; &#x43F;&#x440;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44E; &#x432; <a href="https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/patterns?WT.mc_id=DT-MVP-5003978&amp;ref=zznob.ru#list-patterns">&#x43E;&#x444;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x438; Microsoft</a>, &#x433;&#x434;&#x435; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x43E; &#x434;&#x43E;&#x441;&#x442;&#x430;&#x442;&#x43E;&#x447;&#x43D;&#x43E;&#x435; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43E;&#x432; &#x438; &#x438;&#x441;&#x447;&#x435;&#x440;&#x43F;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x439; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x438;. &#x41D;&#x438;&#x436;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; List patterns:</p><figure class="kg-card kg-code-card"><pre><code class="language-csharp">var array = new[] { 1, 2, 3 };
_ = array is [1, 2, 3]; // &#x421;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x435;&#x439; 3 &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; 1,2,3.
_ = array is [1, _, 3]; // &#x421;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x435;&#x439; 3 &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x441;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; 1, &#x43B;&#x44E;&#x431;&#x44B;&#x43C; &#x447;&#x438;&#x441;&#x43B;&#x43E;&#x43C;, 3
_ = array is [var head, .. var tail]; // &#x421;&#x43E;&#x43F;&#x430;&#x441;&#x442;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x445;&#x43E;&#x442;&#x44F;&#x431;&#x44B; &#x441; 1 &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x43C; (head).
                                      // &#x445;&#x432;&#x43E;&#x441;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x44B; ([2, 3])</code></pre><figcaption>List patterns</figcaption></figure><p>List patterns &#x43F;&#x440;&#x435;&#x43A;&#x440;&#x430;&#x441;&#x43D;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x441; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;&#x43C;&#x438; &#x438; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430;&#x43C;&#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432; List&lt;T&gt;, &#x43D;&#x43E; &#x447;&#x442;&#x43E;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x437;&#x430;&#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x44B; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x441;&#x43E; &#x441;&#x432;&#x43E;&#x438;&#x43C;&#x438; &#x442;&#x438;&#x43F;&#x430;&#x43C;&#x438;? &#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x435; &#x44F; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x436;&#x443; &#x432;&#x430;&#x43C; &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x442;&#x438;&#x43F; Net &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x44B;&#x439; &#x441; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441;&#x43E;&#x43C; list patterns C#11.</p><h2 id="%D0%BA%D0%B0%D0%BA-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C-%D1%82%D0%B8%D0%BF-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9-%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC-%D1%81-list-patterns">&#x41A;&#x430;&#x43A; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x442;&#x438;&#x43F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C; &#x441; list patterns?</h2><p>&#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441; list patterns, &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x440;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x432; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441;. &#x421;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x432;&#x43E; &#x447;&#x442;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; list patterns &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441; &#x43D;&#x430; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43D;&#x438;&#x437;&#x43A;&#x43E;&#x43C; &#x443;&#x440;&#x43E;&#x432;&#x43D;&#x435;:</p><figure class="kg-card kg-code-card"><pre><code class="language-csharp">var array = new[] { 1, 2, 3 };

_ = array is [1, 2, 3];
 // &#x420;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x432;:
_ = array != null &amp;&amp; array.Length == 3 &amp;&amp; array[0] == 1 &amp;&amp; array[1] == 2 &amp;&amp; array[2] == 3;</code></pre><figcaption>&#x412;&#x43E; &#x447;&#x442;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; list patterns</figcaption></figure><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x435; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x439; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x430;, &#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x440;&#x430;&#x437;&#x432;&#x435;&#x440;&#x43D;&#x435;&#x442; &#x435;&#x433;&#x43E; &#x432; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x435; &#x432;&#x44B;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;. &#x426;&#x435;&#x43B;&#x44C;&#x44E; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43C;&#x435;&#x442;&#x43A;&#x438; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440; &#x432;&#x441;&#x435;&#x445; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43E;&#x432;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x442;&#x44C;, &#x432;&#x43E; &#x447;&#x442;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x432;&#x430;&#x448; &#x43A;&#x43E;&#x434; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440;, &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; <a href="https://sharplab.io/?ref=zznob.ru#v2:EYLgxg9gTgpgtADwGwBYA0ATEBqAPgNwEMoACYqQgTxIF4SA7GAdwG0BdEgbxIEY0SATPwDMJAL4BuALAAoWQH1aZKBWoBLAM4kWfQSLbSZQA===">SharpLab</a>.</p><p>&#x41A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; C# &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; <a href="https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BD%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F?ref=zznob.ru">&#x443;&#x442;&#x438;&#x43D;&#x443;&#x44E; &#x442;&#x438;&#x43F;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E;</a>, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C;, &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C; &#x43B;&#x438; &#x442;&#x438;&#x43F; &#x441; &#x448;&#x430;&#x431;&#x43B;&#x43E;&#x43D;&#x43E;&#x43C;. &#x42D;&#x442;&#x43E; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x43C; &#x43D;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x430;&#x43A;&#x438;&#x435;-&#x43B;&#x438;&#x431;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x44B; &#x438;&#x43B;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x44B;. &#x41A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;, &#x435;&#x441;&#x442;&#x44C; &#x43B;&#x438; &#x443; &#x442;&#x438;&#x43F;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x435; &#x447;&#x43B;&#x435;&#x43D;&#x44B;, &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442; &#x438;&#x445;. &#x412;&#x43E;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x44B;&#x445; &#x447;&#x43B;&#x435;&#x43D;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x438; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441;&#x430; list patterns:</p><pre><code class="language-csharp">var collection = new MyCollection();
_ = collection is [var head, .. var tail];

public class MyCollection
{
    // &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x445;&#x441;&#x44F; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;.
    // &#x412;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x43E;&#x434;&#x43D;&#x443; &#x438;&#x437; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;.
    // &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x447;&#x430;&#x43D;&#x438;&#x435;: &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x43E;&#x431;&#x430; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x430;, &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; Length
    public int Length { get; }
    public int Count { get; }

    // &#x418;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x430;&#x442;&#x43E;&#x440;, &#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x43E;&#x434;&#x43D;&#x443; &#x438;&#x437; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440;.
    // &#x412;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x442;&#x438;&#x43F; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x44B;&#x43C;.
    // &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x447;&#x430;&#x43D;&#x438;&#x435;: &#x435;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x43E;&#x431;&#x430; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x430;&#x442;&#x43E;&#x440;&#x430;, &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; this[Index index]
    public object this[int index] =&gt; throw null;
    public object this[System.Index index] =&gt; throw null;

    // &#x412;&#x44B;&#x431;&#x438;&#x440;&#x430;&#x435;&#x442; &#x43E;&#x434;&#x43D;&#x443; &#x438;&#x437; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x445; &#x441;&#x438;&#x433;&#x43D;&#x430;&#x442;&#x443;&#x440; &#x434;&#x43B;&#x44F; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x438; slice pattern (...)
    // &#x422;&#x438;&#x43F; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x44B;&#x43C;.
    // &#x41F;&#x440;&#x438;&#x43C;&#x435;&#x447;&#x430;&#x43D;&#x438;&#x435;: &#x415;&#x441;&#x43B;&#x438; &#x43F;&#x440;&#x438;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x43E;&#x431;&#x430; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;, &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; this[System.Range index].
    public object this[System.Range index] =&gt; throw null;
    public object Slice(int start, int length) =&gt; throw null;
}</code></pre><p>&#x412;&#x43E;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x43E;&#x433;&#x43E; &#x442;&#x438;&#x43F;&#x430;:</p><pre><code class="language-csharp">var collection = new MyCollection();
collection.Add(1);
collection.Add(2);
collection.Add(3);
_ = collection is [var head, .. var tail];

public class MyCollection
{
    private readonly List&lt;int&gt; _items = new();

    public void Add(int item) =&gt; _items.Add(item);

    public int Length =&gt; _items.Count;

    public int this[Index index] =&gt; _items[index];

    public ReadOnlySpan&lt;int&gt; this[System.Range range]
        =&gt; CollectionsMarshal.AsSpan(_items)[range];
}</code></pre>]]></content:encoded></item><item><title><![CDATA[Выполнение кода перед методом Main.]]></title><description><![CDATA[В консольных приложениях, точкой запуска программы, является метод Main. В данной статье рассматриваться можно ли выполнить код до метода Main.]]></description><link>https://zznob.ru/vypolnieniie-koda-pieried-mietodom-main/</link><guid isPermaLink="false">6408985bf07f800001bbef7c</guid><category><![CDATA[Заметки о dotNet]]></category><dc:creator><![CDATA[ZZnOB]]></dc:creator><pubDate>Wed, 08 Mar 2023 14:31:47 GMT</pubDate><media:content url="https://zznob.ru/content/images/2023/03/ghows-LK-368b5fe3-d62a-49d0-819d-fa8fd9b53daa-7738d56c-1--1.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://zznob.ru/content/images/2023/03/ghows-LK-368b5fe3-d62a-49d0-819d-fa8fd9b53daa-7738d56c-1--1.jpeg" alt="&#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x434;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; Main."><p>&#x41E;&#x444;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x442; Microsoft &#x43D;&#x430;&#x43C; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x442; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435;:</p><!--kg-card-begin: markdown--><blockquote>
<p>&#x41C;&#x435;&#x442;&#x43E;&#x434; Main &#x2014; &#x44D;&#x442;&#x43E; &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x432;&#x445;&#x43E;&#x434;&#x430; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; C#. (&#x411;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430;&#x43C; &#x438; &#x441;&#x43B;&#x443;&#x436;&#x431;&#x430;&#x43C; &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x432;&#x445;&#x43E;&#x434;&#x430; &#x432; &#x432;&#x438;&#x434;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; Main &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F;.) &#x41A;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442;&#x441;&#x44F;, &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434; Main.</p>
</blockquote>
<p><a href="https://docs.microsoft.com/ru-ru/dotnet/csharp/fundamentals/program-structure/main-command-line?WT.mc_id=DT-MVP-5003978&amp;ref=zznob.ru">&#x41E;&#x444;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x414;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x44F;</a></p>
<!--kg-card-end: markdown--><p>&#x41D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; Main &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43D;&#x435; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;. &#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; Main. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x435; &#x44F; &#x43F;&#x43E;&#x43A;&#x430;&#x436;&#x443; &#x432;&#x430;&#x43C; &#x440;&#x430;&#x437;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x434;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; Main. &#x42F; &#x43D;&#x435; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44E;, &#x447;&#x442;&#x43E; &#x442;&#x430;&#x43A; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C;, &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x1F603;</p><!--kg-card-begin: html--><h2>&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;</h2><!--kg-card-end: html--><p>&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x43B;&#x438; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x438;&#x43D; &#x440;&#x430;&#x437;. &#x41E;&#x43D; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x433;&#x43E; &#x44D;&#x43A;&#x437;&#x435;&#x43C;&#x43F;&#x43B;&#x44F;&#x440;&#x430; &#x438;&#x43B;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43A; &#x43B;&#x44E;&#x431;&#x44B;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x43C; &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x43C;. &#x418;&#x442;&#x430;&#x43A;, &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; Main.</p><pre><code class="language-csharp">class Program
{
    static Program() =&gt; Console.WriteLine(&quot;Main &#x435;&#x449;&#x435; &#x43D;&#x435; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43B;&#x438;&quot;);
    static void Main() =&gt; Console.WriteLine(&quot;&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x43C;&#x438;&#x440;!&quot;);
}</code></pre><!--kg-card-begin: html--><h2>&#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x44B; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x435;&#x439;</h2><!--kg-card-end: html--><p>&#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x44B; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x435;&#x439; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x442; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x430;&#x43C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x430;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x443;&#x44E; &#x43E;&#x434;&#x43D;&#x43E;&#x43A;&#x440;&#x430;&#x442;&#x43D;&#x443;&#x44E; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E; &#x43F;&#x440;&#x438; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x435; &#x431;&#x435;&#x437; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x44F;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43C; &#x447;&#x435;&#x433;&#x43E;-&#x43B;&#x438;&#x431;&#x43E;. &#x41A;&#x43E;&#x433;&#x434;&#x430; &#x441;&#x440;&#x435;&#x434;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44C; (DLL), &#x43E;&#x43D;&#x430; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43B;&#x44E;&#x431;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430; &#x438;&#x437; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F;.</p><pre><code class="language-csharp">using System.Runtime.CompilerServices;
class Initializer
{
    // &#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F;
    static Initializer() =&gt; Console.WriteLine(&quot;&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;.&quot;);
    [ModuleInitializer]
    public static void Init1() =&gt; Console.WriteLine(&quot;&#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F; 1&quot;);
    [ModuleInitializer]
    public static void Init2() =&gt; Console.WriteLine(&quot;&#x418;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F; 2&quot;);
}
class Program
{
    static void Main() =&gt; Console.WriteLine(&quot;&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x43C;&#x438;&#x440;!&quot;);
}</code></pre><!--kg-card-begin: html--><h2>&#x425;&#x443;&#x43A;&#x438; Startup</h2><!--kg-card-end: html--><p>&#x41F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x440;&#x435;&#x434;&#x44B; DOTNET_STARTUP_HOOKS &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x44F; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C;&#x44B;&#x445; &#x441;&#x431;&#x43E;&#x440;&#x43E;&#x43A;, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x445; &#x442;&#x438;&#x43F; <strong>StartupHook</strong> &#x441; &#x43E;&#x431;&#x449;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43C; <em>static void Initialize()</em>. &#x41A;&#x430;&#x436;&#x434;&#x44B;&#x439; &#x438;&#x437; &#x44D;&#x442;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x43F;&#x43E;&#x440;&#x44F;&#x434;&#x43A;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x442;&#x43E;&#x447;&#x43A;&#x43E;&#x439; &#x432;&#x445;&#x43E;&#x434;&#x430; Main.</p><pre><code class="language-csharp">class StartupHook
{
    static StartupHook() =&gt; Console.WriteLine(&quot;&#x421;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;.&quot;);

    // &#x417;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x43E;&#x43A;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F;
    // DOTNET_STARTUP_HOOKS=myapp.dll (&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x43F;&#x443;&#x442;&#x44C; &#x43A; &#x441;&#x431;&#x43E;&#x440;&#x43A;&#x435;)
    public static void Initialize() =&gt; Console.WriteLine(&quot;Startup &#x445;&#x443;&#x43A;&quot;);
}

class Program
{
    static void Main() =&gt; Console.WriteLine(&quot;&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442; &#x43C;&#x438;&#x440;!&quot;);
}</code></pre><p>&#x414;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x438; <a href="https://www.meziantou.net/executing-code-before-main-in-dotnet.htm?ref=zznob.ru">&quot;Executing code before Main in .NET&quot;</a></p>]]></content:encoded></item></channel></rss>