نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 19 - بومی سازی
در خصوص مطلبی که عنوان کردید :
زمانیکه میان افزار RequestLocalization فعال می‌شود، سه تامین کننده‌ی پیش فرض جهت مشخص ساختن فرهنگ ترد جاری بکار گرفته خواهند شد:
الف) از طریق کوئری استرینگ
ب) از طریق نام کوکی
ج) از طریق هدر مخصوص Accept-Language 

تا جایی که مطالعه کردم در سئوی سایت تاثیر مطلوبی ندارد چون با همان آدرس محتوی به صورت چندین زبان برای گوگل ایندکس می‌شود و رتبه سئو را پایین می‌آورد.
حال اگر بخواهیم آدرس دهی مطابق با سئو را در اینجا داشته باشیم که قوانین سئو را هم رعایت کنیم و مثلا آدرسهایی به شکل
https://mySite.com/fa/home/index
داشته باشیم باید به چه نحو عمل کرد که بهترین بازدهی رو داشته باشیم؟
نظرات مطالب
چک لیست تهیه یک برنامه ASP.NET MVC
HTTP Module استاندارد ASP.NET است و بر روی کل سایت تاثیر دارد. روش فعال سازی آن در وب فرم‌ها یا MVC تفاوتی نمی‌کند و یکی است.
مراجعه کنید به سایت اصلی سازنده آن، مثال به همراه وب کانفیگ تنظیم شده دارد؛ یا پروژه IRIS هم از این ماژول استفاده می‌کند.
نظرات مطالب
خلاصه اشتراک‌های روز یک شنبه 13 آذر 1390
سلام . آقای نصیری . دو درخواست از شما دارم . آیا میتوان در برنامه BloggerAutoPoster و در تنظیمات ، بخش Feed to parse را به چند قسمت تبدیل کنید . منظورم این است که بعنوان مثال بخواهیم مطالب منتخب از لینک فید سایتهای اجتماعی دیگر را در وبلاگمان منتشر کنیم . چون الان بطور پیش فرض فقط میتوان یک لینک در بخش Feed to parse قرار داد و دیگر جایی برای قرار دادن 2 یا 3 و ... لینکهای فید سایتهای دیگر وجود ندارد .  و مورد دیگر این است که بتوان از خود برنامه عنوان مطالب لیست شده در برنامه را ویرایش کرد .
مطالب
خواندن اطلاعات API فیدبرنر

مطلبی را در سایت رادیکال 2 در مورد نمایش تعداد خواننده یک فید دیدم که پیاده سازی آن با سی شارپ و xml serialization به صورت زیر است:

using System;
using System.Xml;
using System.Xml.Serialization;

namespace Test
{
/// <summary>
/// کلاسی جهت نمایش تعداد خواننده فید وبلاگ شما
/// <example>CFeedBurner data = new CFeedBurner { FeedID = "fhphjt61bueu08k93ehujpu234" };
/// MessageBox.Show(data.Circulation().ToString());</example>
/// </summary>
class CFeedBurner
{
/// <summary>
/// آی دی فید شما زمانیکه به فید برنر لاگین کرده‌اید در تایتل صفحه مربوطه
/// </summary>
public string FeedID { get; set; }

/// <summary>
/// نگاشت فید به یک کلاس
/// </summary>
/// <returns>کلاس متناظر با فید</returns>
/// <exception cref="Exception">لطفا شماره شناسایی فید را وارد کنید</exception>
rsp deserializeFromXML()
{
if (FeedID == null)
throw new Exception("لطفا شماره شناسایی فید را وارد کنید");

XmlSerializer deserializer =
new XmlSerializer(typeof(rsp));
using (XmlReader reader = XmlReader.Create(
string.Format("https://feedburner.google.com/api/awareness/1.0/GetFeedData?id={0}", FeedID)))
{
return (rsp)deserializer.Deserialize(reader);
}
}

/// <summary>
/// دریافت تعداد خواننده فید
/// </summary>
/// <returns>آمار فید</returns>
/// <exception cref="Exception">اطلاعات فید شما قابل دریافت نیست</exception>
public int Circulation()
{
rsp data = deserializeFromXML();
if (data == null || data.feed == null || data.feed.Length == 0)
throw new Exception("اطلاعات فید شما قابل دریافت نیست");

if (data.feed[0].entry == null || data.feed[0].entry.Length == 0)
throw new Exception("اطلاعات فید شما قابل پردازش نیست");

return int.Parse(data.feed[0].entry[0].circulation);
}
}
}

