OWSAP ارگانی است غیرانتفاعی که هدف آن ترویج طراحی برنامههای امن وب است. در این راه هم مطالب آموزشی بسیار ارزشمندی را منتشر کرده است [+]. در لینکهای زیر این مطالب از دیدگاه برنامه نویسهای دات نت مورد بررسی قرار گرفتهاند. هر چند مطابق آخرین گزارش WhiteHat که اخیرا منتشر شده [+]، تعداد Exploits مربوط به ASP.NET در مقایسه با PHP و جاوا بسیار کمتر بوده اما نیاز است تا با مشکلات عمومی موجود و راهحلهای مرتبط بیشتر آشنا شد:
نظرات مطالب
Owin چیست ؟ قسمت اول
روش برنامه نویسی مایکروسافت بیش از دو سالی میشود که به این شکل شده است که هر امکان و قابلیت جدیدی بر روی آخرین نسخه NET Framework. ارائه میشود و البته سپس به نسخ قبلی نیز تعمیم مییابد، در همین جا است که میبینید اکثر امکانات Entity Framework 5 & 6 ابتدا بر روی NET Framework 4.5. ارائه شدند، و سپس بر روی 4
اگر ما بخواهیم به NET Framework. به عنوان یک پیش نیاز دردسر زا نگاه کنیم، در اولین قدم خودمان را به دردسر انداخته ایم، چون نه برای Helios، بلکه برای صدها امکان دیگر مانند Data Flowهای جدید و ... نیز باید صبر کنیم، که عملا هزینه به فایده آن نمیصرفد. پس همیشه با فراغ بال از آخرین نسخه NET Framework. استقبال کنیم
نکتهی دیگر را که باید مد نظر داشته باشیم، این است که مطابق با سیاست هایی که مایکروسافت جدیدا اتخاذ کرده است، دیگر نباید خیلی نگران نسخههای جدید NET Framework. باشیم، چون دیگر از آن نسخه دهیهای پشت سر هم و با حجم تغییرات بالا خبری نیست، بلکه اکثر فریم ورکهای مهم جدا از NET. ارائه و به روز رسانی میشوند.
علاوه بر این، ارتقا به آخرین نسخه سیستم عامل ویندوز نیز به هیچ وجه مانند قبل ( IIS 6 به IIS 7 ) دردسر زا نیست، و خوشبختانه این ارتقا ( و یا تغییر هاست ) بدون دردسر است.
به نظر من این ارتقاء را انجام دهید، چون نه فقط Helios که خیلی چیزهای دیگری را دارید از دست میدهید، مانند سرعت بالاتر توسعه برنامه بر روی Visual Studio 2013 و Windows 8.1 برای توسعه برنامههای وبی، سرعت و کارآمدی بسیار بالاتر NET Framework 4.5.1. با IIS 8.5 برای مشتریهای برنامه و ...
به نظر من آنقدر این ارتقاء ارزشمند است، که ارزش Helios این میان کمتر ارزشش به چشم میآید.
یکی از دلایلی که برنامههای سمت وب به سرعت بر برنامههای دسکتاپی قدیمی چیره شدند، همین است: امکان ارتقای سرورها در مدت زمان کم و به شکل مدیریت شده و با کمترین تاثیر روی مشتریهای نهایی، بارها این تصمیم را که در ابتدایش کمی سخت به نظر میآید را گرفته ام و در نهایت از مشتری تا برنامه نویس همه را راضی دیده ام، چون هیچ کسی از امکانات جدید که بدون دردسر حاصل شود بدش نمیآید، و خوشبختانه کیفیت محصولات مایکروسافت واقعا بهبود یافته و دیگر آن زمانی که از NET 2. به 3.5 میرفتیم و گرفتار چندین مشکل میشدیم گذشته است.
از این نگذرید که بالاخره روزی باید این مهاجرتها را انجام دهید، پس چه بهتر که از سود آن زودتر بهره مند شوید، البته بی مهابا عمل کردن توصیه نمیشود، بد نیست زمانی شروع به ارتقاء کنید که صفحه Release Notes و سوالات موجود در سایت Stack over flow در رابطه با اشکالات رخ داده در زمان ارتقاء و Breaking Changes را از بر باشید، به این صورت عمل کنید تماما برد کرده اید.
وبلاگها و سایتهای ایرانی
Visual Studio
ASP. Net
طراحی وب
اسکیوال سرور
به روز رسانیها
سیشارپ
عمومی دات نت
PHP
متفرقه
این مورد را در قسمت اول ذیل «اما هنوز تعداد زیادی از کتابخانههای Full framework به NET Core. انتقال پیدا نکردهاند »، توضیح دادم.
شما در ASP.NET Core امکان کار با هر دو فریم ورک یاد شده را دارید و این دو به هم وابستگی ندارند. به عبارتی چندین target را دراینجا میتوانید معرفی و استفاده کنید. اگر دات نت 4.6 را هم استفاده کردید، برنامه فقط قابلیت چندسکویی خودش را از دست خواهد داد. برای مثال شما هم اکنون میتوانید EF 6.x را با ASP.NET Core 1.0 استفاده کنید (اگر نمیخواهید تا زمان تکمیل نهایی EF Core صبر کنید). فقط در این حالت باید دقت داشته باشید که کدهای شما بر روی لینوکس اجرا نخواهند شد (چون EF 6.x مبتنی بر دات نت 4x است).
نظرات مطالب
UrlRewriter توسط Intelligencia.UrlRewriter
سلام . همونطور که گفتم به نظرم استفاده از امکان مسیر یابی خود دات نت بهترین گزینه است و نمیخواد خودتونو با ریگولار و ... درگیر کنید .
آموزششو از اینجا میتونید بخونید.
یه نمونه برنامه ساختم و کاری که میخواید رو از روش روتینگ خود دات نت انجام دادم . یعنی این آدرس رو www.sample.com/1251 به صفحهی News.aspx میفرسته و اونجا میتونید کد 1251 رو بخونید و کارتون را ادامه بدید. Test-52676fa0948d4909be628f7a6a24bc5d.zip
من برای شرکتی چندسال قبل یک چنین برنامهای رو تهیه کردم:
یک سرویس ویندوز ان تی که روزهای اول به پورت سریال دستگاه کارتخوان متصل میشد و بعدها این پورت تبدیل شد به پورت شبکه و ریموت هم میشد به آن وصل شد؛ اما باز هم این پورت شبکه تبدیلگری بود برفراز سیستم اصلی RS232 آن دستگاه. کار این سرویس که نیاز به دسترسی بالایی برای اتصال به پورتهای سیستم داشت و همچنین همیشه در حال اجرا بود و راه اندازی آن نیازی به لاگین شخصی و اجرای دستی برنامه نداشت (مزیت سرویسهای ویندوز ان تی)، اتصال هر 5 دقیقه یکبار به دستگاه کارتخوان، تخلیه اطلاعات آن و ثبت آنها در بانک اطلاعاتی یک برنامه ASP.NET بود. به این ترتیب کارکنان آن سازمان میتوانستند از ورود و خروج خودشان با یک برنامه تحت وب (در شبکه داخلی شرکت) گزارشگیری کنند.
یک سرویس ویندوز ان تی که روزهای اول به پورت سریال دستگاه کارتخوان متصل میشد و بعدها این پورت تبدیل شد به پورت شبکه و ریموت هم میشد به آن وصل شد؛ اما باز هم این پورت شبکه تبدیلگری بود برفراز سیستم اصلی RS232 آن دستگاه. کار این سرویس که نیاز به دسترسی بالایی برای اتصال به پورتهای سیستم داشت و همچنین همیشه در حال اجرا بود و راه اندازی آن نیازی به لاگین شخصی و اجرای دستی برنامه نداشت (مزیت سرویسهای ویندوز ان تی)، اتصال هر 5 دقیقه یکبار به دستگاه کارتخوان، تخلیه اطلاعات آن و ثبت آنها در بانک اطلاعاتی یک برنامه ASP.NET بود. به این ترتیب کارکنان آن سازمان میتوانستند از ورود و خروج خودشان با یک برنامه تحت وب (در شبکه داخلی شرکت) گزارشگیری کنند.
مطالب دورهها
استفاده از Async و Await در برنامههای ASP.NET MVC
از ASP.NET MVC 4 به بعد، امکان استفاده از اکشن متدهای async در ASP.NET MVC میسر شدهاست. البته همانطور که پیشتر نیز ذکر شد، شرط استفاده از امکانات async در نگارشهای پیش از دات نت 4.5، استفاده از کامپایلری است که بتواند کدهای async را تولید کند و این مورد تنها از VS 2012 به بعد ممکن شدهاست.
علت استفاده از اکشن متدهای async در ASP.NET MVC
اگر نیاز دارید که برنامهی وبی، به شدت مقیاس پذیر را تولید کنید، باید بتوانید مجموعه تردهای سیستم را تا حد ممکن مشغول به کار و سرویس دهی نگه دارید. در برنامههای وب ASP.NET تنها تعداد مشخصی ترد، برای پاسخ دهی به درخواستهای رسیده، همواره مشغول به کار میباشند. در اینجا اگر این تردها را برای مدت زمان زیادی جهت اعمال IO مشغول نگه داریم، دست آخر به سیستمی خواهیم رسید که تردهای مفید آن، جهت پایان عملیات مرتبط بیکار شدهاند و دیگر ASP.NET قادر نیست از آنها جهت پاسخدهی به سایر درخواستهای رسیده استفاده کند.
برای مثال یک اکشن متد را درنظر بگیرید که نیاز است با یک وب سرویس، برای دریافت نتیجه کار کند. اگر این عملیات اندکی طول بکشد، به همین میزان ترد جاری درحال پردازش این درخواست، بیکار شده و منتظر دریافت پاسخ خواهد ایستاد و اگر به همین ترتیب تعداد تردهای بیکار، بیشتر و بیشتر شوند، دیگر سیستم قادر نخواهد بود به درخواستهای جدید رسیده پاسخ دهد و ASP.NET مجبور خواهد شد این درخواستها را در صف قرار دهد تا بالاخره زمانی این تردها آزاد شده و قابل استفادهی مجدد گردند. برای رفع این مشکل، استفاده از اعمال غیرهمزمان ابداع گردیدند تا در آنها ترد مورد استفاده جهت پردازش درخواست رسیده را آزاد کرده و به این ترتیب دیگر نیازی نباشد تا تردجاری، تا پایان عملیات IO بلاک شده و بدون استفاده باقی بماند.
در ASP.NET MVC 3 برای نوشتن اکشن متدهای async میبایستی از روش قدیمی مدلهای Async در دات نت مانند APM استفاده میشد و همچنین کنترلر جاری بجای ارث بری از کلاس Controller میبایستی از کلاس AsyncController مشتق میشد. به علت سخت بودن استفاده از آن، این روش و کنترلرهای async در نگاش 3 آن آنچنان مقبولیت و استفادهی گستردهای نیافتند. چون هر اکشن متد تبدیل میشد به دو قسمت Begin و End متداول روشهای APM. سپس در کشن متد دومی، نتیجهی این عملیات به View بازگشت داده میشد.
از ASP.NET MVC 4 به بعد، خالی کردن تردهای سیستم و استفادهی مجدد و مشغول به کار نگه داشتن مداوم آنها با استفاده از امکانات توکار زبانهایی مانند سیشارپ 5، سادهتر و خواناتر شدهاست.
البته باید دقت داشت که این بحث صرفا سمت سرور بوده و ارتباطی به مباحث غیرهمزمان سمت کلاینت، مانند Ajax ندارد (A در Ajax نیز به معنای Async است) و از دید مصرف کنندهی نهایی، نامرئی میباشد. کار Aajx در سمت کلاینت نیز خالی کردن ترد UI مرورگر است (و نه سرور) و در نهایت تهیهی برنامههایی با قابلیت پاسخدهی بهتر.
نوشتن اکشن متدهای Async در ASP.NET MVC
اولین کاری که باید صورت گیرد، اندکی تغییر امضای اکشن متدهای متداول است:
این اکشن متد متداول، در یک ترد اجرا شده و این ترد تا پایان کار آن بلاک خواهد شد. برای مثال اگر قرار است مانند قسمت قبل، متد GetStringAsync در آن پردازش شود، تا پایان مدت زمان پردازش این متد، ترد جاری بلاک شده و سیستم قادر به استفادهی مجدد از آن جهت پاسخدهی به سایر درخواستهای رسیده نخواهد بود. برای تبدیل آن به یک اکشن متد async باید به نحو ذیل عمل کرد:
ابتدا واژهی کلیدی async به ابتدای امضای متد اضافه میشود. سپس خروجی آن اینبار بجای ActionResult، نسخهی جنریک Task of T خواهد بود. همچنین دیگر نیازی نیست مانند MVC 3، کنترلر جاری از کلاس AsyncController مشتق شود.
زمانیکه به امضای متدی، async اضافه میشود، یعنی جایی در داخل بدنهی آن باید await بکار رود:
بنابراین اگر داخل اکشن متد جاری، جایی از await استفاده نمیشود، async کردن آن بیمعنا است. این await است که سبب آزاد شدن ترد جاری جهت استفادهی مجدد از آن برای پاسخدهی به سایر درخواستهای رسیده میشود.
یک نکته در مورد WCF 4.5
از WCF 4.5 به بعد، در صفحهی معروف Add service references آن، با کلیک بر روی گزینهی advanced و تنظیمات سرویس، امکان انتخاب گزینهی Create task based operations نیز وجود دارد. این مورد دقیقا برای سهولت استفاده از آن با async و await سیشارپ 5 و مدل TAP آن طراحی شدهاست.
تعیین timeout در اکشن متدهای async
برای مشخص سازی صریح timeout در اکشن متدهای غیرهمزمان، میتوان از ویژگی خاصی به نام AsyncTimeout به نحو ذیل استفاده کرد:
در مورد لغو اعمال غیرهمزمان پیشتر صحبت شد. در اینجا پارامتر CancellationToken توسط فریم ورک جاری تنظیم شده و میتوان آنرا به متدهایی که قادرند اعمال غیر همزمان خود را بر اساس درخواست رسیده CancellationToken لغو کنند، ارسال کرد.
استفاده از قابلیتهای غیرهمزمان EF 6 به همراه ASP.NET MVC 5
EF 6 به همراه یک سری متد و همچنین متد الحاقی جدید است که اعمال Async را پشتیبانی میکنند. اگر در حین انتخاب گزینهی ایجاد کنترلر جدید، گزینهی MVC 5 Controller with views, using EF را انتخاب کنید، امکان تولید اکشن متدهای async نیز به صورت پیش فرض پیش بینی شدهاست:
در اینجا نیز امضای اکشن متد، همانند توضیحاتی است که در ابتدای بحث ارائه شد. فقط بجای متد ToList معمولی EF، از نگارش Async آن استفاده شدهاست و همچنین برای دریافت نتیجهی آن از کلمهی کلیدی await استفاده گردیده است.
به علاوه متد Find اکنون معادل FindAsync نیز دارد و همچنین SaveChanges دارای معادل غیرهمزمانی شدهاست به نام SaveChangesAsync .
البته باید دقت داشت که برای Where معادل Async ایی طراحی نشدهاست؛ زیرا نوع IQueryable صرفا یک عبارت است و اجرای آن تا زمانیکه ToList، First و امثال آن فراخوانی نشوند، به تعویق خواهد افتاد.
علت استفاده از اکشن متدهای async در ASP.NET MVC
اگر نیاز دارید که برنامهی وبی، به شدت مقیاس پذیر را تولید کنید، باید بتوانید مجموعه تردهای سیستم را تا حد ممکن مشغول به کار و سرویس دهی نگه دارید. در برنامههای وب ASP.NET تنها تعداد مشخصی ترد، برای پاسخ دهی به درخواستهای رسیده، همواره مشغول به کار میباشند. در اینجا اگر این تردها را برای مدت زمان زیادی جهت اعمال IO مشغول نگه داریم، دست آخر به سیستمی خواهیم رسید که تردهای مفید آن، جهت پایان عملیات مرتبط بیکار شدهاند و دیگر ASP.NET قادر نیست از آنها جهت پاسخدهی به سایر درخواستهای رسیده استفاده کند.
برای مثال یک اکشن متد را درنظر بگیرید که نیاز است با یک وب سرویس، برای دریافت نتیجه کار کند. اگر این عملیات اندکی طول بکشد، به همین میزان ترد جاری درحال پردازش این درخواست، بیکار شده و منتظر دریافت پاسخ خواهد ایستاد و اگر به همین ترتیب تعداد تردهای بیکار، بیشتر و بیشتر شوند، دیگر سیستم قادر نخواهد بود به درخواستهای جدید رسیده پاسخ دهد و ASP.NET مجبور خواهد شد این درخواستها را در صف قرار دهد تا بالاخره زمانی این تردها آزاد شده و قابل استفادهی مجدد گردند. برای رفع این مشکل، استفاده از اعمال غیرهمزمان ابداع گردیدند تا در آنها ترد مورد استفاده جهت پردازش درخواست رسیده را آزاد کرده و به این ترتیب دیگر نیازی نباشد تا تردجاری، تا پایان عملیات IO بلاک شده و بدون استفاده باقی بماند.
در ASP.NET MVC 3 برای نوشتن اکشن متدهای async میبایستی از روش قدیمی مدلهای Async در دات نت مانند APM استفاده میشد و همچنین کنترلر جاری بجای ارث بری از کلاس Controller میبایستی از کلاس AsyncController مشتق میشد. به علت سخت بودن استفاده از آن، این روش و کنترلرهای async در نگاش 3 آن آنچنان مقبولیت و استفادهی گستردهای نیافتند. چون هر اکشن متد تبدیل میشد به دو قسمت Begin و End متداول روشهای APM. سپس در کشن متد دومی، نتیجهی این عملیات به View بازگشت داده میشد.
از ASP.NET MVC 4 به بعد، خالی کردن تردهای سیستم و استفادهی مجدد و مشغول به کار نگه داشتن مداوم آنها با استفاده از امکانات توکار زبانهایی مانند سیشارپ 5، سادهتر و خواناتر شدهاست.
البته باید دقت داشت که این بحث صرفا سمت سرور بوده و ارتباطی به مباحث غیرهمزمان سمت کلاینت، مانند Ajax ندارد (A در Ajax نیز به معنای Async است) و از دید مصرف کنندهی نهایی، نامرئی میباشد. کار Aajx در سمت کلاینت نیز خالی کردن ترد UI مرورگر است (و نه سرور) و در نهایت تهیهی برنامههایی با قابلیت پاسخدهی بهتر.
نوشتن اکشن متدهای Async در ASP.NET MVC
اولین کاری که باید صورت گیرد، اندکی تغییر امضای اکشن متدهای متداول است:
public ActionResult Index()
public async Task<ActionResult> Index()
زمانیکه به امضای متدی، async اضافه میشود، یعنی جایی در داخل بدنهی آن باید await بکار رود:
using System.Net.Http; using System.Threading.Tasks; using System.Web.Mvc; namespace Async11.Controllers { public class HomeController : Controller { public async Task<ActionResult> Index() { var url = "https://www.dntips.ir"; var client = new HttpClient(); // make sure you have an assembly reference to System.Net.Http.dll client.DefaultRequestHeaders.UserAgent.ParseAdd("Test Async"); var result = await client.GetStringAsync(url); return View(result); } } }
یک نکته در مورد WCF 4.5
از WCF 4.5 به بعد، در صفحهی معروف Add service references آن، با کلیک بر روی گزینهی advanced و تنظیمات سرویس، امکان انتخاب گزینهی Create task based operations نیز وجود دارد. این مورد دقیقا برای سهولت استفاده از آن با async و await سیشارپ 5 و مدل TAP آن طراحی شدهاست.
تعیین timeout در اکشن متدهای async
برای مشخص سازی صریح timeout در اکشن متدهای غیرهمزمان، میتوان از ویژگی خاصی به نام AsyncTimeout به نحو ذیل استفاده کرد:
[AsyncTimeout(duration: 1200)] public async Task<ActionResult> Index(CancellationToken ct)
استفاده از قابلیتهای غیرهمزمان EF 6 به همراه ASP.NET MVC 5
EF 6 به همراه یک سری متد و همچنین متد الحاقی جدید است که اعمال Async را پشتیبانی میکنند. اگر در حین انتخاب گزینهی ایجاد کنترلر جدید، گزینهی MVC 5 Controller with views, using EF را انتخاب کنید، امکان تولید اکشن متدهای async نیز به صورت پیش فرض پیش بینی شدهاست:
public async Task<ActionResult> Index() { var model = await db.Books.ToListAsync(); return View(model); }
به علاوه متد Find اکنون معادل FindAsync نیز دارد و همچنین SaveChanges دارای معادل غیرهمزمانی شدهاست به نام SaveChangesAsync .
البته باید دقت داشت که برای Where معادل Async ایی طراحی نشدهاست؛ زیرا نوع IQueryable صرفا یک عبارت است و اجرای آن تا زمانیکه ToList، First و امثال آن فراخوانی نشوند، به تعویق خواهد افتاد.
اشتراکها
نگاهی به Xamarin.Forms
اشتراکها
اعداد و culture
بازخوردهای دوره
آشنایی با مدل برنامه نویسی TAP
- SynchronizationContext از دات نت 2 در دسترس است. بنابراین اجازه دهید مصرف کننده از متد Post آن در صورت صلاحدید، در هر جایی که لازم داشت برای ارسال نتیجهی دریافتی به تردی خاص، مثلا ترد UI استفاده کند. در این مورد در مطلب «استفاده از Async و Await در برنامههای دسکتاپ» بیشتر بحث شدهاست.
- SynchronizationContext.Current را اگر پیش از آغاز ترد دریافت کنید، به ترد جاری فراخوان اشاره میکند. در پایان ترد، میتوانید از متد Post آن برای بازگشت به ترد قبلی کمک بگیرید.
- SynchronizationContext.Current را اگر پیش از آغاز ترد دریافت کنید، به ترد جاری فراخوان اشاره میکند. در پایان ترد، میتوانید از متد Post آن برای بازگشت به ترد قبلی کمک بگیرید.