اشتراک‌ها
پروژه gRPC ؛ نسل بعدی RESTful !

gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems.

مقاله فارسی : پروژه gRPC ؛ نسل بعدی RESTful !

مخزن گیتهاب : https://github.com/grpc/grpc  

مثال سی شارپی : https://github.com/grpc/grpc/tree/master/examples/csharp/Helloworld

پروژه gRPC ؛ نسل بعدی RESTful !
اشتراک‌ها
سری Redis برای برنامه نویس‌های دات نت

Redis (REmote DIctionay Server) is a very popular open-source, networked, in-memory, key-value data store, sometimes referred to as a data structure server which also comes with optional durability. Redis is well known for high performance, flexibility, provides a rich set of data structures, and a simple straightforward API.  

سری Redis برای برنامه نویس‌های دات نت
نظرات مطالب
VS Code برای توسعه دهندگان ASP.NET Core - قسمت دوم - ایجاد و اجرای اولین برنامه
افرایش سرعت در نوشتن صفت (Attribute)‌های ویوو مدل ها
در اکثر پروژه‌ها، متن خطای اکثر ویوو مدل‌ها شبیه هم است و تفاوت خاصی ندارند؛ مثلا اتریبیوت Required، متن خطایش معمولا با این مضمون است: "لطفا فیلد ... را وارد نمایید." ما میتوانیم تمام این متن‌های خطاها را در جایی دیگر تعریف و در متن خطای اتریبیوت‌هایمان از آن استفاده کنیم که باعث میشود بعدا اگر خواستیم متن خطا‌ها را تغییر دهیم (مثلا در مورد اتریبیوت Required متن "لطفا فیلد ... را وارد نمایید" را با * عوض کنیم) در تمام پروژه این تغییر اعمال میشود و دیگر نیازی نیست تمامی متن خطاها را یکی یکی تغییر دهیم و نگهداری کد‌ها برای بعد راحت‌تر میشود.
برای شروع یک کلاس را برای متن خطاهای اتریبیوت‌هایمان تعریف میکنیم:
public static class AttributesErrorMessages
{
    public const string RequiredMessage = "لطفا {0} را وارد نمایید";
    public const string MinLengthMessage = "{0} نباید کمتر از {1} کاراکتر باشد";
    public const string MaxLengthMessage = "{0} نباید بیشتر از {1} کاراکتر باشد";
    public const string RegularExpressionMessage = "{0} را به درستی وارد نمایید";
    public const string StringLengthMessage = "{0} باید بین {2} کاراکتر و {1} کاراکتر باشد";
    public const string RemoteMessage = "با این {0} قبلا ثبت نام شده است";
}
حال برای تعریف هر ویوو مدل تنها کافی است آن را تعریف و در بالای آن، از اتریبیوت دلخواه استفاده و متن ارور آن را مطابق کلاس فوق وارد میکنیم، مثلا:
[StringLength(110, MinimumLength = 5, ErrorMessage = AttributesErrorMessages.StringLengthMessage)]
public string TestProp { get; set; }
حال میتوان کار را ساده‌تر نیز کرد و تمام اتریبیوت‌ها را به یک قطعه‌کد (Snippet) تبدیل کرد. برای این کار از طریق File>Preferences وارد منوی User Snippet میشویم و بعد زبان سی شارپ را انتخاب و بعد Snippet‌های خود را اضافه میکنیم:
{
   "Required":{
      "prefix":"required",
      "body":[
         "[Required(ErrorMessage = AttributesErrorMessages.RequiredMessage)]"
      ],
      "description":"Required attribute"
   },
   "Max Length":{
      "prefix":"maxlength",
      "body":[
         "[MaxLength(${1:number}, ErrorMessage = AttributesErrorMessages.MaxLengthMessage)]"
      ],
      "description":"Max length attribute"
   },
   "Min Length":{
      "prefix":"minlength",
      "body":[
         "[MinLength(${1:number}, ErrorMessage = AttributesErrorMessages.MinLengthMessage)]"
      ],
      "description":"Min length attribute"
   },
   "String Length":{
      "prefix":"stringlength",
      "body":[
         "[StringLength(${1:maximumNumber}, MinimumLength = ${2:minmumNumber}, ErrorMessage = AttributesErrorMessages.StringLengthMessage)]"
      ],
      "description":"String length attribute"
   },
   "Email Address":{
      "prefix":"emailaddress",
      "body":[
         "[EmailAddress(ErrorMessage = AttributesErrorMessages.RegularExpressionMessage)]"
      ],
      "description":"Email address attribute"
   },
   "Regular Expression":{
      "prefix":"regularexpression",
      "body":[
         "[RegularExpression(\"${1:patternString}\", ErrorMessage = AttributesErrorMessages.RegularExpressionMessage)]"
      ],
      "description":"Regular expression attribute"
   },
   "Remote Expression":{
      "prefix":"remote",
      "body":[
         "[Remote(\"${1:action}\", \"${2:controller}\", ErrorMessage = AttributesErrorMessages.RemoteMessage)]"
      ],
      "description":"Remote attribute"
   }
}
حال تنها کافی است اسم اتریبیوت مورد نظر را تایپ کنیم و آن Snippet را از پنجره Intellisense انتخاب کنیم.
نظرات مطالب
امن سازی برنامه‌های ASP.NET Core توسط IdentityServer 4x - قسمت چهاردهم- آماده شدن برای انتشار برنامه
سلام، من برنامه کوچک ازIdentityServer4 نوشتم که در Local کار می‌کند اما وقتی Publish می‌گیرم و روی Host ، IIS می‌کنیم در زمان Authentication و استفاده از API با خطای زیر مواجه می‌شم:
IDX20804: Unable to retrieve document from: 'https://localhost/.well-known/openid-configuration'. ---> 
System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> 
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
نکته اینجاست که از روی IIS وقتی برنامه را اجرا می‌کنیم مسیر زیر قابل دسترسی هست، اما از طریق اجرای برنامه با خطای بالا مواجه می‌شم.
نظرات مطالب
امن سازی برنامه‌های ASP.NET Core توسط IdentityServer 4x - قسمت چهارم - نصب و راه اندازی IdentityServer
"The remote server returned an error: (404) Not Found."