کلاس rsp از فایل xml فید استاندارد سایت فیدبرنر درست شده است. روش تولید آن‌را قبلا توضیح داده بودم. به سادگی اجرای دو سطر زیر است:

xsd.exe GetFeedData.xml
xsd.exe GetFeedData.xsd /c

دریافت فایل‌های کلاس‌های نامبرده شده.

نظرات مطالب
BloggerToCHM
سلام،
فعلا زود هست. چون باید تاریخ غیر فارسی رو هم اضافه کنم و یک قالب انگلیسی هم براش درست کنم که برای بقیه دنیا هم قابل استفاده باشه.
نظرات مطالب
پرسش و پاسخ‌های متداول ایجاد یک وبلاگ بلاگری
تاریخ بالای سایت شما از روش دوستان استفاده کرده.
به قسمت ویرایش html بلاگ مراجعه کنید. این مورد را باید دستی حذف کنید. مواردی که به قالب شما به صورت پیش فرض اعمال شده این‌جا توضیح داده شده است:
http://docs.blogger-fa.com/2008/09/blogger-persian-date.html
اشتراک‌ها
فایل OPML «لینک‌ بلاگ‌های» دنیای دات نت
اگر علاقمند هستید که سرتیترهای آخرین تغییر و تحولات دنیای دات نت را بتوانید روزانه مرور کنید، هستند کسانیکه این نوع خلاصه‌ها را منتشر می‌کنند. فایل فوق حاوی مداخل RSS اینگونه سایت‌ها است. تنها کافی است آن‌را در RSS Reader خود برای نمونه مانند Silver Reader وارد نمائید. پس از آن این مداخل ذیل پوشه DailyLinks در دسترس خواهند بود.
فایل OPML «لینک‌ بلاگ‌های» دنیای دات نت
مسیرراه‌ها
ASP.NET MVC
              مطالب
              معادل‌های چندسکویی اجزای فایل web.config در ASP.NET Core
              هنوز هم اجزای مختلف فایل web.config در ASP.NET Core قابل تعریف و استفاده هستند؛ اما اگر صرفا بخواهیم از این نوع برنامه‌ها در ویندوز و به کمک وب سرور IIS استفاده کنیم. با انتقال برنامه‌های چندسکویی مبتنی بر NET Core. به سایر سیستم عامل‌ها، دیگر اجزایی مانند استفاده‌ی از ماژول فشرده سازی صفحات IIS و یا ماژول URL rewrite آن و یا تنظیمات static cache تعریف شده‌ی در فایل web.config، شناسایی نشده و تاثیری نخواهند داشت. به همین جهت تیم ASP.NET Core، معادل‌های توکار و چندسکویی را برای عناصری از فایل web.config که به IIS وابسته هستند، تهیه کرده‌است که در ادامه آن‌‌ها را مرور خواهیم کرد.


              میان‌افزار چندسکویی فشرده سازی صفحات در ASP.NET Core

              پیشتر مطلب «استفاده از GZip توکار IISهای جدید و تنظیمات مرتبط با آن‌ها» را در سایت جاری مطالعه کرده‌اید. این قابلیت صرفا وابسته‌است به IIS و همچنین در صورت نصب بودن ماژول httpCompression آن کار می‌کند. بنابراین قابلیت انتقال به سایر سیستم عامل‌ها را نخواهد داشت و هرچند تنظیمات فایل web.config آن هنوز هم در برنامه‌های ASP.NET Core معتبر هستند، اما چندسکویی نیستند. برای رفع این مشکل، تیم ASP.NET Core، میان‌افزار توکاری را برای فشرده سازی صفحات ارائه داده‌است که جزئی از تازه‌های ASP.NET Core 1.1 نیز به‌شمار می‌رود.
              برای نصب آن دستور ذیل را در کنسول پاورشل نیوگت، اجرا کنید:
               PM> Install-Package Microsoft.AspNetCore.ResponseCompression
              که معادل است با افزودن وابستگی ذیل به فایل project.json پروژه:
              {
                  "dependencies": {
                      "Microsoft.AspNetCore.ResponseCompression": "1.0.0"
                  }
              }

              مرحله‌ی بعد، افزودن سرویس‌های و میان افزار مرتبط، به کلاس آغازین برنامه هستند. همیشه متدهای Add کار ثبت سرویس‌های میان‌افزار را انجام می‌دهند و متدهای Use کار افزودن خود میان‌افزار را به مجموعه‌ی موجود تکمیل می‌کنند.
              public void ConfigureServices(IServiceCollection services)
              {
                  services.AddResponseCompression(options =>
                  {
                      options.MimeTypes = Microsoft.AspNetCore.ResponseCompression.ResponseCompressionDefaults.MimeTypes;
                  });
              }
              متد AddResponseCompression کار افزودن سرویس‌های مورد نیاز میان‌افزار ResponseCompression را انجام می‌دهد. در اینجا می‌توان تنظیماتی مانند MimeTypes فایل‌ها و صفحاتی را که باید فشرده سازی شوند، تنظیم کرد. ResponseCompressionDefaults.MimeTypes به این صورت تعریف شده‌است:
              namespace Microsoft.AspNetCore.ResponseCompression
              {
                  /// <summary>
                  /// Defaults for the ResponseCompressionMiddleware
                  /// </summary>
                  public class ResponseCompressionDefaults
                  {
                      /// <summary>
                      /// Default MIME types to compress responses for.
                      /// </summary>
                      // This list is not intended to be exhaustive, it's a baseline for the 90% case.
                      public static readonly IEnumerable<string> MimeTypes = new[]
                      {
                          // General
                          "text/plain",
                          // Static files
                          "text/css",
                          "application/javascript",
                          // MVC
                          "text/html",
                          "application/xml",
                          "text/xml",
                          "application/json",
                          "text/json",
                      };
                  }
              }
              اگر علاقمند بودیم تا عناصر دیگری را به این لیست اضافه کنیم، می‌توان به نحو ذیل عمل کرد:
              services.AddResponseCompression(options =>
              {
                  options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]
                                              {
                                                  "image/svg+xml",
                                                  "application/font-woff2"
                                              });
                          });
              در اینجا تصاویر از نوع svg و همچنین فایل‌های فونت woff2 نیز اضافه شده‌اند.

              به علاوه options ذکر شده‌ی در اینجا دارای خاصیت options.Providers نیز می‌باشد که نوع و الگوریتم فشرده سازی را مشخص می‌کند. در صورتیکه مقدار دهی نشود، مقدار پیش فرض آن Gzip خواهد بود:
              services.AddResponseCompression(options =>
              {
                //If no compression providers are specified then GZip is used by default.
                //options.Providers.Add<GzipCompressionProvider>();

              همچنین اگر علاقمند بودید تا میزان فشرده سازی تامین کننده‌ی Gzip را تغییر دهید، نحوه‌ی تنظیمات آن به صورت ذیل است:
              services.Configure<GzipCompressionProviderOptions>(options =>
              {
                options.Level = System.IO.Compression.CompressionLevel.Optimal;
              });

              به صورت پیش‌فرض، فشرده سازی صفحات Https انجام نمی‌شود. برای فعال سازی آن تنظیم ذیل را نیز باید قید کرد:
               options.EnableForHttps = true;

              مرحله‌ی آخر این تنظیمات، افزودن میان افزار فشرده سازی خروجی به لیست میان افزارهای موجود است:
              public void Configure(IApplicationBuilder app)
              {
                 app.UseResponseCompression()  // Adds the response compression to the request pipeline
                 .UseStaticFiles(); // Adds the static middleware to the request pipeline  
              }
              در اینجا باید دقت داشت که ترتیب تعریف میان‌افزارها مهم است و اگر UseResponseCompression پس از UseStaticFiles ذکر شود، فشرده سازی صورت نخواهد گرفت؛ چون UseStaticFiles کار ارائه‌ی فایل‌ها را تمام می‌کند و نوبت اجرا، به فشرده سازی اطلاعات نخواهد رسید.


              تنظیمات کش کردن چندسکویی فایل‌های ایستا در ASP.NET Core

              تنظیمات کش کردن فایل‌های ایستا در web.config مخصوص IIS به صورت ذیل است :
              <staticContent>
                 <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
              </staticContent>
              معادل چندسکویی این تنظیمات در ASP.NET Core با تنظیم Response.Headers میان افزار StaticFiles انجام می‌شود:
              public void Configure(IApplicationBuilder app,
                                    IHostingEnvironment env,
                                    ILoggerFactory loggerFactory)
              {
                  app.UseResponseCompression()
                     .UseStaticFiles(
                         new StaticFileOptions
                         {
                             OnPrepareResponse =
                                 _ => _.Context.Response.Headers[HeaderNames.CacheControl] = 
                                      "public,max-age=604800" // A week in seconds
                         })
                     .UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"));
              }
              در اینجا پیش از آماده شدن یک فایل استاتیک برای ارائه‌ی نهایی، می‌توان تنظیمات Response آن‌را تغییر داد و برای مثال هدر Cache-Control آن‌را به یک هفته تنظیم نمود.


              معادل چندسکویی ماژول URL Rewrite در ASP.NET Core

              مثال‌هایی از ماژول URL Rewrite را در مباحث بهینه سازی سایت برای بهبود SEO پیشتر بررسی کرده‌ایم (^ و ^ و ^). این ماژول نیز همچنان در ASP.NET Core هاست شده‌ی در ویندوز و IIS قابل استفاده است (البته به شرطی که ماژول مخصوص آن در IIS نصب و فعال شده باشد). معادل چندسکویی این ماژول به صورت یک میان‌افزار توکار به ASP.NET Core 1.1 اضافه شده‌است.
              برای استفاده‌ی از آن، ابتدا نیاز است بسته‌ی نیوگت آن‌را به نحو ذیل نصب کرد:
               PM> Install-Package Microsoft.AspNetCore.Rewrite
              و یا افزودن آن به لیست وابستگی‌های فایل project.json:
              {
                  "dependencies": {
                      "Microsoft.AspNetCore.Rewrite": "1.0.0"
                  }
              }

              پس از نصب آن، نمونه‌ای از نحوه‌ی تعریف و استفاده‌ی آن در کلاس آغازین برنامه به صورت ذیل خواهد بود:
              public void Configure(IApplicationBuilder app)
              {
                  app.UseRewriter(new RewriteOptions()
                                          .AddRedirectToHttps()
                                          .AddRewrite(@"app/(\d+)", "app?id=$1", skipRemainingRules: false) // Rewrite based on a Regular expression
                                          //.AddRedirectToHttps(302, 5001) // Redirect to a different port and use HTTPS
                                          .AddRedirect("(.*)/$", "$1")  // remove trailing slash, Redirect using a regular expression
                                          .AddRedirect(@"^section1/(.*)", "new/$1", (int)HttpStatusCode.Redirect)
                                          .AddRedirect(@"^section2/(\\d+)/(.*)", "new/$1/$2", (int)HttpStatusCode.MovedPermanently)
                                          .AddRewrite("^feed$", "/?format=rss", skipRemainingRules: false));
              این میان‌افزار نیز باید پیش از میان افزار فایل‌های ایستا و همچنین MVC معرفی شود.

              در اینجا مثال‌هایی را از اجبار به استفاده‌ی از HTTPS، تا حذف / از انتهای مسیرهای وب سایت و یا هدایت آدرس قدیمی فید سایت، به آدرسی جدید واقع در مسیر format=rss، توسط عبارات باقاعده مشاهده می‌کنید.
              در این تنظیمات اگر پارامتر skipRemainingRules به true تنظیم شود، به محض برآورده شدن شرط انطباق مسیر (پارامتر اول ذکر شده)، بازنویسی مسیر بر اساس پارامتر دوم، صورت گرفته و دیگر شرط‌های ذکر شده، پردازش نخواهند شد.

              این میان‌افزار قابلیت دریافت تعاریف خود را از فایل‌های web.config و یا htaccess (لینوکسی) نیز دارد:
               app.UseRewriter(new RewriteOptions()
              .AddIISUrlRewrite(env.ContentRootFileProvider, "web.config")
              .AddApacheModRewrite(env.ContentRootFileProvider, ".htaccess"));
              بنابراین اگر می‌خواهید تعاریف قدیمی <system.webServer><rewrite><rules> وب کانفیگ خود را در اینجا import کنید، متد AddIISUrlRewrite چنین کاری را به صورت خودکار برای شما انجام خواهد داد و یا حتی می‌توان این تنظیمات را در یک فایل UrlRewrite.xml نیز قرار داد تا توسط IIS پردازش نشود و مستقیما توسط ASP.NET Core مورد استفاده قرار گیرد.

              و یا اگر خواستید منطق پیچیده‌تری را نسبت به عبارات باقاعده اعمال کنید، می‌توان یک IRule سفارشی را نیز به نحو ذیل تدارک دید:
              public class RedirectWwwRule : Microsoft.AspNetCore.Rewrite.IRule
              {
                  public int StatusCode { get; } = (int)HttpStatusCode.MovedPermanently;
                  public bool ExcludeLocalhost { get; set; } = true;
                  public void ApplyRule(RewriteContext context)
                  {
                      var request = context.HttpContext.Request;
                      var host = request.Host;
                      if (host.Host.StartsWith("www", StringComparison.OrdinalIgnoreCase))
                      {
                          context.Result = RuleResult.ContinueRules;
                          return;
                      }
                      if (ExcludeLocalhost && string.Equals(host.Host, "localhost", StringComparison.OrdinalIgnoreCase))
                      {
                          context.Result = RuleResult.ContinueRules;
                          return;
                      }
                      string newPath = request.Scheme + "://www." + host.Value + request.PathBase + request.Path + request.QueryString;
               
                      var response = context.HttpContext.Response;
                      response.StatusCode = StatusCode;
                      response.Headers[HeaderNames.Location] = newPath;
                      context.Result = RuleResult.EndResponse; // Do not continue processing the request
                  }
              }
              در اینجا تنظیم context.Result به RuleResult.ContinueRules سبب ادامه‌ی پردازش درخواست جاری، بدون تغییری در نحوه‌ی پردازش آن خواهد شد. در آخر کار، با تغییر HeaderNames.Locatio به مسیر جدید و تنظیم Result = RuleResult.EndResponse، سبب اجبار به بازنویسی مسیر درخواستی، به مسیر جدید تنظیم شده، خواهیم شد.

              و سپس می‌توان آن‌را به عنوان یک گزینه‌ی جدید Rewriter معرفی نمود:
               app.UseRewriter(new RewriteOptions().Add(new RedirectWwwRule()));
              کار این IRule جدید، اجبار به درج www در آدرس‌های هدایت شده‌ی به سایت است؛ تا تعداد صفحات تکراری گزارش شده‌ی توسط گوگل به حداقل برسد (یک نگارش با www و دیگری بدون www).

              یک نکته: در اینجا در صورت نیاز می‌توان از تزریق وابستگی‌های در سازنده‌ی کلاس Rule جدید تعریف شده نیز استفاده کرد. برای اینکار باید RedirectWwwRule را به لیست سرویس‌های متد ConfigureServices معرفی کرد و سپس نحوه‌ی دریافت وهله‌ای از آن جهت معرفی به میان‌افزار بازنویسی مسیرهای وب به صورت ذیل درخواهد آمد:
               var options = new RewriteOptions().Add(app.ApplicationServices.GetService<RedirectWwwRule>());