ASP.NET Core چیست؟ هنگامی که مایکروسافت تصمیم گرفت پلتفرم توسعه وب (ASP.NET) خود را متحول کند، متوجه شد وابستگی این پلتفرم به IIS ایده مطلوبی نیست. این حقیقت که ASP.NET بر پایه IIS نوشته شده بود نه تنها باعث میشد به سیستمعامل ویندوز وابسته شود بلکه امکان خود میزبانی (self-hosting) را از برنامههای تحت آن میگرفت. برای حل این مشکلات، مایکروسافت اینترفیس (Interface) یا رابط OWIN را برای NET. عرضه کرد. OWIN یک رابط استاندارد بین وب سرورهای داتنت و برنامههای وب است. این رابط به فریمورک NET. و همچنین توسعهدهندگان وب این قابلیت را میدهد تا بدون در نظر گرفتن وب سروری که مسئول پاسخگویی به درخواستهای وب است، برنامههای تحت وب خود را گسترش دهند. در واقع با استفاده از OWIN برنامههای تحت وب میتوانند self-host شوند و به همین دلیل هر وب سروری که تحت ویندوز اجرا شود میتواند با این برنامه تعامل کند. این همان قابلیتی است که در پروژههایی نظیر Katana از آن استفاده شده است.
OWIN چه طور مشکلات ASP.NET را حل میکند؟
به سادگی! در واقع اینترفیس OWIN، با استفاده از یک delegate و همچنین یک دیکشنری از رشته و شیء، نحوه کار یک وب سرور را شبیهسازی میکند. بنابراین به جای یک معماری مبتنی بر رویداد (Event Driven Architecture) که وب سرورها از آن استفاده میکنند، OWIN یک خطلولهای (Pipeline) از کدها ایجاد میکند که به آن middlewares گفته میشود. قطعه کد زیر منطق اصلی و نحوه عملکرد OWIN را نمایش میدهد.
public class Startup { public void Configuration(IAppBuilder app) { app.Use(new Func<AppFunc, AppFunc>(next => env => Invoke(next, env))); } private async Task Invoke(AppFunc next, IDictionary<string, object> environment) { Console.WriteLine("Begin Request"); await next.Invoke(environment); Console.WriteLine("End Request"); } }
Middleware چیست؟
Middleware یک قطعهای از کد است که بر روی درخواستهایی که از سمت کلاینت میآیند اثر میگذارد. همچنین میتواند جوابهای (response) سرور را که به کلاینت ارسال شدهاند تغییر دهد. در ضمن middleware ها میتوانند تصمیم بگیرند تا خودشان جواب را تولید کرده و به کلاینت ارسال کنند. هنگامی که درخواستی از سمت کلاینت به سرور ارسال میشود، این درخواست بین middleware ها به ترتیبی که درpipeline اضافه شدهاند پاس داده میشود، تا زمانی که یک middleware تشخیص میدهد که توانایی تولید جواب برای این درخواست را دارد و آن را تولید میکند. سپس دوباره این جواب درون pipeline، مسیر برگشت به سمت کلاینت را بین middleware ها طی کرده و توسط آنها دستخوش تغییر میشود تا به کلاینت برسد. بسیار ساده، منعطف و قدرتمند.
این فرآیند با نام خطلوله درخواست شناخته میشود که تصور جریان پیامها درون خطلوله را آسان میکند. همانطور که گفته شد OWIN درخواستها را در قالب یک دیکشنری از رشته و شئ تعریف میکند. پس از آنکه سرور درخواست HTTP را دریافت کرد، OWIN قبل از آنکه درخواست را به اولین middleware برای پردازش ارسال کند، آن را به اطلاعات قابل استفاده تقسیم میکند و هر قسمت از اطلاعات را در دیکشنری ذخیره میکند. به عنوان مثال این اطلاعات میتوانند شامل مسیر درخواست (request path)، مجموعه هدرها (headers collection)، اطلاعات بدنه(body stream) و غیره باشد که هر کدام با یک کلید از پیش تعریف شده است در دیکشنری ذخیره میشوند. با استفاده از این کلیدها، middleware ها میتوانند اطلاعات موردنیاز را از دیکشنری بخوانند و تصمیمگیری در مورد عملیات موردنیاز را انجام دهند. همچنین در مسیر برگشت سرور اطلاعاتی نظیر جریان پاسخ (response stream) و همچنین هدرهای پاسخ (response headers) را به دیکشنری اضافه میکند تا middleware ها بتوانند براساس آن پاسخ نهایی را تولید کرده و به کلاینت ارسال کنند.
رابط OWIN در عین سادگی بسیار قدرتمند است. با استفاده از این رابط به دلیل دسترسی سطح پایین به درخواستها و پاسخهای HTTP، میتوان جزییات درخواست را به راحتی کنترل کرد و تغییر داد.
هنگامی که مایکروسافت خطلوله OWIN را به ASP.NET Core اضافه کرد، تغییراتی را هم در آن انجام داد، یا حداقل یه لایه بر روی آن اضافه کرد تا بتوان راحتتر از آن استفاده کرد. در واقع به جای استفاده از یک دیکشنری برای کار با middleware ها، لایه بالاتر، امکان استفاده از شئ HttpContext را فراهم میکرد تا بتوان راحتتر با درخواستها و پاسخها تعامل کرد. به عنوان مثال، به جای نوشتن دستور ((Stream)dictionary[“owin.RequestBody”]).Write(…)
برای نوشتن روی پاسخ ارسالی به مشتری، میتوان دستور httpContext.Response.Body.Write(…)
را نوشت. این تغییر چندان مهم نبود ولی برای استفاده از دیکشنری دیگر نیازی به یادآوری کلیدها نبود. همچنین به تبدیل (cast) اشیا به نوع درست (correct type) هم نیازی نبود.
آیا در نهایت قرار است ما با استفاده از این دستورات سطح پایین برنامهنویسی کنیم؟ قطعا نه! برای برنامهنویسی لازم است یک سطح انتزاع بالاتری ایجاد شود و این همان کاری است که مایکروسافت انجام داده است. در ASP.NET Core، ASP.NET MVC به عنوان یک middleware پیادهسازی شده است. این middleware بهوسیله چندین سرویس نظیر Dependency Injection که به آن تزریق شده است پشتیبانی میشود، ولی درنهایت این middleware است که وظیفه تعامل با درخواستها را داراست.
همان طور که ما میتوانیم به هر تعداد که نیاز است middleware به خطلوله اضافه کنیم، این توانایی را نیز داریم که چارچوبها (Frameworks) و قابلیتها (Features) را با هم ادغام و استفاده کنیم. برای استفاده از ASP.NET MVC برای UI، فقط باید MVC middleware و سرویسهای موردنیاز را به برنامه اضافه کنید. برای استفاده از سرویس احراز هویت فیسبوک، فقط middleware های مربوط و سرویسها را به برنامه اضافه کنید. به همین راحتی میتوانید در هر برنامه خطلوله خاص و موردنیاز خود را کنترل و تنظیم کنید تا به همان شکلی که میخواهید درخواستها و پاسخها پردازش شوند. این دقیقا همان مزیت OWIN نسبت به معماری قبلی ASP.NET است که در آنجا ما مجبور به استفاده از Namespace (فضاینام) system.web بودیم، که تقریبا تمامی ماژولها و قابلیتهای انواع مختلف پروژهها را درون خود داشت، درحالی که ممکن است در یک پروژه به اکثر آنها نیازی نباشد. در معماری جدید، برنامهنویس سرویسهایی را بارگذاری میکند که دقیقا به آنها نیاز دارد. همین موضوع باعث افزایش سادگی، انعطافپذیری و کارایی ASP.NET Core نسبت به نسخه قدیمی آن شده است.
اگر قصد طراحی سایت فروشگاه اینترنتی را دارید، بد نیست بدانید که پلتفرم ناپ کامرس با تکنولوژی ASP.NET Core توسعه داده شده است و در عین سادگی و قدرتی که دارد، بسیار ایمن و سریع است. برای اطلاعات بیشتر در خصوص ناپ کامرس و تکنولوژی های مورد استفاده در آن، می توانید به صفحه ناپ کامرس در سایت لابراتوار رسانه مراجعه کنید.
منبع: infoq