کامپایل پویای کد در دات نت
خیلی مفید و جالب بود، خصوصا که قابلیتها و امکانات Reflection و CodeDom، بحث روز امنیت نرمافزارهای .Net مثل انواع روشهای SelfObfuscation و SelfPatching و ... هستند.
SQL Server
SQL Server 2005
SQL Server 2008
- SQL Server 2008: Script Data
- سرویس پک یک SQL Server 2008
- اس کیوال سرور 2008 و عملگرهای C مانند
- انتقال فایلهای دیتابیس اس کیوال سرور 2008
- فشرده سازی اطلاعات در SQL server 2008
- مقایسه امنیت Oracle11g و SQL server 2008 از دید آمار در سال 2009
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت اول
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت دوم
- آشنایی با قابلیت FileStream اس کیوال سرور 2008 - قسمت سوم
- تهیه گزارش از منسوخ شدههای مورد استفاده در SQL Server 2008
- استفاده از قابلیت Script Data اس کیوال سرور 2008 از طریق برنامه نویسی
- Resource Governor در 2008 SQL Server
- Embed کردن SQL Server Express 2008 در یک برنامه
SQL Server 2012
- Microsoft® SQL Server® 2012
- نحوه تبدیل نگارش SQL Server 2012 RTM مدت دار، به نگارش کامل
- نحوه ایجاد Sequence و استفاده آن در Sql Server 2012
- بررسی الگوهای ایندکسهای Non-Clustered در SQL Server
- آشنایی با Column Store Index در SQL Server 2012
- آشنایی با Contained Databases در SQL Server 2012
- استفاده از Sparse Columns در SQL Server 2012
- تغییر نام پایگاه داده و فایل هایش در SQL Server 2012
- گرفتن خروجی XML از جداول در SQL Server 2012
- گرفتن خروجی JSON از جداول در SQL Server 2012
- آشنایی با FileTable در SQL Server 2012 بخش 1
- آشنایی با FileTable در SQL Server 2012 بخش 2
SQL Serve 2014
- معرفی OLTP درون حافظهای در SQL Server 2014
- ایجاد جداول بهینه سازی شده برای حافظه در SQL Server 2014
- ابزارهای مهاجرت به OLTP درون حافظهای در SQL Server 2014
- ماندگاری با تاخیر در SQL Server 2014
- امکان استفاده از یک هارد SSD بجای RAM در SQL Server 2014
- کاهش حجم لاگ فایلهای اسکیوال سرور 2005 و 2008
- گزارشگیری از تاریخچهی پشتیبانگیریها در اس کیوال سرور
- گزارشگیری از تاریخچهی اجرای کوئریها در SQL Server
- تشخیص کمبود ایندکسها در SQL server
- پیدا کردن لیست SQL serverهای نصب شده در یک شبکه
- چرا نباید از کوئریهای select * استفاده کرد؟
- منسوخ شدهها در نگارشهای جدید SQL server
- پیدا کردن وابستگیهای اشیاء در SQL Server
- به روز رسانی Viewها و رویههای ذخیره شده در SQL server
- نحوه راه اندازی مجدد یک دیتابیس اس کیوال سرور پس از پر شدن هارد دیسک
- مشکل اتصال به اس کیوال سرور 2000 از طریق management studio 2008
- مشکل ی و ک فارسی و عربی در یک دیتابیس اس کیوال سرور
- مونیتور کردن میزان مصرف CPU در اس کیوال سرور
- تنظیمات پیشنهادی حداکثر حافظهی مصرفی اس کیوال سرور
- Microsoft SQL Server 2008 Management Objects
- مونیتور کردن میزان فضای خالی باقیمانده در سرور توسط اس کیوال سرور
- آیا از وضعیت رویههای ذخیره شدهی دیتابیسهای اس کیوال سرور خود خبر دارید؟
- تعیین اعتبار کردن یک عبارت SQL
- تعیین اعتبار کردن یک عبارت SQL - قسمت دوم
- نگهداری ایندکسها در اسکیوال سرور
- حذف سریع تمام رکوردها در SQL server
- بررسی صحت پشتیبانهای تهیه شده در SQL Server
- یافتن لیست اسمبلیهای ارجاعی
- مقایسه ساختاری دو دیتابیس SQL Server
- sp_send_dbmail و ارسال ایمیل فارسی
- محدود کردن دسترسی به اس کیوال سرور بر اساس IP
- مقایسه نتایج الگوریتمهای هش کردن اطلاعات در اس کیوال سرور و دات نت
- تنظیم درجه سازگاری یک دیتابیس اس کیوال سرور
- مقایسه رکوردهای دو جدول
- تهیه بک آپهای خودکار از SQL Server Express
- بازسازی msdb تخریب شده
- مقایسه حساس به حروف کوچک و بزرگ در SQL Server
- مزیتهای استفاده از رویههای ذخیره شده؛ واقعیت یا توهم؟!
- روشهایی برای حذف رکوردهای تکراری
- ذخیره سازی فایلها در دیتابیس یا استفاده از فایل سیستم متداول؟
- به روز رسانی فیلدهای XML در SQL Server
- Optimize for unknown
- FxCop برای SQL Server
- با رویههای ذخیره شده خود، وب سرویس ایجاد کنید
- به روز رسانی فیلدهای XML در SQL Server - قسمت دوم
- مرجعی در مورد نگارشهای مختلف SQL Server
- یافتن تداخلات Collations در SQL Server
- عدم کاهش حجم لاگ فایل SQL Server
- دریافت خطای database is not accessible و نحوهی رفع مشکل
- سرورهای متصل شدهی SQL Server و مبحث تراکنشها
- چک لیست نصب SQL Server
- درک نمودار
- بررسی مقدار دهی اولیه متغیرها در T-SQL
- اگر نصب سرویس پک اس کیوال سرور Fail شد ...
- ایجاد بک آپ برای دیتابیس با استفاده از CMD
- انتخاب Sub Query درون پرانتزها به کمک [+Ctrl+Shift
- روشی جهت یافتن فیلدهای استفاده شده درون Stored Procedure ، Function و View
- آشنایی با Row_Number،Rank،Dense_Rank،NTILE
- بازگردانی پایگاه داده بدون فایل لاگ
- LocalDB چیست؟
- آشنایی با تابع PATINDEX در SQL Server
- اجرای Stored Procedure با چند نوع مقدار برگشتی توسط EF CodeFirst
- آشنایی با SQL Server Data Tools
- مشکل ارتباط با SQL Server در لوکال
- آشنایی با Window Functionها در SQL Server بخش اول
- آشنایی با Window Functionها در SQL Server بخش دوم
- آشنایی با Window Functionها در SQL Server بخش سوم
- آشنایی با Window Functionها در SQL Server بخش چهارم
- استفاده از SQLDom برای آنالیز عبارات T-SQL
- دسته بندی سطرهای جدول
- حذف نمودن کاراکترهای ناخواسته توسط Recursive CTE قسمت اول
- جستجوی کاراکترهای wildcards توسط ماده اختیاری ESCAPE
- ستون محاسباتی (computed column)
- گذری بر مفاهیم relationship
- حذف کاراکترهای ناخواسته توسط Recursive CTE قسمت دوم
- از کار افتادن SQL Server Agent
- بدست آوردن برگهای یک درخت توسط Recursive CTE
- بررسی مساله متداول Top N در نسخههای مختلف SQL Server
- فعال و غیر فعال کردن قیود
- مروری بر طراحی Schema less بانک اطلاعاتی SisoDb
- اجرای یک Script حاوی دستورات Go در سی شارپ
- آشنایی با Window Functionها در SQL Server بخش پنجم
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 1
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 2
- افزودن یک DataType جدید برای نگهداری تاریخ خورشیدی - 3
- نحوه انتقال اطلاعات استخراج شده از وب سرویس به SQL Server به کمک SSIS
- Full Text Search و Rank فیلدهای بازیابی شده
- بررسی دستور Truncate Table و Delete
- Identity و مباحث مربوط به آن (قسمت اول) - آشنایی با Identity
- Identity و مباحث مربوطه (قسمت دوم) نحوه بدست آوردن مقادیر Identity
- ویدئوی آموزش مقدمات CodeFirst در قالب یک کلاس آموزشی به همراه مثال
- مفهوم READ_COMMITTED_SNAPSHOT در EF 6
- آشنایی با SQL Server Common Table Expressions - CTE
- NoSQL و مایکروسافت
- نحوه تهیه گزارش در SSRS و انتشار آن روی وب سرور
- مدیریت اطلاعات وابسته به زمان در بانکهای اطلاعاتی رابطهای
- تبدیل اعداد صحیح و اعشاری به حروف در T-SQL با استفاده از Join
- SQL Instance
- خواندن سریع اطلاعات فایل اکسل و ذخیره در بانک SQL
- افزودن اکانت مدیریتی فراموش شده به SQL Server
- اندازه گیری کارآیی پرس و جوها با استفاده از SET STATISTICS TIME
- ساخت کاربر ویندوز توسط SQL Server
- بررسی Transactions و Locks در SQL Server
- معرفی و استفاده از DDL Triggers در SQL Server
- بررسی دو نکته (ترفند) کاربردی در SQL Server
- بررسی ابزار SQL Server Profiler
- اجرای SSIS Package از طریق برنامه کاربردی
- پردازش دادههای جغرافیایی به کمک SQL Server و Entity framework
- استفاده از قابلیت پارتیشن بندی در آرشیو جداول بانکهای اطلاعاتی SQL Server
- بررسی بارگذاری دادهها در انبارهای داده و معرفی الگوهای بکار رفته در آن
- بهبود عملکرد SQL Server Locks در سیستمهای با تعداد تراکنش بالا در Entity Framework
- SQL Antipattern #1
- SQL Antipattern #2
- پیاده سازی عملیات صفحه بندی (paging) در sql server
- فعالسازی Multiple Active Result Sets
- استفاده از SQLDom برای آنالیز عبارات T-SQL، قسمت دوم
- اتصال به SQL از راه دور (Remote) و یا به یک سرور در شبکه
- نحوه تعریف Linked Server و دریافت اطلاعات از سروری دیگر
ASP.NET MVC #6
البته دیدگاه دیگه ای هم وجود داره: این جداسازی تا جایی مهم و موردنظره که نوشتن آزمون های واحد رو راحت تر کنه.
NET Standard. در حقیقت یک قرار داد است که سکوهای کاری مختلف دات نتی مانند Full .NET Framework ، Xamarin ، Mono ، UWP و غیره میتوانند آنرا پیاده سازی کنند. یک نمونهی دیگر این پیاده سازیها نیز NET Core. است. برای مثال دات نت 4.6.1، استاندارد و قرار داد شمارهی 2 دات نت را پیاده سازی میکند. به همین صورت NET Core 2.0. نیز پیاده سازی کنندهی این استاندارد شماره 2 است.
«اما» باید درنظر داشت که دات نت استاندارد، بیش از یک قرار داد چیزی نیست و پیاده سازی کنندگان آن میتوانند سطح بیشتری را نسبت به این قرار داد نیز لحاظ کنند. برای مثال دات نت 4.6.1 شامل سطح API بیشتری از دات نت استاندارد 2 است.
با تغییرات اخیر، اکنون NuGet میتواند کتابخانههای مبتنی بر NET Standard 2. را در برنامههای مبتنی بر سکوهای کاری که آنرا پیاده سازی میکنند، بدون مشکل اضافه کند. برای مثال میتوان اسمبلیهای دات نت 4.6.1 را به برنامههای ASP.NET Core 2.0 اضافه کرد (کاری که در نگارش 1x آن به صورت مستقیم میسر نیست) و یا میتوان اسمبلیهای کامپایل شدهی برای دات نت استاندارد 2 را به برنامههای مبتنی بر دات نت 4.6.1 اضافه کرد.
«اما» باید درنظر داشت که امکان اضافه کردن یک بستهی نیوگت از یک کتابخانهی نوشته شدهی برای دات نت کامل در برنامههای دات نت Core به معنای تضمینی برای کار کردن آن در زمان اجرا نخواهد بود. از این جهت که دات نت کامل، به همراه قسمتهایی است که در NET Standard. وجود خارجی ندارند. بنابراین اگر کتابخانهی استفاده شده صرفا این API مشترک را هدف قرار دادهاست، هم قابلیت اتصال و هم قابلیت اجرا را خواهد داشت؛ اما اگر برای مثال کسی بستهی NServiceBus را به پروژهی ASP.NET Core 2.0 اضافه کند، بدون مشکل کامپایل خواهد شد. اما از آنجائیکه این کتابخانه از MSMQ استفاده میکند که خارج از میدان دید این استاندارد است، در زمان اجرا با شکست مواجه خواهد شد.
ASP.NET MVC #23
اجرای برنامههای ASP.NET MVC توسط نگارشهای متفاوت IIS
تا اینجا برای اجرای برنامههای ASP.NET MVC از وب سرور توکار VS.NET استفاده شد که صرفا جهت آزمایش برنامهها طراحی شده است. تا این تاریخ سه رده از وب سرورهای مایکروسافت ارائه شدهاند که برای نصب ASP.NET MVC میتوانند مورد استفاده قرار گیرند و هر کدام هم نکتههای خاص خودشان را دارند که در ادامه به بررسی آنها خواهیم پرداخت.
اجرای برنامههای ASP.NET MVC بر روی IIS 5.x ویندوز XP
پس از ایجاد یک دایرکتوری مجازی بر روی پوشه یک برنامه ASP.NET MVC و سعی در اجرای برنامه، بلافاصله پیغام خطای HTTP 403 forbidden مشاهده میشود.
اولین کاری که برای رفع این مساله باید صورت گیرد، کلیک راست بر روی نام دایرکتوری مجازی در کنسول IIS، انتخاب گزینه خواص و سپس مراجعه به برگه «ASP.NET» آن است. در اینجا شماره نگارش دات نت فریم ورک مورد استفاده را به 4 تغییر دهید (برای نمونه ASP.NET MVC 3.0 مبتنی بر دات نت فریم ورک 4 است).
بعد از این تغییر، بازهم موفق به اجرای برنامههای ASP.NET MVC بر روی IIS 5.x نخواهیم شد؛ چون در آن زمان مفاهیم مسیریابی و Routing که اصل و پایه ASP.NET MVC هستند وجود خارجی نداشتند. این نگارش از IIS به صورت پیش فرض تنها قادر به پردازش درخواستهای رسیدهای که به یک فایل فیزیکی بر روی سرور اشاره میکند، میباشد (یعنی مشکلی با اجرای برنامههای ASP.NET Web forms ندارد).
برای رفع این مشکل، مجددا بر روی نام دایرکتوری مجازی برنامه در کنسول IIS کلیک راست کرده و گزینه خواص را انتخاب کنید. در صفحه ظاهر شده، در برگه «Virtual directory» آن، بر روی دکمه «Configuration» کلیک نمائید. در صفحه باز شده مجددا بر روی دکمه «Add» کلیک کنید.
در صفحه باز شده، مسیر Executable را C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll وارد کرده و Extension را به .* (دات هرچی) تنظیم کنید. همین مقدار تنظیم، برای اجرای برنامههای ASP.NET MVC بر روی IIS 5.x ویندوز XP کفایت میکند.
کاری که در اینجا انجام شده است، نگاشت تمام درخواستهای رسیده صرفنظر از پسوند فایلها، به موتور ASP.NET میباشد. به صورت پیش فرض در IIS 5.x درخواستها تنها بر اساس پسوند فایلها پردازش میشوند. مثلا اگر فایل درخواستی aspx است، درخواست رسیده به aspnet_isapi.dll یاد شده هدایت خواهد شد. اگر پسوند فایل php است به isapi مخصوص آن (در صورت نصب) هدایت میگردد و به همین ترتیب برای سایر سیستمهای دیگر. زمانیکه Extension به «دات هرچی» و Executable به aspnet_isapi.dll دات نت 4 تنظیم میشود، دایرکتوری مجازی تنظیم شده تنها جهت سرویس دهی به یک برنامه ASP.NET عمل خواهد کرد و تمام درخواستهای رسیده به آن، به موتور اجرایی ASP.NET هدایت میشوند.
بدیهی است تنظیمات فوق تنها به یک دایرکتوری مجازی اعمال شدند. اگر نیاز باشد تا بر روی تمام سایتها تاثیر گذار شود، اینبار در کنسول IIS 5.x بر روی «Default web site» کلیک راست کرده و گزینه خواص را انتخاب کنید. در صفحه باز شده به برگه «Home directory» مراجعه کرده و مراحل ذکر شده را تکرار کنید.
مشکل! این روش بهینه نیست.
روش فوق خوبه، کار میکنه، اما بهینه نیست؛ از این جهت که «نگاشت تمام درخواستها به موتور ASP.NET» یعنی پروسه پردازش درخواست یک فایل تصویری، js یا css هم باید از فیلتر موتور ASP.NET عبور کند که ضروری نیست.
برای رفع این مشکل، توصیه شده است که سیستم مسیریابی ASP.NET MVC را در IIS 5.x «پسوند دار» کنید. به این نحو که با مراجعه به فایل Global.asax.cs، تعاریف مسیریابی را به نحو زیر ویرایش کنید:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(
new Route("{controller}.aspx/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
})
});
اینبار برای مثال مسیر http://localhost/MyMvcApp/home.aspx/index به علت داشتن پسوند aspx وارد موتور پردازشی ASP.NET خواهد شد. البته در این حالت URL های تمیز ASP.NET MVC را از دست خواهیم داد و مدام باید دقت داشت که مسیرهای کنترلرها حتما باید به aspx ختم شوند. ضمنا با این تنظیم، دیگر نیازی به تغییر تعاریف نگاشتها در کنسول مدیریتی IIS، نخواهد بود.
اجرای برنامههای ASP.NET MVC بر روی IIS 6.x ویندوز سرور 2003
تمام نکات عنوان شده جهت IIS 5.x در IIS 6.x نیز صادق هستند. به علاوه برای اجرای برنامههای ASP.NET بر روی IIS 6.x باید به دو نکته مهم دیگر نیز دقت داشت:
الف) ASP.NET 4 به صورت پیش فرض در IIS 6.x غیرفعال است که باید با مراجعه به قسمت Web Services Extensions در کنسول مدیریتی IIS، آنرا از حالت prohibited خارج کرد.
ب) در هر Application pool تنها از یک نگارش دات نت فریم ورک میتوان استفاده کرد. برای مثال اگر هم اکنون AppPool1 مشغول سرویس دهی به یک سایت ASP.NET 3.5 است، از آن نمیتوانید جهت اجرای برنامههای ASP.NET MVC 3 به بعد استفاده کنید. زیرا برای مثال ASP.NET MVC 3 مبتنی بر دات نت فریم ورک 4 است. به همین جهت حتما نیاز است تا یک Application pool مجزا را برای برنامههای دات نت 4 در IIS 6 اضافه نمائید و سپس در تنظیمات سایت، از این Application pool جدید استفاده نمائید.
البته روش صحیح و اصولی کار با IIS از نگارش 6 به بعد هم مطابق شرحی است که عنوان شد. برای دستیابی به بهترین کارآیی و امنیت بیشتر، بهتر است به ازای هر سایت، از یک Application pool مجزا استفاده نمائید.
اطلاعات تکمیلی:
نکات نصب برنامههای ASP.NET 4.0 بر روی IIS 6
مروری بر تاریخچه محدودیت حافظه مصرفی برنامههای ASP.NET در IIS
اجرای برنامههای ASP.NET MVC بر روی IIS 7.x ویندوز 7 و ویندوز سرور 2008
اگر برنامه ASP.NET MVC در IIS 7.x در حالت یکپارچه (integrated mode) اجرا شود، بدون نیاز به هیچگونه تغییری در تنظیمات سرور یا برنامه، بدون مشکل قابل اجرا خواهد بود. بدیهی است در اینجا نیز بهتر است به ازای هر برنامه، یک Application pool مجزا را ایجاد کرد.
اما در حالت classic (که برای برنامههای جدید توصیه نمیشود) نیاز است همان مراحل IIS 5,x تکرار شود. البته اینبار مسیر زیر را باید طی کرد تا به صفحه افزودن نگاشتها رسید:
Right-click on a web site -> Properties -> Home Directory tab -> click on the Configuration button -> Mappings tab
نکتهای مهم در تمام نگارشهای IIS
ترتیب نصب دات نت فریم ورک 4 و IIS مهم است. اگر ابتدا IIS نصب شود و سپس دات نت فریم ورک 4، به صورت خودکار، کار نگاشت اطلاعات ASP.NET به IIS صورت خواهد گرفت.
اگر ابتدا دات نت فریم ورک 4 نصب شود و سپس IIS، برای مثال دیگر از برگه ASP.NET در IIS 6.x خبری نخواهد بود. برای رفع این مشکل دستور زیر را در خط فرمان اجرا کنید:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe /i
به این ترتیب، اطلاعات مرتبط با موتور ASP.NET مجددا به تنظیمات IIS اضافه خواهند شد.
مروری بر نحوهی توزیع برنامههای Blazor بر روی IIS
1- پیش از هر کاری باید مطابق نگارش ASP.NET Core در حال استفاده (که به عنوان هاست Blazor Server و یا ارائه دهندهی قسمت Web API برنامهی سمت کلاینت WASM مطرح است)، بستهی NET Core hosting bundle. را نصب کرد که عموما تحت عنوان «Hosting Bundle Installer» قابل دریافت است.
نکتهی مهم: همانند تمام نگارشهای دات نت، در اینجا نیز باید Hosting Bundle را پس از نصب IIS، بر روی سیستم نصب کرد. اگر این ترتیب تغییر کند، یکبار دیگر نصاب آنرا اجرا کرده و گزینهی ترمیم نصب را انتخاب کنید تا یکپارچگی آن با IIS صورت گیرد.
2- نیاز است برنامهی خود را اصطلاحا publish کرد تا به همراه فایلهای نهایی قابل کپی باشد که در پوشهای توسط IIS هاست خواهند شد. برای اینکار اگر از نگارش کامل ویژوال استودیو استفاده میکنید، فقط کافی است بر روی پروژهی مدنظر کلیک راست کرده و از منوی باز شده، گزینهی publish را انتخاب کنید و مراحل آنرا طی نمائید و یا این مراحل را میتوان توسط دستور خط فرمان زیر نیز خلاصه کرد که وابستگی خاصی، به IDE ویژهای ندارد و چند سکویی است:
dotnet publish -o "c:\dir1\dir2" -c Release
و یا اگر فقط دستور dotnet publish -c Release را در ریشهی پروژه اجرا کنیم، خروجی نهایی را در پوشهی bin\Release\net5.0\publish میتوان مشاهده کرد که به همراه یک web.config مخصوص برنامههای blazor هم هست و در آن mime typeهای متناظری، به همراه URL rewriting مناسب برنامههای تک صفحهای وب از پیش تنظیم شدهاست. بنابراین در اینجا نصب ماژول URL rewrite بر روی IIS نیز الزامی است.
3- در اینجا نیز همانند تنظیمات برنامههای ASP.NET Core، باید application pool منتسب به برنامه را ویرایش کرده و NET Clr Version. آنرا بر روی No Managed Code قرار داد.
روش فعالسازی توزیع مبتنی بر فشرده سازی Brotli در IIS
در حین عملیات publish استاندارد، به صورت پیشفرض از تمام فایلها، سه نسخهی اصلی، gz شده (gzip) و یا br شده (فشرده سازی Brotli که فایلهای کم حجمتری را نسبت به gz ارائه میدهد) نیز تهیه میشوند که بسته به نوع مرورگر و پشتیبانی آن از روشهای مختلف فشرده سازی، یکی از آنها در اختیار کلاینت قرار خواهد گرفت که به این صورت کاربران، تجربهی دریافت کم حجمتر و سریعتری را خواهند داشت.
باید دقت داشت Web.config ای که به همراه دستور dotnet publish ایجاد میشود، روش توزیع پیشفرض فایلهای br. تولیدی را ندارد. برای اینکار نیاز است تنظیمات این فایل web.config توصیه شدهی توسط تیم Blazor را به web.config خود اضافه کرد تا در نهایت حجم دریافتی از سرور به شدت کاهش یابد.
یک نکته: اگر میخواهید فایل web.config سفارشی خودتان را داشته باشید، نمونهای از آنرا در ریشهی پروژه قرار داده و سپس فایل csproj را به نحو زیر ویرایش کنید تا از آن در حین publish استفاده کند:
<PropertyGroup> <PublishIISAssets>true</PublishIISAssets> </PropertyGroup>
در حین publish برنامههای Blazor WASM کار IL trimming نیز انجام میشود
برای کاهش حجم نهایی برنامههای Blazor WASM، در حین publish در حالت release، کار IL Trimming نیز به صورت خودکار انجام میشود تا کدهای IL ای که در برنامه نقش نداشتهاند و مستقیما در جائی استفاده نشدهاند، به صورت خودکار حذف شوند و به این ترتیب حجم ارائهی نهایی به شدت کاهش یابد.
فقط باید دقت داشت که در این حالت اگر عملیات پویایی مانند reflection در کدهای شما صورت میگیرد، به علت نداشتن ارجاع استاتیکی به منابع مورد استفاده، در زمان اجرا با مشکل مواجه خواهد شد. اگر میخواهید اخطارهایی را در این زمینه مشاهده کنید، گزینهی زیر را به فایل csproj اضافه نمائید:
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
حذف مباحث بومی سازی در صورت عدم نیاز
اگر در برنامهی خود از مباحث time-zones استفاده نمیکنید، میتوانید با غیرفعال کردن آن در فایل csproj، حداقل 100 کیلوبایت از حجم برنامهی نهایی را کاهش دهید:
<BlazorEnableTimeZoneSupport>false</BlazorEnableTimeZoneSupport>
<InvariantGlobalization>true</InvariantGlobalization>
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.example.com/</loc> <lastmod>2005-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> </urlset>
که یک فایل XML متشکل از یک تگ urlset است و این تگ نیز حاوی یک یا چند تگ url میباشد. با توجه به تعاریف بالا به یک چنین کلاسی خواهیم رسید:
public enum ChangeFreq { Always, Hourly, Daily, Weekly, Monthly, Yearly, Never } [XmlElement("loc")] public string Url { get; set; } [XmlElement("lastmod")] public DateTime? LastModified { get; set; } public bool ShouldSerializeLastModified() { return LastModified.HasValue; } [XmlElement("changefreq")] public ChangeFreq? ChangeFrequency { get; set; } public bool ShouldSerializeChangeFrequency() { return ChangeFrequency.HasValue; } [XmlElement("priority")] public float? Priority { get; set; } public bool ShouldSerializePriority() { return Priority.HasValue; } }
دقت داشته باشید که چون پروپرتیهای LastModified ، ChangeFrequency و Priority از نوع Nullable تعریف شدهاند، پس باید کاری کنیم در صورتیکه این پروپرتیها نال بودند سریالیز نشوند. بدین منظور از تابع ShouldSerialize[MemberName] استفاده میشود. این تابع جزئی از دات نت است. کافی است بعد از ShouldSerialize نام پروپرتی را ذکر کنید. حال به کلاس دیگری نیاز داریم تا لیستی از کلاس فوق را دربر داشته باشد.
[XmlRoot("urlset",Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")] public class SiteMp { private readonly List<Location> _locations; public SiteMp() { _locations = new List<Location>(); } [XmlElement("url")] public List<Location> Locations { get { return _locations; } set { foreach (var location in value) { Add(location); } } } public void Add(Location location) { _locations.Add(location); } }
حال برای پردازش کلاس بالا لازم است ActionResultی را طراحی کنیم تا خروجی Response را به فرمت XML پردازش کند:
public class XmlResult : ActionResult { private readonly object _objectToSerialize; public XmlResult(object objectToSerialize) { _objectToSerialize = objectToSerialize; } public override void ExecuteResult(ControllerContext context) { if (_objectToSerialize == null) return; context.HttpContext.Response.Clear(); var xmlSerializer = new XmlSerializer(_objectToSerialize.GetType()); context.HttpContext.Response.ContentType = "text/xml"; xmlSerializer.Serialize(context.HttpContext.Response.Output, _objectToSerialize); } }
و در آخر یک کنترلر ساخته و به صورت زیر از آن استفاده میکنیم:
public class SiteMapController : Controller { // GET: SiteMap public ActionResult Index() { SiteMp siteMap = new SiteMp(); siteMap.Add(new Location { Url = Request.Url.GetLeftPart(UriPartial.Authority) + "/Home/Index" }); siteMap.Add(new Location { Url = Request.Url.GetLeftPart(UriPartial.Authority) + "/Home/NewRequest", ChangeFrequency = Location.ChangeFreq.Always, LastModified = DateTime.UtcNow, Priority = 0.5f }); siteMap.Add(new Location { Url = Request.Url.GetLeftPart(UriPartial.Authority) + "/Home/FindRequest", ChangeFrequency = Location.ChangeFreq.Always, LastModified = DateTime.UtcNow, Priority = 0.5f }); siteMap.Add(new Location { Url = Request.Url.GetLeftPart(UriPartial.Authority) + "/ContactUs/Index", ChangeFrequency = Location.ChangeFreq.Daily, LastModified = DateTime.UtcNow, Priority = 0.5f }); return new XmlResult(siteMap); }
اگر دقت کنید لینکهای ثابت باید به صورت دستی اضافه شوند. سناریویی را تصور کنید که لینکها زیاد باشند(جدای از لینک هایی که از دیتابیس لود میشوند) این کار کمی ناجور به نظر میرسد. در اینجا میخواهیم از طریق امکانات ،Reflection عمل اضافه کردن لینک به صورت خودکار انجام شود.
public class ControllerScanner { public static List<string> ScanAllControllers(HttpRequestBase requestBase) { Assembly asm = Assembly.GetAssembly(typeof(MvcApplication)); var controllerActionlist = asm.GetTypes() .Where(type => typeof (Controller).IsAssignableFrom(type)) .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public)) .Where((returnType => returnType.ReturnType == (typeof(ViewResult)) || returnType.ReturnType==(typeof(ActionResult)))) .Select( x => new { Controller = x.DeclaringType.Name, Action = x.Name, ReturnType = x.ReturnType.Name }) .OrderBy(x => x.Controller).ThenBy(x => x.Action).Distinct().ToList(); if (requestBase.Url == null) return null; var url = requestBase.Url.GetLeftPart(UriPartial.Authority); return controllerActionlist.Select(controller => $"{url}/{controller.Controller}/{controller.Action}").ToList(); } }
حال از کلاس بالا در کنترلر SiteMap به صورت زیر استفاده میکنیم :
public class SiteMapController : Controller { // GET: SiteMap public ActionResult Index() { var siteMap = new SiteMap(); var controllers = ControllerScanner.ScanAllControllers(Request); foreach (var controller in controllers) { siteMap.Add(new Location { Url = controller, ChangeFrequency = Location.ChangeFreq.Always, LastModified = DateTime.UtcNow, Priority = 0.5f }); } return new XmlResult(siteMap); } }
در آخر نیز سطر زیر را به سیستم مسیریابی اضافه نمایید تا در صورت درخواست فایل sitemap.xml اکشن Index از کنترلر SiteMap فراخوانی شود.
routes.MapRoute( "SiteMap", // Route name "sitemap.xml", // URL with parameters new { controller = "Sitemap", action = "Index", name = UrlParameter.Optional, area = "" } );
خواندنیهای 2 مرداد
اس کیوال سرور
الگوهای طراحی برنامه نویسی شیءگرا
امنیت
توسعه وب
دات نت فریم ورک
دبلیو اف
سی و مشتقات
کتابهای رایگان
لینوکس
متفرقه
محیطهای مجتمع توسعه
مسایل انسانی، اجتماعی و مدیریتی برنامه نویسی
ویندوز
امکان مفهوم بخشیدن به رشتهها در NET 7.
public static void WriteLine(string format, object? arg0)
public static void WriteLine([StringSyntax(StringSyntaxAttribute.CompositeFormat)] string format, object? arg0)