Quantcast
Channel: ‫فید گروه entity framework .NET Tips
Viewing all articles
Browse latest Browse all 112

‫حذف پردازش درخواست‌های فایل‌های استاتیک در متد Application_AuthenticateRequest

$
0
0
پروژه‌ی «فروشگاه شهر طلایی من» را اگر در برنامه‌ی DNTProfilerبررسی کنیم، در برگه‌ی Urls آن یک چنین گزارش‌هایی را می‌توان مشاهده کرد:


همانطور که مشاهده می‌کنید، درخواست یک فایل استاتیک، سبب اجرای یک کوئری بر روی بانک اطلاعاتی شده‌است و یک Context خاص خودش را نیز ایجاد کرده‌است. اگر به قسمت سابقه‌ی متدهایی که سبب بروز این امر شده‌اند (در همان برگه‌، در پایین صفحه) دقت کنیم، به متد Application_AuthenticateRequest فایل global.asax.csمی‌رسیم. هر چند در فایل RouteConfig.csمسیرهای اسکریپت‌ها و فایل‌های CSS جهت صرفنظر شدن معرفی شده‌اند، اما این موارد بر روی متد خاص Application_AuthenticateRequest تاثیری ندارند و این متد به ازای هر درخواست رسیده‌ی به IIS یکبار اجرا می‌شود؛ زیرا یک چنین تنظیمی در فایل web.config وجود دارد:
<modules runAllManagedModulesForAllRequests="true">
به همین دلیل است که حتی درخواست فایل‌های استاتیک نیز سبب اجرای ماژول forms authentication و بروز صدور یک کوئری شده‌اند.


کنترل ASP.NET MVC Bundles در حین Forms Authentication

اگر بخواهیم درخواست‌های رسیده‌ی به Application_AuthenticateRequest را کنترل کنیم، می‌توان چنین متدی را تدارک دید:
private bool shouldIgnoreRequest()
{    string[] reservedPath =    {        "/__browserLink",        "/img",        "/fonts",        "/Scripts",        "/Content"    };    var rawUrl = Context.Request.RawUrl;    if (reservedPath.Any(path => rawUrl.StartsWith(path, StringComparison.OrdinalIgnoreCase)))    {        return true;    }    return BundleTable.Bundles.Select(bundle => bundle.Path.TrimStart('~'))              .Any(bundlePath => rawUrl.StartsWith(bundlePath, StringComparison.OrdinalIgnoreCase));
}
در اینجا یک سری مسیر مشخص مانند پوشه‌ی تصاویر، قلم‌ها و اسکریپت‌ها و امثال آن معرفی شده‌اند. همچنین BundleTable.Bundles نیز مورد بررسی قرار گرفته‌است. در حین استفاده‌ی از ASP.NET MVC Bundles دیگر مسیرها الزاما به پوشه‌ی Content ختم نخواهند شد:
 bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
 "~/Scripts/modernizr-*"));
 و بر اساس تعریف پارامتر bundles/modernizer/~ مسیری مانند localhost/bundles/modernizer درخواست خواهد شد. برای دسترسی به این مسیرهای سفارشی تعریف شده می‌توان از مجموعه‌ی BundleTable.Bundles، مطابق متد فوق کوئری گرفت و مسیرهای درخواستی را که با مسیرهای bundles سفارشی تعریف شده تطابق دارند، دیگر پردازش نکرد:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    if (shouldIgnoreRequest()) return;
    if (Context.User == null)
        return;

Viewing all articles
Browse latest Browse all 112

Trending Articles