«... اگر فضای نام این کلاس (AppJwtConfiguration) را تغییر دادید، باید این قسمت (مقدار type قسمت appJwtConfiguration فایل وب کانفیگ) را نیز مطابق آن
ویرایش کنید؛ درغیراینصورت، appJwtConfiguration قابل شناسایی نخواهد بود ...»
نظرات مطالب
مدل EAV چیست؟
طوری که مجنتو طراحی کرده است مطابق فایل ضمیمه برای هر type یک مجموعه جدول طراحی کرده است.فکر میکنم این شیوه بهینه میباشد.
پاسخ به بازخوردهای پروژهها
خطای data binding
AxAcroPdf توسط VS.NET ساخته میشود و مهم نیست. یکبار که ارجاع به active-x یاد شده مطابق مقالات فوق اضافه شود، فایل AxAcroPdf به صورت خودکار تولید خواهد شد.
نظرات اشتراکها
فراخوانی بیشتر از یک بار "window.onload"
- اگر از MVC استفاده میکنید، در فایل layout
به کمک RenderSection کلیه اسکریپتهای inline فقط در همین مکان فراخوانی آن قرار میگیرند. به این ترتیب در Viewها فقط کافی است یک section به نام JavaScript اضافه کرد تا در این مکان درج شود.
- در ASP.NET Web forms هم میشود این نظم رو پدید آورد. از ContentPlaceHolder استفاده کنید. یکی در master page تعریف شود دیگری در وب فرم به ارث رسیده از آن برای قرار دادن اسکریپتهای خاص همان صفحه.
حالا وب فرم شما فقط کافی است اسکریپتهای خاص خودش را با ID فوق درج کنه
... اینجا اسکریپتهای عمومی قرار گیرند قبل از پایان فایل @RenderSection("JavaScript", false) </body> </html>
- در ASP.NET Web forms هم میشود این نظم رو پدید آورد. از ContentPlaceHolder استفاده کنید. یکی در master page تعریف شود دیگری در وب فرم به ارث رسیده از آن برای قرار دادن اسکریپتهای خاص همان صفحه.
.... سایر قسمتهای فایل مستر پیج <asp:ContentPlaceHolder id='PageScriptPlaceHolder' runat='server'> </asp:ContentPlaceHolder> </body>
<asp:Content ID='ScriptIncludes' runat='server' ContentPlaceHolderID='PageScriptPlaceHolder'> اسکریپتهای صفحه در اینجا </asp:Content>
زیرنویسهای فارسی قسمت پنجم «Building Windows 8 Metro Apps in C# and XAML» را از اینجا و یا اینجا میتونید دریافت کنید.
لیست سرفصلهای قسمت پنجم به شرح زیر است:
Application Model 00:59:50
Metro and WinRT introduce some significant changes to the world in which applications execute.
This module describes the implications for developers.
Introduction
Application Lifecycle
Demo: Application Lifecycle
Managing State
Demo: Saving State
Splash Screens
Launching Applications
Application Manifest
Packaging
Summary
این قسمت به جزئیات نحوه اجرای برنامههای مترو میپردازد. اگر با IIS کار کرده باشید، سیکل اجرایی برنامههای مترو ویندوز 8، همانند سیکل اجرایی برنامههای ASP.NET شده است! ویندوز مختار است برنامه شما را پس از مدتی بیکاری (البته این مدت در اینجا فقط 5 ثانیه است!)، معلق کرده یا حتی خاتمه دهد و تمام اینها هم از دید کاربر نهایی مخفی است. مانند زمانیکه یک برنامه ASP.NET پس از مدتی بیکاری، توسط IIS خاتمه مییابد (از حافظه خارج میشود) و پس از مدتی با رسیدن یک درخواست جدید، یک پروسه جدید برای اجرای آن ایجاد شده و مجددا سایت شروع به کار خواهد کرد؛ اینجا هم در دنیای مترو تقریبا به همین نحو با یک برنامه رفتار میشود.
یک نکته جالب دیگر هم در برنامههای مترو وجود دارد: ترد اصلی برنامه از ترد رابط کاربری جدا شده است. برای مثال سازنده کلاس App برنامه در یک ترد و رابط کاربری برنامه در ترد مجزای دیگری اجرا میشوند.
به علاوه روشهای متفاوتی هم برای اجرای برنامههای مترو درنظر گرفته شده. دیگر فقط حالت کلیک بر روی یک برنامه سبب اجرای آن نمیشود. میتوان بر اساس اتصال یک سخت افزار خاص به سیستم یا حتی یک جستجو هم سبب اجرای برنامهای شد. برای مثال میتوانید برنامه خود را طوری طراحی کنید که نتیجهی جستجویی را در سیستم نمایش دهد.
سیستم بسته بندی برنامههای مترو نیز بسیار شبیه به فایلهای XAP برنامههای سیلورلایت است که همه چیز داخل یک فایل قرار داده میشود؛ از فایلهای تنظیمات برنامه تا فایلهای کامپایل شده و منابع مورد نیاز. البته در اینجا نامش به appx تغییر یافته است به علاوه یک فایل cer که حاوی مجوز دیجیتال اجباری توزیع برنامههای مترو در فروشگاه ویندوز است.
یک نکتهی تکمیلی: در نسخهی اخیر افزونه jquery-ajax-unobtrusive، ارسال فایل با استفاده از FormData نیز به صورت توکار پشتیبانی میشود.
یک نکتهی تکمیلی: در نسخهی اخیر افزونه jquery-ajax-unobtrusive، ارسال فایل با استفاده از FormData نیز به صورت توکار پشتیبانی میشود.
مطالب
BloggerToCHM 1.3
نگارش جدید برنامه BloggerToCHM را از اینجا میتوانید دریافت کنید.
تغییرات حاصل شده:
- پشتیبانی بهتر از تغییرات open search API که هر از چندگاهی توسط گوگل اعمال میشود.
- رفع مشکل تخریب اعداد فارسی در فایل تولیدی نهایی
- اضافه شدن چند گزینه جهت کنترل بر روی نمایش قسمت about در فایل نهایی حاصل و همچنین درج نظرات
- و ...
CSRF یا Cross Site Request Forgery به صورت خلاصه به این معنا است که شخص مهاجم اعمالی را توسط شما و با سطح دسترسی شما بر روی سایت انجام دهد و اطلاعات مورد نظر خود را استخراج کرده (محتویات کوکی یا سشن و امثال آن) و به هر سایتی که تمایل دارد ارسال کند. اینکار عموما با تزریق کد در صفحه صورت میگیرد. مثلا ارسال تصویری پویا به شکل زیر در یک صفحه فوروم، بلاگ یا ایمیل:
<img src="http://www.example.com/logout.aspx">
شخصی که این صفحه را مشاهده میکند، متوجه وجود هیچگونه مشکلی نخواهد شد و مرورگر حداکثر جای خالی تصویر را به او نمایش میدهد. اما کدی با سطح دسترسی شخص بازدید کننده بر روی سایت اجرا خواهد شد.
روشهای مقابله:
- هر زمانیکه کار شما با یک سایت حساس به پایان رسید، log off کنید. به این صورت بجای منتظر شدن جهت به پایان رسیدن خودکار طول سشن، سشن را زودتر خاتمه دادهاید یا برنامه نویسها نیز باید طول مدت مجاز سشن در برنامههای حساس را کاهش دهند. شاید بپرسید این مورد چه اهمیتی دارد؟ مرورگری که امکان اجازهی بازکردن چندین سایت با هم را به شما در tab های مختلف میدهد، ممکن است سشن یک سایت را در برگهای دیگر به سایت مهاجم ارسال کند. بنابراین زمانیکه به یک سایت حساس لاگین کردهاید، سایتهای دیگر را مرور نکنید. البته مرورگرهای جدید مقاوم به این مسایل شدهاند ولی جانب احتیاط را باید رعایت کرد.
- در برنامه خود قسمت Referrer header را بررسی کنید. آیا متد POST رسیده، از سایت شما صادر شده است یا اینکه صفحهای دیگر در سایتی دیگر جعل شده و به برنامه شما ارسال شده است؟ هر چند این روش آنچنان قوی نیست و فایروالهای جدید یا حتی بعضی از مرورگرها با افزونههایی ویژه، امکان عدم ارسال این قسمت از header درخواست را میسر میسازند.
- برنامه نویسها نباید مقادیر حساس را از طریق GET requests ارسال کنند. استفاده از روش POST نیز به تنهایی کارآمد نیست و آنرا باید با random tokens ترکیب کرد تا امکان جعل درخواست منتفی شود. برای مثال استفاده از ViewStateUserKey در ASP.Net . جهت خودکار سازی اعمال این موارد در ASP.Net، اخیرا HTTP ماژول زیر ارائه شده است:
تنها کافی است که فایل dll آن در دایرکتوری bin پروژه شما قرار گیرد و در وب کانفیگ برنامه ارجاعی به این ماژول را لحاظ نمائید.
کاری که این نوع ماژولها انجام میدهند افزودن نشانههایی اتفاقی ( random tokens ) به صفحه است که مرورگر آنها را بخاطر نمیسپارد و این token به ازای هر سشن و صفحه منحصر بفرد خواهد بود.
برای PHP نیز چنین تلاشهایی صورت گرفته است:
http://csrf.htmlpurifier.org/
مراجعی برای مطالعه بیشتر
Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helper
Cross-site request forgery
Top 10 2007-Cross Site Request Forgery
CSRF - An underestimated attack method
فرض کنید میخواهید از await در متد Main یک برنامهی کنسول به نحو ذیل استفاده کنید:
کامپایلر چنین اجازهای را نمیدهد. زیرا از await جایی میتوان استفاده کرد که متد فراخوان آن با async مزین شده باشد و همچنین دارای یک Context باشد تا نتیجه را بتواند دریافت کند. اگر در اینجا سعی کنید async را به امضای متد Main اضافه نمائید، کامپایلر مجددا خطای an entry point cannot be marked with the 'async' modifier را صادر میکند.
اضافه کردن واژهی کلیدی async به روالهای رخدادگردان void برنامههای دسکتاپ مجاز است؛ با توجه به اینکه متد async پیش از پایان کار به فراخوان بازگشت داده میشوند (ذات متدهای async به این نحو است). در برنامههای دسکتاپ، این بازگشت به UI event loop است؛ بنابراین برنامه بدون مشکل به کار خود ادامه خواهد داد. اما در اینجا، بازگشت متد Main، به معنای بازگشت به OS است و خاتمهی برنامه. به همین جهت کامپایلر از async کردن آن ممانعت میکند.
برای حل این مشکل در برنامههای کنسول و همچنین برنامههای سرویس ویندوز NT که دارای یک async-compatible context نیستند، میتوان از یک کتابخانهی کمکی سورس باز به نام Nito AsyncEx استفاده کرد. برای نصب آن دستور ذیل را در کنسول پاورشل نیوگت وارد کنید:
پس از نصب برای استفاده از آن خواهیم داشت:
Context ارائه شده در اینجا برخلاف مثالهای قسمتهای قبل، نیازی به فراخوانی متد همزمان Wait و یا خاصیت Result که هر دو از نوع blocking هستند ندارد و یک فراخوانی async واقعی است. همچنین میشد یک متد async void را نیز در اینجا برای استفاده از DownloadStringTaskAsync تعریف کرد (تا برنامه کامپایل شود). اما پیشتر عنوان شد که هدف از این نوع متدهای خاص async void صرفا استفاده از آنها در روالهای رخدادگردان UI هستند. زیرا ماهیت آنها fire and forget است و برای دریافت نتیجهی نهایی به نحوی باید ترد اصلی را قفل کرد. برای مثال در یک برنامهی کنسول متد Console.ReadLine را در انتهای کار فراخوانی کرد. اما با استفاده از AsyncContext.Run نیازی به این کارها نیست.
async lambda
در مثال فوق از یک async lambda، برای فراخوانی استفاده شده است که به همراه دات نت 4.5 ارائه شدهاند:
آرگومان متد AsyncContext.Run از نوع Func of Task است. بنابراین برای مقدار دهی inline آن توسط lambda expressions مطابق مثالهای فوق میتوان از async lambda استفاده کرد.
روش دوم استفاده از AsyncContext.Run و مقدار دهی Func of Task، تعریف یک متد مستقل async Task دار، به نحو ذیل است:
رخدادهای مرتبط با طول عمر برنامه را async تعریف نکنید
همانند متد Main که async تعریف کردن آن سبب بازگشت آنی روال کار به OS میشود و برنامه خاتمه مییابد، روالهای رخدادگردانی که با طول عمر یک برنامهی UI سر و کار دارند مانند Application_Launching، Application_Closing، Application_Activated و Application_Deactivated (خصوصا در برنامههای ویندوز 8) نیز نباید async void تعریف شوند (چون مطابق ذات متدهای async، بلافاصله به برنامه اعلام میکنند که کار تمام شد). در این موارد خاص نیز میتوان از متد AsyncContext.Run برای انجام اعمال async استفاده کرد.
using System; using System.Net; namespace Async15 { class Program { static void Main(string[] args) { using (var webClient = new WebClient { }) { webClient.Headers.Add("User-Agent", "AsyncContext 1.0"); var data = await webClient.DownloadStringTaskAsync("https://www.dntips.ir"); Console.WriteLine(data); } } } }
اضافه کردن واژهی کلیدی async به روالهای رخدادگردان void برنامههای دسکتاپ مجاز است؛ با توجه به اینکه متد async پیش از پایان کار به فراخوان بازگشت داده میشوند (ذات متدهای async به این نحو است). در برنامههای دسکتاپ، این بازگشت به UI event loop است؛ بنابراین برنامه بدون مشکل به کار خود ادامه خواهد داد. اما در اینجا، بازگشت متد Main، به معنای بازگشت به OS است و خاتمهی برنامه. به همین جهت کامپایلر از async کردن آن ممانعت میکند.
برای حل این مشکل در برنامههای کنسول و همچنین برنامههای سرویس ویندوز NT که دارای یک async-compatible context نیستند، میتوان از یک کتابخانهی کمکی سورس باز به نام Nito AsyncEx استفاده کرد. برای نصب آن دستور ذیل را در کنسول پاورشل نیوگت وارد کنید:
PM> Install-Package Nito.AsyncEx
using System; using System.Net; using Nito.AsyncEx; namespace Async15 { class Program { static void Main(string[] args) { AsyncContext.Run(async () => { using (var webClient = new WebClient()) { webClient.Headers.Add("User-Agent", "AsyncContext 1.0"); var data = await webClient.DownloadStringTaskAsync("https://www.dntips.ir"); Console.WriteLine(data); } }); } } }
async lambda
در مثال فوق از یک async lambda، برای فراخوانی استفاده شده است که به همراه دات نت 4.5 ارائه شدهاند:
Action, () => { } Func<Task>, async () => { await Task.Yield(); } Func<TResult>, () => { return 13; } Func<Task<TResult>>, async () => { await Task.Yield(); return 13; }
روش دوم استفاده از AsyncContext.Run و مقدار دهی Func of Task، تعریف یک متد مستقل async Task دار، به نحو ذیل است:
class Program { static async Task<int> AsyncMain() { .. } static int Main(string[] args) { return AsyncContext.Run(AsyncMain); } }
رخدادهای مرتبط با طول عمر برنامه را async تعریف نکنید
همانند متد Main که async تعریف کردن آن سبب بازگشت آنی روال کار به OS میشود و برنامه خاتمه مییابد، روالهای رخدادگردانی که با طول عمر یک برنامهی UI سر و کار دارند مانند Application_Launching، Application_Closing، Application_Activated و Application_Deactivated (خصوصا در برنامههای ویندوز 8) نیز نباید async void تعریف شوند (چون مطابق ذات متدهای async، بلافاصله به برنامه اعلام میکنند که کار تمام شد). در این موارد خاص نیز میتوان از متد AsyncContext.Run برای انجام اعمال async استفاده کرد.