مطالب دوره‌ها
استفاده از AutoMapper در برنامه‌های چند ریسمانی
نکته‌ی بسیار مهمی را که حین کار با AutoMapper باید بخاطر داشت، عدم thread safety متد Mapper.CreateMap آن است و استفاده‌ی از آن در برنامه‌های چند ریسمانی و خصوصا برنامه‌های وب، مشکلات متعددی را به همراه خواهد داشت. بنابراین بهترین محل تعریف و معرفی این نگاشت‌ها، در حین آغاز برنامه‌‌است؛ برای مثال در متد Application_Start فایل global.asax برنامه‌های وب، یا ابتدای متد Main برنامه‌های دسکتاپ.
برای نمونه یک چنین کدی را نباید در برنامه‌های خود داشته باشید:
public ActionResult Index()
{
    Mapper.CreateMap<UserViewModel, User>();
    //ادامه‌ی کدها
در اینجا از متد استاتیک Mapper.CreateMap، در یک اکشن متد برنامه‌ی ASP.NET MVC استفاده شده‌است. این متد thread safe نیست و چون کار تنظیمات اولیه‌ی این نگاشت‌ها (پیش از کش شدن آن‌ها) اندکی زمانبر است، ممکن است در این بین، دو کاربر همزمان به این قطعه کد رسیده و شاهد این باشند که تعدادی از خواص در اینجا نگاشت نشده‌اند.

نمونه‌ی دیگر آن، یک چنین کدهایی هستند:
    using (var context = new TestDbContext())
    {
        Mapper.CreateMap<SourceClass, DestinationClass>()
            .AfterMap((src, dest) =>
            {
                  //using context
            });

         var dest = Mapper.Map<DestinationClass>(source);
    }
در اینجا برحسب نیاز از context مربوط به Entity framework داخل تنظیمات Mapper.CreateMap استفاده شده‌است. متد Mapper.CreateMap استاتیک است و context استفاده شده‌ی در آن thread safe نیست. همینجا است که مشکلات تخریب اطلاعات را شاهد خواهید بود.
اگر در یک چنین حالتی نیاز به استفاده‌ی context داشتید، بهتر است متدهای استاتیک AutoMapper را فراموش کرده و به نحو ذیل یک موتور محلی نگاشت را ایجاد کنید. چون سطح دید و دسترسی این موتور، عمومی و سراسری نیست، مشکلات thread safety را نخواهد داشت.
 var configurationStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
configurationStore.AddProfile<TestProfile1>();
var mapper = new MappingEngine(configurationStore);
configurationStore.CreateMap<SourceClass, DestinationClass>()
//ادامه‌ی کدها 
نظرات اشتراک‌ها
تبدیلگر ایران سیستم به یونیکد
برای ایجاد بانک اطلاعاتی جدید فاکس پرو نیاز است فقط مسیر پوشه را داد و نه مسیر فایل را. نام جدول مشخص شده، تبدیل به نام فایل تولیدی می‌شود:
//ایجاد بانک اطلاعاتی خالی
var dir = @"D:\Prog\"; // این مسیر پوشه است و نه مسیر فایل
using (OleDbConnection connection = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + dir))
{
    using (var command = new OleDbCommand())
    {
        command.Connection = connection;
        command.Connection.Open();
        command.CommandText = "Create Table myDBF (dsw_id1 int, dsw_fname v(250), dsw_lname v(250) )";
        command.CommandType = CommandType.Text;
        command.ExecuteNonQuery();
    }
}
برای ثبت اطلاعات پارامتری در بانک اطلاعاتی فاکس پرو فقط و فقط پارامترهایی با نام ? مجاز هستند (و نه هیچ حالت دیگری):
//ثبت اطلاعات در بانک ایجاد شده
var dbPath = Path.Combine(dir, "myDBF.dbf");
using (OleDbConnection connection = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + dbPath))
{
    using (var command = new OleDbCommand())
    {
        command.Connection = connection;
        command.Connection.Open();
        command.CommandText = "Insert Into myDBF Values (1, ?, ?)";
        command.Parameters.AddWithValue("?", "B"); // فقط علامت سؤال در اینجا کار می‌کند و نه هیچ چیز دیگری
        command.Parameters.AddWithValue("?", "A");
        command.CommandType = CommandType.Text;
        command.ExecuteNonQuery();
    }
}
- متد اصلی آن مطلب «public List» است که این لیست را باید تبدیل به رشته کنید.
اشتراک‌ها
پیاده سازی Etag Filter
public class ETagAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Filter = new ETagFilter(filterContext.HttpContext.Response, filterContext.RequestContext.HttpContext.Request);
    }
}

public class ETagFilter : MemoryStream
{
    private HttpResponseBase _response = null;
    private HttpRequestBase _request;
    private Stream _filter = null;

    public ETagFilter(HttpResponseBase response, HttpRequestBase request)
    {
        _response = response;
        _request = request;
        _filter = response.Filter;
    }

    private string GetToken(Stream stream)
    {
        var checksum = new byte[0];
        checksum = MD5.Create().ComputeHash(stream);
        return Convert.ToBase64String(checksum, 0, checksum.Length);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        var data = new byte[count];

        Buffer.BlockCopy(buffer, offset, data, 0, count);

        var token = GetToken(new MemoryStream(data));
        var clientToken = _request.Headers["If-None-Match"];

        if (token != clientToken)
        {
            _response.AddHeader("ETag", token);
            _filter.Write(data, 0, count);
        }
        else
        {
            _response.SuppressContent = true;
            _response.StatusCode = 304;
            _response.StatusDescription = "Not Modified";
            _response.AddHeader("Content-Length", "0");
        }
    }
}
پیاده سازی Etag Filter
نظرات مطالب
تقویم شمسی کاملا Native برای Blazor
من نتوانستم از طریق روش شما CultureInfo را تنظیم کنم. اما با روش زیر این مشکل حل شد. اینجا به اشتراک گذاشتم تا اگر کسی به این مشکل مشابه برخورد بتواند حلش کند.
برای انتساب CultureInfo فارسی بایستی در فایل startup بخش configuration موارد زیر را افزود:

