دورهی کامل میکروسرویسها در دات نت
.NET Microservices – Full Course, Les Jackson
In this step-by-step tutorial I take you through an introduction on building microservices using .NET. As the name suggests we build everything completely from start to finish –with the full scope of the course outlined in the time-stamp section below. However, at a high-level we’ll cover:
• Building two .NET Microservices using the REST API pattern
• Working with dedicated persistence layers for both services
• Deploying our services to Kubernetes cluster
• Employing the API Gateway pattern to route to our services
• Building Synchronous messaging between services (HTTP & gRPC)
• Building Asynchronous messaging between services using an Event Bus (RabbitMQ)
رفع اشکال خطای an error was encountered in the transport layer در هنگام وصل شدن از کلاینتی که در یک کامپیوتر دیگر نصب شده است به Sql Server Analysis Services
در هنگام برخورد با این مشکل، پس از بررسیها و تستهای مختلف و پیاده کردن روشهای متفاوتی که در وب مطرح شده بود، به فکرم رسید که شاید از طریق درج مستقیم پورت بتوان مشکل را حل کرد که مراحل آن به شرح ذیل میباشد:
برای بدست آوردن پورتی ( Port ) که Analysis Services به آن گوش میدهد و با آن کار میکند، باید کارهای ذیل انجام شوند:
از طریق Sql Server Configuration Manager، همانطور که در تصویر آمده است، PID یا Process Id را که مربوط به Sql Server Analysis Services میشود، برای هر نمونهای ( Instance ) که میخواهیم به آن وصل شویم، بدست میآوریم:
سپس از طریق Command Prompt دستور ذیل را اجرا میکنیم:
netstat /abo >>c:\output.txt
پس از آن کافی است که در رشتهی اتصال به Analysis Services از آن Port استفاده کنیم:
و یا
در حال حاضر این کتابخانه از مفاهیم زیر پشتیبانی میکند:
- تبدیل کلاس به جدول با پشتیبانی از خصوصیت Table
- تبدیل پراپرتیها به ستون با پشتیبانی از خصوصیت هایی چون Column,Key,MaxLength,Required,Notmapped,DatabaseGenerated,Index
- پشتیبانی از primarykey و کلیدهای ترکیبی
- کلید خارجی و روابط یک به چند و پشتیبانی از cascade on delete
- فیلد غیر نال
برای شروع ابتدا کتابخانه مورد نظر را از Nuget با دستور زیر دریافت کنید:
Install-Package SQLite.CodeFirst
solution من شامل سه پروژه است یکی برای مدلها که شامل کلاسهای زیر برای تهیه یک دفترچه تلفن ساده است:
Person
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual ICollection<PhoneBook> Numbers { get; set; } }
PhoneBook
public class PhoneBook { public int Id { get; set; } public string Field{ get; set; } public string Number { get; set; } public virtual Person Person { get; set; } }
پروژه بعدی به نام سرویس که جهت پیاده سازی کلاسهای EF است و دیگری هم یک پروژهی WPF جهت تست برنامه.
در پروژهی سرویس ما یک کلاس به نام Context داریم که مفاهیم مربوط به پیاده سازی Context در آن انجام شده است:
public class Context:DbContext { public Context():base("constr") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); var initializer = new InitialDb(modelBuilder); Database.SetInitializer(initializer); } public DbSet<PhoneBook> PhoneBook { get; set; } public DbSet<Person> Persons { get; set; } }
اول اینکه در سطر اول متد بازنویسی شده onModelCreating، قرارداد مربوط به نامگذاری جداول را حذف میکنیم چرا که در صورت نبودن این خط، اسامی که کلاس sqllite برای آن در نظر خواهد گرفت با اسامی که برای انجام عملیات CURD استفاده میشوند متفاوت خواهد بود. برای مثال برای Person جدولی به اسم People خواهد ساخت ولی برای درج، آن را در جدول Person انجام میدهد که به خاطر نبودن جدول با خطای چنین جدولی موجود نیست روبرو میشویم.
نکتهی دوم اینکه در همین کلاس Context ما یک پیاده سازی جدید بر روی کلاس InitialDb داشته ایم که در زیر نمونه کد آن را میبینید:
public class InitialDb:SQLite.CodeFirst.SqliteCreateDatabaseIfNotExists<Context> { public InitialDb(DbModelBuilder modelBuilder) : base(modelBuilder) { } protected override void Seed(Context context) { var person = new Person() { FirstName = "ali", LastName = "yeganeh", Numbers = new List<PhoneBook>() { new PhoneBook() { Field = "Work", Number = "031551234" }, new PhoneBook() { Field = "Mobile", Number = "09123456789" }, new PhoneBook() { Field = "Home", Number = "031554321" } } }; context.Persons.Add(person); base.Seed(context); } }
سپس در پروژهی اصلی WPF در فایل AppConfig رشته اتصالی مورد نظر را وارد نمایید:
<connectionStrings> <add name="constr" connectionString="data source=.\phonebook.sqlite;foreign keys=true" providerName="System.Data.SQLite" /> </connectionStrings>
خطا:
The ADO.NET provider with invariant name 'System.Data.SQLite' is either not registered in the machine or application config file, or could not be loaded
قسمتی از فایل app.config:
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite.EF6" /> <remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> </DbProviderFactories> </system.data>
کد Load پروژه WPF:
public MainWindow() { InitializeComponent(); var context=new Context(); var list= context.Persons.ToList(); var s = ""; foreach (var person in list) { s += person.FirstName + " " + person.LastName + " has these numbers:" + Environment.NewLine; foreach (var number in person.Numbers) { s += number.Field + " : " + number.Number + Environment.NewLine; } s += Environment.NewLine; } MessageBox.Show(s); }
دانلود مثال
یکی از تغییرات مهم ASP.NET Core 3.0 نسبت به نگارشهای قبلی، جنریک شدن Host آن است (چون حالتهای هاستینگ بیشتری را نسبت به حالت صرف MVC پشتیبانی میکند). به این ترتیب HostBuilder نگارش 2x:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>();
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
علت اینجا است که در ASP.NET Core 3x، یک باگ بسیار مهم سیستم تزریق وابستگیهای ASP.NET Core برطرف شدهاست: اکنون فقط یک dependency injection container به ازای کل برنامهی ASP.NET Core 3x ساخته میشود. در نگارشهای قبلی، یک container برای برنامه و یک container مجزا برای host تولید میشدند. در این حالت اگر یک سرویس Singleton را در فایل program.cs معرفی میکردید:
WebHost.CreateDefaultBuilder() .UseStartup<Startup>() .ConfigureServices(services => services.AddSingleton<MySingleton>()) .Build() .Run();
در اینجا هرچند متد ConfigureServices وجود دارد، اما اگر از آن استفاده کنید، سرویس معرفی شدهی توسط آن، در سازندهی کلاس Startup شناسایی نمیشود.
IIS 7.5 که به همراه ویندوز سرور 2008 R2 ارائه میشود شامل تازههای زیر است:
- بیش از 50 مورد cmdlet جدید مخصوص Powershell جهت مدیریت IIS
- افزونههای جدید مدیریتی: Database Manager (مدیریت اس کیوال سرور از درون IIS و کنسول آن)، Configuration Editor (تولید خودکار اسکریپتهای مدیریتی جهت اتوماسیون امور مرتبط)، IIS Reports و Request Filtering .
- پشتیبانی از One-click publishing موجود در Visual Studio 10
- Web Deployment Tool یا همان MS Deploy سابق جهت مدیریت بهتر برنامههای وب.
- امکان ردیابی تغییرات در کانفیگ وب سرور
- گزارشگیری بهتر از وضعیت کارآیی سرور
- ساپورت دات نت جهت Server Core معرفی شده در ویندوز سرور 2008
- WebDav که پیشتر به صورت یک افزونهی آن معرفی شده بود، اکنون جزئی از IIS 7.5 است.
- یکپارچگی با URLScan 3.0 جهت بالا بردن امنیت وب سرور.
- FTP server services : با کنسول مدیریتی IIS یکپارچه شده است با بهبودهایی در نحوهی تنظیم کردن و ردیابی آن.
جهت مطالعه بیشتر در مورد تازههای ویندوز سرور 2008 نگارش R2 میتوان به مقالات زیر رجوع کرد:
Windows Server 2008 R2 new features - the complete list - Part 1: Virtualization
Windows Server 2008 R2 new features - the complete list - Part 2: Active Directory
Windows Server 2008 R2 new features - the complete list - Part 3: IIS 7.5 and Performance
Windows Server 2008 R2 new features - the complete list - Part 4: Administration
EF Code First #1
Install-Package : Could not connect to the feed specified at 'https://www.nuget.org/api/v2/'. Please verify that the package source (located in the Package Manager Settings) is valid and ensure your network connectivity. At line:1 char:1 + Install-Package EntityFramework + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Install-Package], InvalidOperationException + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand
اجرا نشدن پروژه
الف) فایلهای MVC5.DataLayer.csproj و MVC5.IocConfig.csproj را باز کنید. عبارت EntityFramework.6.1.1 را تبدیل کنید به EntityFramework.6.1.3 تا مشکل عدم یافت شدن EF برطرف شود.
ب) در سورس ارائه شده، این فایلها Add نشدهاند:
Source file 'AdminArea\User\UserSearchViewModel.cs' could not be found Source file 'EF.Filters\UserFilters.cs' could not be found Source file 'Extentions\ToPersianDateTimeConverter.cs' could not be found Source file 'NormalizationInfo.cs' could not be found