نظرات مطالب
پالایش درخواست ها در IIS
میان افزاری برای شبیه سازی قسمتی از این امکانات در برنامه‌های ASP.NET Core

ابتدا بسته‌ی نیوگت DNTCommon.Web.Core را نصب کنید:
PM> Install-Package DNTCommon.Web.Core
سپس میان افزار AntiDos آن‌را به صورت زیر می‌توانید استفاده و تنظیم کنید:
الف) آن‌را پیش از هر میان‌افزار دیگری ثبت کنید:
public void Configure(IApplicationBuilder app)
{
  app.UseAntiDos();
ب) تنظیمات مخصوص آن‌را به فایل appsettings.json اضافه کنید.
ج) این تنظیمات را به صورت زیر به برنامه معرفی کنید:
public void ConfigureServices(IServiceCollection services)
{
   services.Configure<AntiDosConfig>(options => Configuration.GetSection("AntiDosConfig").Bind(options));
این میان‌افزار هم یک فایروال است که می‌تواند یک رنج‌آی‌پی را ببندد و هم می‌تواند کلاینت‌ها را بر اساس user agent و همچنین هدرهای خاصی فیلتر کند. به علاوه در آن می‌توانید تنظیم کنید که یک کاربر در هر دقیقه چندبار می‌تواند درخواستی را به سمت سایت ارسال کند و پس از آن تا مدتی دسترسی آن به سایت قطع شود. 
نظرات مطالب
بررسی روش آپلود فایل‌ها از طریق یک برنامه‌ی Angular به یک برنامه‌ی ASP.NET Core
یک نکته‌ی تکمیلی
به همراه نگارش Angular 4.3، روش جدیدی برای کار با HTTP، توسط ماژول جدید HTTP Client آن ارائه شده‌است که ساختار آن بسیار شبیه به ماژول فعلی HTTP آن است و کدهای فعلی را به سادگی می‌توان به آن انتقال داد. یکی از تغییرات آن داشتن رخ‌دادهای درصد آپلود و دانلود یک درخواست است:
import {  HttpEventType,  HttpClient,  HttpRequest } from '@angular/common/http';

http.request(new HttpRequest(
  'POST',
  URL,
  body, 
  {
    reportProgress: true
  })).subscribe(event => {
  if (event.type === HttpEventType.DownloadProgress) {
  }

  if (event.type === HttpEventType.UploadProgress) {
  }

  if (event.type === HttpEventType.Response) {
    console.log(event.body);
  }
})
به این ترتیب بدون نیاز به کامپوننت اضافه‌تری می‌توان درصد پیشرفت آپلود را نمایش داد.

برای مطالعه‌ی بیشتر:
The Angular HTTP Client - Quickstart Guide 
A Taste From The New Angular HTTP Client  
نظرات مطالب
راه‌اندازی Http Interceptor در Angular
یک نکته‌ی تکمیلی
به همراه نگارش Angular 4.3، روش جدیدی برای کار با HTTP، توسط ماژول جدید HTTP Client آن ارائه شده‌است که ساختار آن بسیار شبیه به ماژول فعلی HTTP آن است و کدهای فعلی را به سادگی می‌توان به آن انتقال داد. یکی از تغییرات آن داشتن HttpInterceptor به صورت توکار است:
import { HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

@Injectable()
class JWTInterceptor implements HttpInterceptor {
    constructor(private userService: UserService) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
          const JWT = `Bearer ${this.userService.getToken()}`;
          req = req.clone({
                     setHeaders: {
                        Authorization: JWT
                     }
                });
          return next.handle(req);
    }
}

برای مطالعه‌ی بیشتر:
The Angular HTTP Client - Quickstart Guide 
A Taste From The New Angular HTTP Client 
نظرات مطالب
یکپارچه سازی Angular CLI و ASP.NET Core در VS 2017
برای تکرار مجدد: ساختار مدیریت پروژه‌های قدیمی MVC 5 در VS مانند پروژه‌های VSCode یا ASP.NET Core (در همان VS با همان نگارش) نیستند. یعنی هرفایلی که در فایل csproj ارجاعی نداشته باشد، در IDE نمایش داده نمی‌شود (اما در پروژه‌های VSCode و یا پروژه‌های جدید ASP.NET Core، به محض اضافه شدن یک فایل جدید به پوشه‌ی پروژه، این فایل در IDE هم نمایان می‌شود). بنابراین روی دکمه‌ی show all files در solution explorer کلیک کنید و فایل‌های جدید را include کنید (مانند قبل و تمام پروژه‌های دیگری از این دست).


یک نکته: علت اینکه پروژه‌های ASP.NET Core به این صورت پویا عمل می‌کنند، وجود NET Core CLI. هست. این CLI هم شبیه به Angular-CLI یک ابزار خط فرمان است که کار ایجاد یک پروژه‌ی جدید تا ساخت و توزیع برنامه را مدیریت می‌کند و در حقیقت VS فقط این فرامین خط فرمان را در پشت صحنه اجرا می‌کند. بنابراین بهتر است از ساختار پروژه‌ای استفاده کنید که اساسا برای ابزارهای CLI طراحی شده‌است.

نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 13 - معرفی View Components
ارتقاء به ASP.NET Core 1.1
روش معرفی پیشین View Components
@await Component.InvokeAsync("SiteCopyright", new { numberToTake = 5 })
در مقایسه با Tag Helpers ارائه شده در ASP.NET Core، آنچنان زیبا نیست و با کل مجموعه ناهماهنگ به نظر می‌رسد. به همین جهت در نگارش 1.1، امکان درج و تعریف View Components را به صورت Tag Helpers مهیا کرده‌اند:
<vc:site-copyright number-to-take="5"></vc:site-copyright>
که در اینجا تعریف یک ViewComponent با vc شروع می‌شود و سپس نام آن به صورت «کبابی» باید درج شود (Kebab Case)؛ همچنین پارامترهای مرتبط نیز به همین نحو. در روش معرفی «کبابی»، هرجایی که یک حرف، به صورت بزرگ درج شده‌است، یک - قرار می‌گیرد (شبیه به سیخ کباب!).
همچنین برای فعال سازی :vc نیاز است به فایل ViewImports.cshtml_ مراجعه کرده و اسمبلی جاری را که vc در آن قرار دارد، معرفی کرد:
@addTagHelper *,Core1RtmEmptyTest
پس از این تعریف، vcهای اسمبلی معرفی شده، قابلیت تعریف به صورت Tag Helper را خواهند داشت.
نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایل‌های config
یک نکته: طراحی کانفیگ برای یک کتابخانه
فرض کنید قصد دارید برای کتابخانه‌ای که در حال طراحی هستید، تنظیماتی را از استفاده کننده دریافت کنید؛ مثلا از طریق کلاسی شبیه به تعریف SmtpConfig مطلب فوق.
برای اینکار، ابتدا یک متد الحاقی را تعریف می‌کنیم که IServiceCollection را به همراه SmtpConfig دریافت کند:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
 
namespace SampleLib
{
  public static class MyServiceCollectionExtensions
  {
   public static void AddMySampleLib(this IServiceCollection services, SmtpConfig configureOptions)
   {
    services.TryAddSingleton(Options.Create(configureOptions));
   }
  }
}
سپس کار معرفی این کلاس تنظیمات به سیستم IOptions ، از طریق ثبت سرویس آن توسط متد Options.Create صورت می‌گیرد.
استفاده کنند، تنها نیاز دارد تا این تنظیمات را به صورت ذیل در کلاس آغازین برنامه وارد کند:
public void ConfigureServices(IServiceCollection services)
{
   services.AddMySampleLib(new SmtpConfig { /*...*/ });
و در آخر در کدهای کتابخانه‌ی در حال طراحی، با تزریق <IOptions<SmtpConfig به سازنده‌ی کلاس‌ها، می‌توان به تنظیمات ثبت شده، دسترسی پیدا کرد.
نظرات مطالب
روش های مختلف پردازش یک رشته و تبدیل آن به نوع داده تاریخ
یک نکته
اگر مثال زیر را برای تبدیل تاریخ شمسی 1393/02/31 یا 1393/04/31، به کمک متد DateTime.ParseExact اجرا کنید، با استثنایی متوقف خواهید شد:
var persianCulture = new CultureInfo("fa-IR");
var persianDateTime = DateTime.ParseExact("31/02/1393", "dd/MM/yyyy", persianCulture);
علت اینجا است که persianCulture.Calendar به GregorianCalendar تنظیم شده‌است (از ابتدا و به اشتباه) و قابل تغییر نیست (مگر با Reflection). راه حل جایگزین، چیزی شبیه به این خواهد بود:
   using System;
   using System.Globalization;
   using System.Linq;

    public static DateTime PersianDateToGregorianDate(string pDate)
    {
        var dateParts = pDate.Split(new[] { '/' }).Select(d => int.Parse(d)).ToArray();
        var hour = 0;
        var min = 0;
        var seconds = 0;
        return new DateTime(dateParts[0], dateParts[1], dateParts[2],
                            hour, min, seconds, new PersianCalendar());
    }
نظرات مطالب
راهنمای گام به گام انتقال پروژه از MVC 5 به MVC 6
یک نکته:
اگر از نسخه‌ی ASP.NET 5 RC در visual studio استفاده میکنید، این نسخه نسبت به نسخه‌های بتا، تغییراتی در ساختار پروژه داشته است. از جمله اینکه فایل‌های bower.json  و package.json به صورت پیش فرض در ساختار پروژه قابل رویت نیستند، هر چند در مسیر پروژه وجود دارند! دلیل این امر هم این است که در این نسخه، رابط کاربری bower package manager برای مدیریت راحت‌تر ارائه شده است که همانند NuGet package manager یک user interface است که دسترسی و مدیریت راحت‌تر را برای کتابخانه‌های سمت کلاینت فراهم میکند و برای تغییر و به روزرسانی، استفاده از این روش توصیه می‌شود. جهت استفاده از این قابلیت، روی پروژه کلیک راست کرده و گزینه Manage Bower Packages را انتخاب نمایید. این user interface بسیار شبیه NuGet می‌باشد و داری قابلیت‌های خوبی از جمله مدیریت بسیار راحت و امکان جستجو می‌باشد.


نظرات مطالب
آموزش ساخت و کار با subdomain در حالت لوکال هاست
متشکرم از پاسختون؛ من به این نتیجه رسیدم:
علاوه بر تنظیماتی که دوستمون توی فایل hosts انجام دادن باید توی مسیر IIS Express فایل applicatinHost.config را باز کرده و در قسمت binding پروژه دلخواهمون کد‌های شبیه زیر را وارد کنیم.

<bindings>
          <binding protocol="http" bindingInformation="*:6100:localhost" />
          <binding protocol="http" bindingInformation="*:6100:mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:store1.mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:store2.mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:store3.mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:store4.mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:store5.mysite.com" />
          <binding protocol="http" bindingInformation="*:6100:master.mysite.com" />
        </bindings>
نظرات مطالب
آموزش MDX Query - قسمت شانزدهم – استفاده از تابع Filter در MDX Query ها
سلام و خسته نباشید؛ یه سوال داشتم: کوئری‌های mdx پروژه‌ی SSAS م رو به جای اینکه با استفاده از reporting service بخوام نمایش بدم باید با استفاده از یه فرم توی C# نمایش بدم . یعنی با استفاده از ADOMD data adaptor یا CEllSEt و ... شبیه اینها . سوال من اینجاست که اگه بخوام روی فرمم که قراره کوئری هام توش نمایش پیدا کنه یه textbox بذارم و بخوام که مقداری که توی textbox وارد میشه رو بعنوان یه پارامتر توی دستور mdxم تاثیر بدم باید چیکار کنم؟ بطور مثال من یه تاریخ توی textbox روی فرمم وارد کنم و اونوقت کوئری بجای اینکه مثه قبل تمام محصولات فروخته شده رو نشون اون محصولاتی رو که توی اون تاریخ مشخص شده فروخته شده (توی textbox ذکرش شده ) رو نشون بده. ممنون