چگونه از میان افزار شرطی در ASP.Net استفاده کنیم؟

استفاده از میان افزار شرطی در ASP.Net بسیار رایج است، در این مطلب قصد داریم درباره استفاده از میان افزار شرطی در ASP.Nt صحبت کنیم.

 چگونه از میان افزار شرطی در ASP.Net استفاده کنیم؟

قبل از آن که بخواهیم درباره میان افزار شرطی ASP.Net صحبت کنیم بهتر است درباره خود این فریم ورک اطلاعاتی را در اختیار شما قرار دهیم. ASP.NET یک فریم ورک متن باز، کراس پلتفرم، سبک، قابل توسعه و ماژولار برای ساخت اپلیکیشن های تحت وب با عملکرد بالا است. کامپوننت های میان افزار شرطی ASP.Net می توانند در این فریم ورک مورد استفاده قرار گیرند تا پیپ لاین مربوط به درخواست ها را شخصی سازی کرده و خود این درخواست ها و پاسخ های مربوط به آن ها را نیز مدیریت کنند.


کامپوننت های میان افزار شرطی

کامپوننت های مربوط به میان افزار می توانند برای inspect، route و یا اصلاح درخواست ها و همینطور پاسخ های مربوط به آن ها که در پیپ لاین جریان دارند مورد استفاده قرار گیرند. ما در این مقاله قصد داریم درباره این موضوع که چگونه می توانیم از عملکردهای پیچیده در میان افزار استفاده کنیم بحث کنیم بنابراین اگر شما نیز جزو افرادی هستید که با ASP.Net کار می کنید به شما توصیه می کنیم حتما این مطلب را به خوبی مطالعه کنید.

 میان افزار شرطی


ساخت یک پروژه ASP.NET

در ابتدا اجازه دهید که یک پروژه را در ویژوال استودیو بسازیم، فرض ما در این جا این است که شما نسخه 2017 و یا 2019 از این Ide را بر روی سیستم خود نصب کرده اید. مراحلی که شما برای ساخت یک پروژه ASP.NET باید بپیمایید به شکل زیر است:

-          IDE ویژوال استودیو را اجرا کنید.

-          بر روی “Create new project.” کلیک کنید.

-          در پنجره باز شده از لیستی که در اختیار شما قرار دارد گزینه “ASP.Net Core Web Application” را انتخاب کنید.

-          بر روی next کلیک کنید

-          در پنجره “Configure your new project” که در بخش بعدی برای شما ظاهر می شود نام و محل قرار گیری پروژه خود را انتخاب کنید.

-          بر روی Create کلیک کنید

-          در بخش “Create New ASP.Net Core Web Application” که در مرحله بعدی برای شما ظاهر می شود .Net Core را به عنوان ران تایم انتخاب کرده و گزینه ASP.Net Core 2.2 یا نسخه های بالاتر را از لیستی که در قسمت بالا وجود دارد انتخاب کنید.

-          گزینه  “Web Application (Model-View-Controller)” را به عنوان قالب پروژه خود برای ساخت یک پروژه جدید در ASP.NET انتخاب کنید.

-          اطمینان حاصل کنید که چک باکس های “Enable Docker Support” و “Configure for HTTPS” تیک نخورده باشند چرا که ما در اینجا قصد نداریم از این ویژگی ها استفاده کنیم.

-          گزینه Authentication را نیز بر روی “No Authentication” قرار دهید چرا که ما از Authentication نیز استفاده نخواهیم کرد.

-          حال می توانید بر روی گزینه Create کلیک کنید.

حال شما باید یک پروژه ASP.NET Core داشته باشید که آماده است تا بر روی ویژوال استودیو اجرا شود. ما در بخش های بعدی این مقاله از این پروژه استفاده خواهیم کرد تا بیشتر با session state در ASP.Net آشنا شویم.

 میان افزار شرطی


متدهای Use, Map, Run در ASP.Net برای کار کردن با میان افزار شرطی در این فریم ورک

متدهای Use, Map, Run برای تنظیم کردن پیپ لاین HTTP در ASP.Net Core مورد استفاده قرار می گیرند. در این جا به صورت مختصر هر یک از این متدها را معرفی کرده و توضیحاتی درباره آن ها ارائه خواهیم داد.

متد Use: این متد ابتدا یک نماینده را اجرا می کند و سپس در پیپ لاین به گام بعدی می رود، این متد می تواند برای short-circuit در پیپ لاین نیز مورد استفاده قرار گیرد.

متد Run: این متد یک نماینده را اجرا می کند و بعد از آن نتیجه را باز می گرداند.

متد Map: این متد یک نماینده را به صورت شرطی اجرا می کند و نتیجه را باز می گرداند.

 میان افزار شرطی


رجستر کردن میان افزار شرطی در ASP.Net

یک کامپوننت میان افزار در ASP.Net در داخل متد Configure و در داخل کلاس Startup رجیستر می شود. متد افزوده شده Use برای رجیستر کردن میان افزار شرطی مورد استفاده قرار می گیرد. در این جا قطعه کدی را برای رجیستر کردن یک میان افزار برای شما آورده ایم:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

{

    app.Use My Custom Middleware<My Custom Middleware>();

}

یک نکته بسیار مهم که باید توجه ویژه ای به آن داشته باشید این است که کامپوننت های میان افزار به ترتیبی که رجیستر شده اند اجرا خواهند شد.

 میان افزار شرطی


متد Invoke در ASP.Net

هر کامپوننت میان افزار شرطی شامل یک متد Invoke است. این متد یک رفرنس را به عنوان یک شی از HttpContext دریافت می کند. یک میان افزار شرطی می تواند عملکردها را قبل و بعد از آن که میان افزار شرطی بعدی فراخوانی شود انجام دهد. در این جا مثالی از استفاده کردن از متد Invoke  را برای شما آورده ایم:

public async Task Invoke(HttpContext context)

{

    // Write code here that will be executed before the

    // next middleware is called

        await _next.Invoke(context); // call next middleware

    // Write code here that will be executed after the

    //next middleware is called

}

 میان افزار شرطی

شاخه شاخه کردن پیپ لاین HTTP در ASP.Net Core

متدهای اضافه شده Map که دو متد Map و MapWhen هستند برای شاخه شاخه کردن پیپ لاین مورد استفاده قرار می گیرند. متد مپ برای شاخه شاخه کردن بر اساس آدرس درخواستی که ارسال شده است مورد استفاده قرار می گیرد و متد MapWhen نیز برای شاخه شاخه کردن براساس نتیجه یک انشعاب استفاده می شود. قطعه کد زیر به شما نشان می دهد که متد Map چگونه می تواند برای شاخه شاخه کردن یک درخواست پیپ لاین مورد استفاده قرار گیرد.

public class Startup

{

    private static void MapRequestA(IApplicationBuilder app)

    {

        app.Run(async context =>

        {

            await context.Response.WriteAsync("This is MapRequestA");

        });

    }

    private static void MapRequestB(IApplicationBuilder app)

    {

        app.Run(async context =>

        {

            await context.Response.WriteAsync("This is MapRequestB");

        });

    }

    private static void MapRequestC(IApplicationBuilder app)

    {

        app.Run(async context =>

        {

            await context.Response.WriteAsync("This is MapRequestC");

        });

    }

    public void Configure(IApplicationBuilder app)

    {

        app.Map("/mapRequestPathA", MapRequestA);

        app.Map("/mapRequestPathB", MapRequestB);

        app.Map("/mapRequestPathB", MapRequestC);

        app.Run(async context =>

        {

            await context.Response.WriteAsync("Hello World!");

        });

    }

   //Other methods

}

متد MapWhen

متد MapWhen دو پارامتر را دریافت می کند:

-          پارامتر اول یک متغیر از نوع Func<HTTPContext, bool> است

-          پارامتر دوم نیز یک عملیات انتخاب شده می باشد.

شما می توانید از قطعه کد زیر در متد Configure در کلاس Startup استفاده کنید:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }

            app.MapWhen(context => context.Request.ContentType.Equals

            ("text/xml", StringComparison.InvariantCultureIgnoreCase),

            (IApplicationBuilder applicationBuilder) =>

            {

                applicationBuilder.Run(async context =>

                {

                    await Task.FromResult(context.Response.StatusCode = StatusCodes.Status406NotAcceptable);

                });

            });

            app.UseMvc();

        }

متد UseWhen در ASP.Net Core

متد UseWhen می تواند برای استفاده از میان افزار شرطی مورد استفاده قرار گیرد، قطعه کد زیر نشان می دهد که چگونه می توانید از متد UseWhen استفاده کنید تا اگر آدرس درخواست با عبارت “/api” آغاز میشد بتوانید از میان افزار شرطی استفاده کنید.

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>

{

    applicationBuilder.UseCustomMiddleware();

});

توجه داشته باشید که بر خلاف متد MapWhen این متد صرف نظر از این که نتیجه استفاده از میان افزار شرطی درست و یا نادرست باشد اجرا می شود. اجازه دهید این موضوع را با استفاده از یک مثال بهتر درک کنیم. قطعه کد زیر را در نظر بگیرید:

app.UseMiddlewareA();

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>

{

    applicationBuilder.UseMiddlewareB();

});

app.UseMiddlewareC();

اگر در این جا هیچ short-circuiting از میان افزار شرطی وجود نداشته باشد میان افزارهای شرطی A و C همواره اجرا خواهند شد. میان افزار شرطی B نیز تنها در صورتی اجرا می شود که آدرس درخواست با عبارت “/api” آغاز شود.

در ASP.Net Core زنجیره ای از کامپوننت های میان افزار شرطی وجود دارد که در پیپ لاین مربوط به پردازش درخواست ها فعالیت دارند و شما می توانید از آن ها به خوبی استفاده کنید.