جهت افزودن افزودن UI به IdentityServer  (مطابق read-me به روز شده‌ی آن) دستور زیر را
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/release/get.ps1'))
به
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/master/getmaster.ps1'))
تغییر دهید.
نظرات مطالب
احراز هویت و اعتبارسنجی کاربران در برنامه‌های Angular - قسمت ششم - کار با منابع محافظت شده‌ی سمت سرور
زمانیکه از متد http به جای  httpClient برای استفاده از داده‌های محافظت شده سمت سرور استفاده میکنم اجازه دسترسی به آنها را نمیدهد و در هدر ارسال شده این پیام رو نشان میدهد:   
Request URL: http://localhost:5000/api/office?page=1&pageSize=5
Request Method: GET
Status Code: 401 Unauthorized
Remote Address: [::1]:5000
Referrer Policy: no-referrer-when-downgrade
نظرات مطالب
احراز هویت و اعتبارسنجی کاربران در برنامه‌های Angular - قسمت ششم - کار با منابع محافظت شده‌ی سمت سرور
مطالبی که توضیح دادید رو مطالعه کردم و استفاده کردم
فقط در حالت استفاده از httpClient  وقتی از متدهای put،delete و post استفاده میکنم این خطا رو میده:
Request URL: http://localhost:5000/api/ChangePassword
Request Method: POST
Status Code: 400 Bad Request
Remote Address: [::1]:5000
Referrer Policy: no-referrer-when-downgrade
این نمونه post از همون پروژه خودتون هست
نظرات مطالب
سفارشی سازی ASP.NET Core Identity - قسمت سوم - نرمال سازها و اعتبارسنج‌ها
- سیستم Identity فقط با یک نمونه‌ی از IUserValidator کار می‌کند. 
- اگر چندین پیاده سازی یک اینترفیس را به سیستم تزریق وابستگی‌ها معرفی کنید، استفاده‌ی از آن‌ها نکات خاصی را به همراه دارند که در سری مهارت‌های تزریق وابستگی‌های NET Core. بحث خواهند شد.
- زمانیکه قصد ندارید از IUserValidator پیش‌فرض این سیستم در remote validation خاص یک نقطه‌ی ویژه‌ی برنامه استفاده کنید، نیازی هم به تعریف یا سفارشی سازی آن ندارید. منطق سفارشی خودتان را به هر نحوی که مایل بودید تعریف کنید، چون جای دیگری استفاده نخواهد شد. یک سرویس Validator جدید خاص خودتان را تعریف کنید که دو متد بررسی تعیین اعتبار کاربر یا ایمیل را داشته باشد. سپس این سرویس را به صورت مستقل و جدای از IUserValidator سیستم Identity تزریق و استفاده کنید. دستکاری IUserValidator خود Identity، قسمت‌های دیگر سیستم شما را هم تحت تاثیر قرار خواهد داد.
نظرات مطالب
سفارشی سازی ASP.NET Core Identity - قسمت سوم - نرمال سازها و اعتبارسنج‌ها
ممنون؛ در واقع من اگر بخام بعد از postback یکسری ولیدیشن اختصاصی برای پسورد و یوزرنیم و ایمیل داشته باشم میتونم یک کلاس که از IUserValidator و IPasswordValidator ارثبری میکنه رو بسازم و ولیدیشن‌ها رو اونجا انجام بدم . برای نمایش ولیدیشن‌های خاص سمت کلاینت در کنترلر و خاصیت Remote استفاده کنم؟
و اینکه چه تفاوتی بین این دوتا خط کد هست ؟اینکه من بیام و فرضا کلاس CustomUserValidator رو بصورت Addscoped تزریق کنم یا بیام زمانیکه سرویس آیدنتیتی رو اضافه میکنم از AddUserValidator استفاده کنم و کلاس CustomUserValidator رو بهش معرفی کنم ؟در حالت دوم داره یک Extension Builder میسازه و خودش تزریق رو انجام میده؟
نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 14 - فعال سازی اعتبارسنجی ورودی‌های کاربران
- تنظیمات وابستگی‌های jquery, jquery-validation, jquery-validation-unobtrusive که در این مطلب از ابتدا بحث شدند (و یا به روز شده‌ی آن در «یک نکته‌ی تکمیلی: جایگزینی bower با npm») و استفاده‌ی از Tag helpers مرتبط که در انتهای بحث عنوان شدند، دقیقا همینکار را انجام می‌دهند.
- فقط دقت داشته باشید این مطالب جهت «ارتقاء به ASP.NET Core» تهیه شده‌اند. این «ارتقاء» یعنی پیشتر این مطالب را مطالعه کرده‌اید و با آن‌ها آشنایی دارید: