اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
در یکی از پروژههایی که دارم از AngularJS و ASP.NET MVC استفاده میکنم. به هنگام استفاده از درخواستهای ایجکسی توسط سرویس http$ به مشکل عدم تشخیص ایجکسی بودن درخواست برخوردم.
توسط فیلتری که در اینجا توضیح داده شده و قرار دادن آن قبل از اکشن مورد نظر، میتوانیم تشخیص بدهیم که آیا درخواست رسیده از سمت کلاینت، ایجکسی است یا خیر؟ که در صورت ایجکسی نبودن درخواست، با صادر کردن یک استثنا مانع از اجرا شدن اکشن شویم. این فیلتر از اکستنشنی به نام IsAjaxRequest برای این تشخیص استفاده میکند:
HttpContext.Request.IsAjaxRequest();
اما هنگام استفاده از سرویس http$ ، اکستنشن ()IsAjaxRequest همیشه مقدار False را برمیگرداند. در حالیکه با متدهای ساده ایجکسی Jquery مثل get.$ و... ، مقدار این اکستنشن True میشود و به خوبی هم کار میکند.
درخواستهای هر دو مورد را که با فایرباگ بررسی کردم به این مقادیر برخوردم.
ویزگیهای درخواست توسط get - Jquery.$
و ویژگیهای درخواست توسط سرویس http - AngularJs$ :
همینطور که میبینید، در هدر درخواست http$ یک مورد مفقود الاثر شده به نام X-Requested-With داریم و همین مقدار است که مشخص میکند این یک درخواست ایجکسی است یا خیر و اکستنشن ()IsAjaxRequest نیر با همین مقدار عمل تشخیص را انجام میدهد. و به همین خاطر بود که این متد مقدار False را برمیگرداند.
بعد از کمی جستجو در این مورد ، به مخزن git انگیولار رسیدم و به صراحت به این موضوع اشاره شده بود که این هدر به صورت پیشفرض از درخواستهای http$ برداشته شده است.
بنابراین تنها راه حل این بود که خودمان به صورت دستی این هدر خاص رو به ماژول برنامه اضافه کنیم. به صورت زیر :
myAppModule.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; }]);
با اضافه کردن این هدر به درخواستهای http$ ، اکستنشن ()IsAjaxRequest مقدار درست را برمیگرداند.