var cultureInfo = new CultureInfo("fa-IR");
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

در ضمن مشکل قسمت فینگلیش اسم ماه‌ها و ... برطرف شده است.
نظرات مطالب
کوئری نویسی در EF Core - قسمت پنجم - اعمال تجمعی - بخش اول
وقت بخیر؛ در مورد مثال 9 میزان فروش کل هر امکان ... از دستورات زیر استفاده کردم و جواب یکسانی با روش ارائه شده بدست اوردم.
var facilities = _db.Bookings.GroupBy(c=>c.Facility)
                .Select(c => new
                {
                    Name=c.Key.Name,
                    TotalRevenue = c.Sum(s=>s.MemId==0?
                        s.Slots*s.Facility.GuestCost:
                        s.Slots*s.Facility.MemberCost)
                })
                .OrderBy(result => result.TotalRevenue)
                .ToList();
نظرات مطالب
Blazor 5x - قسمت ششم - مبانی Blazor - بخش 3 - چرخه‌های حیات کامپوننت‌ها
دلیل دوبار فراخوانی کدهای Razor در هنگام استفاده  از متدهای async سرویس‌های EF چیست ؟آیا راهی برای جلوگیری از تکرار آن وجود دارد؟
در تکه کد زیر کلمه Code دوبار در خروجی چاپ میشود و این برای کار با حلقه ها  باعث کاهش کارایی میشود
@page "/counter"  
@{ Debug.WriteLine("Code"); } @code { protected override async Task OnInitializedAsync() { var _dbContext = new ApplicationDbContext(); await _dbContext.Question.ToListAsync(); } }
نظرات مطالب
انتقال دائمی آدرس ها (Permanent Ridirect) در ASP.NET Webform
ممنون بابت پاسخگوییتون. ولی من میخوام ریدایرکت به آدرسی که روت کردم انجام بشه. مثلا من بعد از این تنظیمات: 
            var settings = new FriendlyUrlSettings();
            settings.AutoRedirectMode = RedirectMode.Permanent;
            routes.EnableFriendlyUrls(settings);

            routes.MapPageRoute("aboutus", "درباره-ما", "~/aboutus.aspx");
انتظار دارم که صفحه "aboutus.aspx"  به  " درباره-ما "  ریدایرکت بشه نه به " aboutus " . آیا این کار شدنی هست یا نه؟ من بعد از این کار نتیجه ای که میگیرم این هست که برای یک صفحه دو آدرس دارم.  یکی " درباره-ما / mydomain " و دیگری "mydomain/ aboutus  " 
نظرات مطالب
روش استفاده‌ی صحیح از HttpClient در برنامه‌های دات نت
هنوز هم می‌توانید از تک client استفاده کنید به شرطی‌که از متد ویژه‌ی زیر استفاده کنید:
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
در این متد می‌توان هدرها را به ازای هر درخواست مشخص، جداگانه تنظیم و ارسال کرد (بدون تاثیر گذاشتن بر روی سایر درخواست‌ها):
 var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
 httpRequestMessage.Headers.Authorization = ...
 httpClient.SendAsync(httpRequestMessage);
نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایل‌های config
من با این صورت فایل رو آپدیت می‌کنم
        public void UpdateSettings(SiteSettings siteSettings)
        {
            var path = System.IO.Path.Combine(_hostingEnvironment.WebRootPath, "appsettings.json");
            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(path, false);
            streamWriter.Write(Newtonsoft.Json.JsonConvert.SerializeObject(siteSettings));
            streamWriter.Close();
        }
ولی نه در فایل تغییری ایجاد می‌شه و نه در مقادیر :
        private readonly IOptionsSnapshot<SiteSettings> _siteOptions;
برنامه خطای دسترسی هم نمی‌دهد!
نظرات مطالب
ارسال فایل و تصویر به همراه داده‌های دیگر از طریق jQuery Ajax
نکته تکمیلی :
این حالت رو می‌توان به صورت ترکیبی با Ajax.BeginForm هم انجام داد تا از امکان بایندیگ و ... محروم نشیم:
سمت Html:
@using (Ajax.BeginForm("Upload", "Attachment", FormMethod.Post, 
new AjaxOptions
                            {
                                HttpMethod = "POST",
                            },
                            new
                            {
                                encType = "multipart/form-data",
                                id = "attach-form"
                            }))
{
    @Html.AntiForgeryToken()

    @Html.TextBoxFor(m => m.FirstName })
    
    <input type="file" name="Files" data-buttonText="انتخاب تصویر">
   
    <button type="submit">ارسال</button>
}
کد‌های Javascript :
        var formData = new FormData();

        $('form').submit(function() {
            
            var action = $(this).attr('action');
            var formData = new FormData($(this).get(0));

            $.ajax({
                type: "POST",
                dataType: "json",
                url: action,
                data: formData,
                processData: false,
                contentType: false,
                success: function(data) {
                    //...
                }
                success: function(data) {
                     //...
                }
            });

            return false;
        });
کد سمت سرور #C:
public class MyModel
    {
        public string FirstName{ get; set; }

        public IEnumerable<HttpPostedFileBase> Files { get; set; }
    }  
[AjaxOnly]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload(MyModel model)
{
     if (!ModelState.IsValid)
         return //....

     if(model.Files != null)
         foreach (var file in model.Files)
             if (file  != null && file.ContentLength > 0)
             {
                 // ....
             }
}