ذخیره سازی اطلاعات بازدیدهای کاربران، در طول زمان حجم بالایی از بانک اطلاعاتی را به خود اختصاص خواهد داد؛ به علاوه کند شدن کوئریهای مرتبط با آن، به همراه مصرف بالای منابع سیستم. به همین جهت اکثر سایتها از Google analytics برای مدیریت جمع آوری بازدیدهای کاربران خود استفاده میکنند و این ابزار واقعا عالی و حرفهای طراحی شده و پیاده سازی همانند آن شاید در حد یک پروژهی چندساله باشد.
اضافه کردن Google analytics به یک سایت، بسیار ساده است. در آن ثبت نام میکنید؛ سپس آدرس دومین خود را وارد کرده و یک قطعه کد جاوا اسکریپتی را دریافت خواهید کرد که باید به انتهای تمام صفحات سایت خود اضافه نمائید و ... همین.
اضافه کردن این کد در ASP.NET MVC میتواند در فایل layout یا همان master page سایت انجام شود تا به صورت خودکار به تمام صفحات اعمال گردد.
مشکل!
من نمیخواهم که صفحات غیرعمومی سایت نیز دارای کدهای Google analytics باشند و بیجهت Google به اینجاها نیز سرکشی زاید کند! چکار باید کرد؟
احتمالا عنوان میکنید که باید یک if و else به همراه آرایهای از نامها و آدرسهای صفحات غیرعمومی سایت تهیه کرد و بر این اساس کدهای Google analytics را در master page درج کرد یا خیر.
بله. این روش کار میکنه ولی بهینه نیست و همچنین نگهداری آن در طول زمان مشکل است. سایت توسعه خواهد یافت، صفحات غیرعمومی بیشتر خواهند شد و ممکن است در این بین فراموش شود که کدهای مرتبط به روز شوند.
روش بهتر:
آیا میتوان در یک View مشخص کرد که فیلتر Authorize در اکشن متد متناظری که آنرا رندر کرده است بکار گرفته شده است یا خیر؟
صفحات غیرعمومی سایت در ASP.NET MVC با فیلتر Authorize محافظت میشوند. این فیلتر را میتوان به کل یک کنترلر اعمال کرد تا به تمام اکشن متدهای آن اعمال شود؛ یا فقط به یک اکشن متد خاص که Viewایی خاص را رندر میکند.
نحوه پیاده سازی تشخیص وجود فیلتر Authorize را در یک View رندر شده، در متد کمکی زیر میتوان مشاهده کرد:
توضیحات:
این متد در فایلی به نام HtmlUtils قرار گرفته در پوشه app_code تعریف شده است و بکارگیری آن در یک فایل master page به نحو زیر خواهد بود:
در این متد به کمک خاصیت page.ViewContext.Controller میتوان به کنترلری که در حال رندر کردن View جاری است دسترسی یافت. اکنون که به کنترلر دسترسی داریم، به کمک Reflection، ویژگیها یا Attributes آنرا یافته و بررسی میکنیم که آیا دارای AuthorizeAttribute است یا خیر. بر این اساس میتوان تصمیم گرفت که آیا View در حال نمایش عمومی است یا خصوصی. اگر عمومی بود، کدهای اسکریپتی Google analytics به صورت خودکار به صفحه تزریق میشوند.
همچنین در اینجا فرض بر این است که Id منتسب به دومین جاری در کلیدی به نام GoogleAnalyticsID در فایل کانفیگ برنامه در قسمت app settings آن تعریف شده است.
اضافه کردن Google analytics به یک سایت، بسیار ساده است. در آن ثبت نام میکنید؛ سپس آدرس دومین خود را وارد کرده و یک قطعه کد جاوا اسکریپتی را دریافت خواهید کرد که باید به انتهای تمام صفحات سایت خود اضافه نمائید و ... همین.
اضافه کردن این کد در ASP.NET MVC میتواند در فایل layout یا همان master page سایت انجام شود تا به صورت خودکار به تمام صفحات اعمال گردد.
مشکل!
من نمیخواهم که صفحات غیرعمومی سایت نیز دارای کدهای Google analytics باشند و بیجهت Google به اینجاها نیز سرکشی زاید کند! چکار باید کرد؟
احتمالا عنوان میکنید که باید یک if و else به همراه آرایهای از نامها و آدرسهای صفحات غیرعمومی سایت تهیه کرد و بر این اساس کدهای Google analytics را در master page درج کرد یا خیر.
بله. این روش کار میکنه ولی بهینه نیست و همچنین نگهداری آن در طول زمان مشکل است. سایت توسعه خواهد یافت، صفحات غیرعمومی بیشتر خواهند شد و ممکن است در این بین فراموش شود که کدهای مرتبط به روز شوند.
روش بهتر:
آیا میتوان در یک View مشخص کرد که فیلتر Authorize در اکشن متد متناظری که آنرا رندر کرده است بکار گرفته شده است یا خیر؟
صفحات غیرعمومی سایت در ASP.NET MVC با فیلتر Authorize محافظت میشوند. این فیلتر را میتوان به کل یک کنترلر اعمال کرد تا به تمام اکشن متدهای آن اعمال شود؛ یا فقط به یک اکشن متد خاص که Viewایی خاص را رندر میکند.
نحوه پیاده سازی تشخیص وجود فیلتر Authorize را در یک View رندر شده، در متد کمکی زیر میتوان مشاهده کرد:
@helper IncludeGoogleAnalytics(WebViewPage page) { var controller = page.ViewContext.Controller; var controllerHasAuthorizeAttribute = controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), true).Any(); var currentActionName = page.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString(); var actionHasAuthorizeAttribute = controller.GetType().GetMethods() .Where(x => x.Name == currentActionName && x.GetCustomAttributes(typeof(AuthorizeAttribute), true).Any()) .Any(); if (!controllerHasAuthorizeAttribute && !actionHasAuthorizeAttribute) { string trackingId = ConfigurationManager.AppSettings["GoogleAnalyticsID"]; <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', '@trackingId']); _gaq.push(['_trackPageview']); (function () { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> }
توضیحات:
این متد در فایلی به نام HtmlUtils قرار گرفته در پوشه app_code تعریف شده است و بکارگیری آن در یک فایل master page به نحو زیر خواهد بود:
@HtmlUtils.IncludeGoogleAnalytics(this)
در این متد به کمک خاصیت page.ViewContext.Controller میتوان به کنترلری که در حال رندر کردن View جاری است دسترسی یافت. اکنون که به کنترلر دسترسی داریم، به کمک Reflection، ویژگیها یا Attributes آنرا یافته و بررسی میکنیم که آیا دارای AuthorizeAttribute است یا خیر. بر این اساس میتوان تصمیم گرفت که آیا View در حال نمایش عمومی است یا خصوصی. اگر عمومی بود، کدهای اسکریپتی Google analytics به صورت خودکار به صفحه تزریق میشوند.
همچنین در اینجا فرض بر این است که Id منتسب به دومین جاری در کلیدی به نام GoogleAnalyticsID در فایل کانفیگ برنامه در قسمت app settings آن تعریف شده است.