فرض کنید یک پوشه Export در ریشه سایت دارید که حاوی تعدادی فایل PDF عمومی است.
سؤال: آیا میشود دسترسی به فایلهای قرار گرفته در این پوشه عمومی را کنترل کرد؟ به نحوی که فقط کاربران عضو سایت پس از اعتبارسنجی بتوانند آنها را دریافت کنند؟
پاسخ: شاید عنوان کنید که میتوان از تگ location در فایل web.config برای اینکار استفاده کرد:
این تنظیمات هیچ اثری بر روی فایلهای استاتیک PDF ندارند؛ چون در IIS 6 از موتور ASP.NET رد نخواهند شد. مگر اینکه این نوع پسوندها به aspnet_isapi.dll انتساب داده شوند. در IIS 7 به بعد این وضع بهبود یافته است. اگر تنظیم runAllManagedModulesForAllRequests در وب کانفیگ برنامه به true تنظیم شده باشد و برنامه در حالت Integrated pipeline بجای Classic mode اجرا شود، امکان مدیریت فایلهای استاتیک نیز در برنامههای ASP.NET وجود دارد .
سؤال: آیا راه حلی وجود دارد که بتوان فایلهای استاتیک را صرفنظر از نوع، نگارش و حالت اجرای IIS توسط موتور ASP.NET مدیریت کرد؟
پاسخ: بلی. در ASP.NET MVC با تنظیم یک سطر ذیل، اینکار انجام میشود:
توضیحات:
RouteCollection در ASP.NET MVC به کمک امکانات MapPathBasedVirtualPathProvider خود، ابتدا درخواست رسیده را بررسی میکند. اگر این درخواست به یک فایل عمومی اشاره کند، کل سیستم مسیریابی را غیرفعال میکند. اما با تنظیم RouteExistingFiles دیگر این بررسی صورت نخواهد گرفت (به عبارتی در بالا بردن سرعت نمایشی سایت نیز تاثیر گذار خواهد بود؛ چون یکی از بررسیها را حذف میکند).
ایجاد کنترلری به نام پوشهای که قرار است محافظت شود
نام پوشه قرار گرفته در ریشه سایت، Export است. بنابراین برای هدایت درخواستهای رسیده به آن (پس از تنظیم فوق)، نیاز است یک کنترلر جدید را به نام Export نیز ایجاد کنیم:
البته بدیهی است در اینجا میتوان فیلتر Authorize را به کل کنترلر اعمال کرد، یا هر تنظیم دیگری که نیاز است.
برای اینکه بررسی کنیم، آیا واقعا فایلهای استاتیک قرار گرفته در پوشه Export به این کنترلر هدایت میشود یا خیر، یک breakpoint را بر روی سطر اول اکشن متد Index قرار میدهیم. برنامه را اجرا کنید ... کار نخواهد کرد، زیرا مسیر یک فایل فرضی به صورت ذیل:
به اکشن متد Index کنترلر Export، نگاشت نخواهد شد (index در این مسیر ذکر نشده است).
برای حل این مشکل فقط کافی است مسیر یابی متناظری را تعریف کنیم:
در اینجا ExportRoute را مشاهده میکنید که به آدرسهایی به فرم Export/id پاسخ میدهد. در این حالت به صورت خودکار با توجه به تنظیمات انجام شده، اکشن متدی که انتخاب میشود همان Index خواهد بود و نیازی به ذکر صریح آن نخواهد بود.
اینبار اگر برنامه را اجرا کنیم، breakpoint ما کار خواهد کرد:
تنظیمات ثانویه پس از فعال سازی RouteExistingFiles
در این حالت با فعال سازی مسیریابی فایلهای موجود، دیگر هیچ فایل استاتیکی به صورت معمول در اختیار کاربران قرار نخواهد گرفت و اگر همانند توضیحات قبل برای آنها کنترلر جداگانهای را تهیه نکنیم، عملا سایت از کار خواهد افتاد.
برای رفع این مشکل، در ابتدای متد RegisterRoutes فوق، تنظیمات ذیل را اضافه کنید تا پوشههای content، scripts و همچنین یک سری فایل با پسوند مشخص، همانند سابق و مستقیما توسط سرور ارائه شوند؛ در غیراینصورت کاربر پیغام 404 را پس از درخواست آنها، دریافت خواهد کرد:
سؤال: آیا میشود دسترسی به فایلهای قرار گرفته در این پوشه عمومی را کنترل کرد؟ به نحوی که فقط کاربران عضو سایت پس از اعتبارسنجی بتوانند آنها را دریافت کنند؟
پاسخ: شاید عنوان کنید که میتوان از تگ location در فایل web.config برای اینکار استفاده کرد:
<location path="Export"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>
سؤال: آیا راه حلی وجود دارد که بتوان فایلهای استاتیک را صرفنظر از نوع، نگارش و حالت اجرای IIS توسط موتور ASP.NET مدیریت کرد؟
پاسخ: بلی. در ASP.NET MVC با تنظیم یک سطر ذیل، اینکار انجام میشود:
public static void RegisterRoutes(RouteCollection routes) { // ... routes.RouteExistingFiles = true; // ... }
RouteCollection در ASP.NET MVC به کمک امکانات MapPathBasedVirtualPathProvider خود، ابتدا درخواست رسیده را بررسی میکند. اگر این درخواست به یک فایل عمومی اشاره کند، کل سیستم مسیریابی را غیرفعال میکند. اما با تنظیم RouteExistingFiles دیگر این بررسی صورت نخواهد گرفت (به عبارتی در بالا بردن سرعت نمایشی سایت نیز تاثیر گذار خواهد بود؛ چون یکی از بررسیها را حذف میکند).
ایجاد کنترلری به نام پوشهای که قرار است محافظت شود
نام پوشه قرار گرفته در ریشه سایت، Export است. بنابراین برای هدایت درخواستهای رسیده به آن (پس از تنظیم فوق)، نیاز است یک کنترلر جدید را به نام Export نیز ایجاد کنیم:
using System.IO; using System.Web.Mvc; namespace Mvc4RouteExistingFiles.Controllers { public class ExportController : Controller { public ActionResult Index(string id) { if (string.IsNullOrWhiteSpace(id)) { return Redirect("/"); } var fileName= Path.GetFileName(id); var path = Server.MapPath("~/export/"+ fileName); return File(path, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); } } }
برای اینکه بررسی کنیم، آیا واقعا فایلهای استاتیک قرار گرفته در پوشه Export به این کنترلر هدایت میشود یا خیر، یک breakpoint را بر روی سطر اول اکشن متد Index قرار میدهیم. برنامه را اجرا کنید ... کار نخواهد کرد، زیرا مسیر یک فایل فرضی به صورت ذیل:
http://localhost/export/test.pdf
برای حل این مشکل فقط کافی است مسیر یابی متناظری را تعریف کنیم:
using System.Web.Mvc; using System.Web.Routing; namespace Mvc4RouteExistingFiles { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.RouteExistingFiles = true; routes.MapRoute( name: "ExportRoute", url: "Export/{id}", defaults: new { controller = "Export", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
اینبار اگر برنامه را اجرا کنیم، breakpoint ما کار خواهد کرد:
تنظیمات ثانویه پس از فعال سازی RouteExistingFiles
در این حالت با فعال سازی مسیریابی فایلهای موجود، دیگر هیچ فایل استاتیکی به صورت معمول در اختیار کاربران قرار نخواهد گرفت و اگر همانند توضیحات قبل برای آنها کنترلر جداگانهای را تهیه نکنیم، عملا سایت از کار خواهد افتاد.
برای رفع این مشکل، در ابتدای متد RegisterRoutes فوق، تنظیمات ذیل را اضافه کنید تا پوشههای content، scripts و همچنین یک سری فایل با پسوند مشخص، همانند سابق و مستقیما توسط سرور ارائه شوند؛ در غیراینصورت کاربر پیغام 404 را پس از درخواست آنها، دریافت خواهد کرد:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("content/{*pathInfo}"); routes.IgnoreRoute("scripts/{*pathInfo}"); routes.IgnoreRoute("favicon.ico"); routes.IgnoreRoute("{resource}.ico"); routes.IgnoreRoute("{resource}.png"); routes.IgnoreRoute("{resource}.jpg"); routes.IgnoreRoute("{resource}.gif"); routes.IgnoreRoute("{resource}.txt");
مقدمه
یکی از امکانات اضافه شده در Sql Server 2012 ابزار Sql Server Data Tools یا به اختصار SSDT میباشد. این ابزار در واقع جایگزین ابزار Business Intelligence Development Studio می باشد که همه امکانات قبلی را داشته و همچنین قابلیتهای جدیدی نیز به آن اضافه شد است. اما کاربرد این ابزار ایجاد محیطی یکپارچه برای طراحی و توسعه تمامی نسخههای پایگاه داده Sql Server با استفاده از Visual Studio میباشد. در این مقاله من به بیشتر بر روی امکانات زیر تمرکز دارم:
- Installation
- Creating a SQL Server Database Project
- Modify Database Schema
- Schema Compare and Update
- Snapshot Project
- Publish
- نصب Sql Server Data Tools
آخرین نسخه این ابزار را از این آدرس دانلود کنید یا زمان نصب Sql Server 2012 گزینه آن را انتخاب کنید
- ایجاد یک پروژه جدید از نوع
SQL Server Database Project
پس از نصب SSDT شما از طریق Visual Studio 2012 Shell که همراه SqlServer 2012 نصب میشود یا با Visual Stadio 2012 یک پروژه جدید از نوع SQL Server Database Project ایجاد کنید.
Server Database Project Project به شما امکان توسعه پایگاه داده Sql Server را با استفاده از محیط یکپارچه Visual Studio با در اختیار گذاشتن ابزارهای همچون navigation, intellisense, validation, debugging, declarative editing و غیره را میدهد. شی پایگاه داده شما در پروژه و فایلهای مجزا ذخیره میشود مثل آن که شما در حال توسعه برنامه #C یا VB.NET هستید. - ورود پایگاه داده موجود به پروژه SQL Server Database
شما میتوانید شمای پایگاه داده موجود یا SQL Server DAC Package File (.dacpac) یا هر T-SQL دیگری را با راست کلیک بر روی پروژه و انتخاب گزینه Import به پروژه خود اضافه و تغییرات لازم را اعمال نماید شکل زیر پنجره Import Database را نشان میدهد:
پنجره Solution Explorer امکانات زیر را در اختیار شما قرارمی دهد:
- اضافه کردن اشیای همچون Table، View و غیره با راست کیلک کردن بر روی پروژه و انتخاب گزینه Add
- ویرایش اشیا موجود با دبل کیلک کردن بر روی اشیا
- مقایسه شمای پایگاه داده با پایگاه داده دیگر و یا Microsoft SQL Server DAC Package File کافیست بر روی پروژه راست کیلک و گزینه Schema Compare را انتخاب نمایید.
- ایجاد یک Snapshot از شمای پایگاه داده در یک Microsoft SQL Server DAC Package File . یک snapshot برای ایجاد یک پایگاه داده یا ورود در پروژه ای دیگر یا در مقایسه دو پایگاه داده کاربرد دارد.
- انتشار پایگاه داده که امکان ایجاد پایگاه داده یر روی یک سرور SQL Server را فراهم مینماید.
- مقایسه شمای دو پایگاه داده با هم
SSDT ابزاری برای مقایسه دو پایگاه داده و بروز رسانی پایگاه داده مقصد از روی شمای منبع از طریق ایجاد یک Script یا به صورت مستقیم را میدهد.
- انتشار پروژه با استفاده از SQL Server Data Tools
این ابزار امکان گسترش پروژه شما بر روی SQL Server 2005, 2008, 2008 R2, 2012, یا SQL Azure instance را میدهد. برای انتشار کافیت از پنجره Solution Explorer بر روی پروژه راست کیلک و گزینه Publish را انتخاب کنید.
- پنجره SQL Server Object Explorer
این پنجره با اتصال به سرور SQL Server امکان دسترسی و مدیریت پایگاه داده را به ما میدهد. علاوه بر دسترسی به اجزای یک پایگاه داده امکان مدیریت پوشههای Security , Server Objects نیز فراهم میباشد. همچنین امکان اتصال به Sql Server Express , localdb نیز وجود دارد.
- CORS تنظیمات اضافهتری را نسبت به نکاتی که در مطلب جاری عنوان شد، نیاز ندارد.
- شما خطای internal server error را دارید که ممکن است به اشتباه به خطای CORS از طرف مرورگر تفسیر شود (مرورگر هر زمانیکه نتواند پاسخ مناسبی را از سرور دریافت کند و این سرور شرایط CORS را هم داشته باشد، بلافاصله خطای CORS را نمایش میدهد). در برگهی network کنسول developer مرورگر، خروجی response را دقیقا بررسی کنید تا اصل خطا را مشاهده کنید. همچنین logging را هم در برنامهی خودتان فعال کنید تا خطاهای سمت سرور را دقیقا دریافت کنید.
- شما خطای internal server error را دارید که ممکن است به اشتباه به خطای CORS از طرف مرورگر تفسیر شود (مرورگر هر زمانیکه نتواند پاسخ مناسبی را از سرور دریافت کند و این سرور شرایط CORS را هم داشته باشد، بلافاصله خطای CORS را نمایش میدهد). در برگهی network کنسول developer مرورگر، خروجی response را دقیقا بررسی کنید تا اصل خطا را مشاهده کنید. همچنین logging را هم در برنامهی خودتان فعال کنید تا خطاهای سمت سرور را دقیقا دریافت کنید.
آیا میدانید که تا این تاریخ پس از ارائه سرویس پک یک اس کیوال سرور 2008، دقیقا 5 به روز رسانی دیگر نیز در مورد آن منتشر شدهاند؟
آیا میدانید پس از ارائه سرویس پک سه مربوط به اس کیوال سرور 2005 ، دقیقا 10 مورد به روز رسانی دیگر آن نیز منتشر گردیدهاند؟
آیا میدانید پس از سرویس پک 4 اس کیوال سرور 2000 دقیقا چند مورد به روز رسانی مرتبط با آن منتشر شدهاند؟ (72 مورد!)
آیا میدانید دقیقا از چه نگارشی از SQL Server با کدام به روز رسانیها استفاده میکنید؟
پاسخ دقیق به تمام این سؤالات را به صورت طبقه بندی شده و بسیار منظم، در وبلاگ زیر میتوانید مشاهده نمائید:
اشتراکها
استفاده از Chart.js در Blazor
This is a Blazor library that wraps Chart.js. You can use it in both client- and server-side projects.