میان افزارها کدهایی هستند که روی درخواست ها و پاسخ ها انجام می شوند و یک ترتیب میانِ میان افزارها است که هر یک در این روال، میان افزار پَسین (بعدی) خود را فراخوانی می کند. در این توشته می خواهیم درباره چندین مفهوم دیگر از میان افزارها بگوییم که در برگیرنده متد ()Map از کلاس IApplicationBuilder نیز می شود.

کمی درباره ()next.Invoke

گفتیم که متد ()Use تابع بی نام دو پارامتر از نوع کلاس HttpContext و تابع Delegate از گونه Task دریافت می کند. همچنین در ()Use دستور ()next.Invoke میان افزار پَسین را فراخوانی می کند. بنابراین آنچه که در میان افزار انجام می شود، باید پیش از دستور ()next.Invoke نوشته شود. به یاد داشته باشید که کدهای پیش از ()next.Invoke، ورود درخواست به میان افزار و کدهای پس از ()next.Invoke، پس از بیرون آمدن از میان افزار انجام می شود.

در کد زیر سه میان افزار نوشته ایم و پیش و پس از دستور ()next.Invoke کدی را نوشته ایم. شکل زیر خروجی این میان افزارها را نشان می دهد و می بینید که به ترتیب از بالا به پایین میان افزاها انجام شده و نخست همه کدهای پیش از ()next.Invoke انجام می شوند ولی پس از سومین میان افزار، به گونه وارونه و به ترتیب از پایین به بالا، همه کدهای پس از ()next.Invoke انجام می شوند.

اکنون به شکل زیر نگاه کنید تا بتوانید بیشتر درک کنید که زمانی که یک درخواست وارد می شود، ترتیب ورودی از بالا به پایین در متد ()Configure است و سپس از سوی دیگر و از بالا به پایین پاسخ فرستاده می شود. می بینید که از سوی پاسخ، حرکت وارونه است و از واپسین میان افزار به نخستین میان افزار است.

متد ()Map از IApplicationBuilder

متد ()Map یک پیمان نامه (قرار داد – Convention) برای انشعاب در Request Pipeline است که این انشعاب بر پایه تطابق مسیری دلخواه انجام می شود. ورودی نخست ()Map، یک رشته است که الگو مسری دلخواه را نشان می دهد و دومین ورودی نام یک تابع دلخواه است که پیش رو درباره آن خواهیم گفت. در واقع اگر مسیر درخواست فرستاده شده با نشانی URL با الگوی مسیر نشان داده شده در آرگومان نخست، آغاز شود، پس یک انشعاب انجام شده و تابع فرستاده شده در دومین آرگومان انجام می شود.

در کد زیر دو متد private و بدون مقدار برگشتی به نام های HandleMapTest1 و HandleMapTest2 در کلاس Startup نوشته ایم که هر یک میان افزاری را پیاده سازی می کنند، از این رو نیاز است تا هر یک در ورودی یک نمونه از IApplicationBuilder را دریافت کنند. سپس درون بدنه هر یک و به کمک متد ()Run یک میان افزار را پیاده سازی می کنیم.

پس از این، باید کدهای زیر را درون متد ()Configure از کلاس Startup جای دهید. نخستین متد ()Map اینگونه است که اگر مسیر درخواست با map1/ آغاز شود، پس تابع میان افزار HandleMapTest1 انجام می شود و دومین متد ()Map اینگونه است که اگر مسیر درخواست با map2/ آغاز شود، پس تابع میان افزار HandleMapTest2 انجام می شود. در پایان اگر مسیر درخواست نه با map1/ و نه با map2/ آغاز نشود، پس سومین متد ()Run انجام می شود که در متد ()Configure نوشته شده است.

متد ()MapWhen

این همانند ()Map است ولی انشعاب Request Pipeline بر پایه نتیجه از یک پیش بینی انجام می شود. در کد زیر تابع HandleBranch در کلاس Startup یک میان افزار است به درخواست ها گوش داده و اگر رشته کوئری در URL باشد که داری کلید branch باشد، پس مقدار آن کلید را به کمک context.Request.Query در متغیر branchVer نگه می دارد.

اکنون باید کدهای زیر را درون متد ()Configure بنویسید. متد ()MapWhen زیر اینگونه است که اگر رشته کوئری درخواست دارای کلیدی به نام branch باشد، پس از این رو شرط (پیش بینی) درست بوده و سپس تابع میان افزار  انجام می شود و اگر این گونه نباشد، پس متد ()Run پایینی انجام خواهد شد.