مبحث AddPolicy که در مطلب « سفارشی سازی ASP.NET Core Identity - قسمت پنجم - سیاستهای دسترسی پویا » توضیح داده شده، وابستگی به ASP.NET Core Identity ندارد و مستقل از آن، مرتبط به جزء Security مجموعه ASP.NET Core است که قسمتی از آن در مطلب جاری استفاده شدهاست. بنابراین نکات آنرا به همراه یک جدول اضافهتر RoleClaims، اینجا هم اضافه کنید، کار میکند و هیچ تفاوتی ندارد.
مسیرراهها
GraphQL در ASP.NET Core
- قسمت اول : شروع کار با GraphQL در ASP.NET Core
- قسمت دوم : کوئریهای پیشرفته، Error Handling و Data Loader در GraphQL
- قسمت سوم : GraphQL Mutations در ASP.NET Core ( عملیات POST, PUT, DELETE )
- قسمت چهارم : فراخوانی GraphQL API در یک کلاینت ASP.NET Core
- قسمت پنجم : فراخوانی GraphQL API در یک کلاینت Angular
فضای نام System.Net.Mail در NET Core 1.2. که پیاده سازی netstandard2.0 است، ارائه خواهد شد. بنابراین فعلا (در زمان NET Core 1.1.) راه حل توکار و رسمی برای ارسال ایمیل در برنامههای مبتنی بر NET Core. وجود ندارد. اما میتوان کتابخانهی ثالثی را به نام MailKit، به عنوان راهحلی که .NET 4.0, .NET 4.5, .NET Core, Xamarin.Android, و Xamarin.iOS را پشتیبانی میکند، درنظر گرفت و توانمندیها و پروتکلهای پشتیبانی شدهی توسط آن، از System.Net.Mail توکار نیز بسیار بیشتر است.
افزودن وابستگیهای MailKit به برنامه
برای شروع به استفادهی از MailKit، میتوان بستهی نیوگت آنرا به فایل project.json برنامه معرفی کرد:
استفاده از MailKit جهت تکمیل وابستگیهای ASP.NET Core Identity
قسمتی از ASP.NET Core Identity، شامل ارسال ایمیلهای «ایمیل خود را تائید کنید» است که آنرا میتوان توسط MailKit به نحو ذیل تکمیل کرد:
در اینجا MimeMessage بیانگر محتوا و تنظیمات ایمیلی است که قرار است ارسال شود. ابتدا قسمتهای From و To آن تنظیم میشوند تا مشخص باشد که ایمیل ارسالی از کجا ارسال شده و قرار است به چه آدرسی ارسال شود. در ادامه موضوع و عنوان ایمیل تنظیم شدهاست. سپس متن ایمیل، به خاصیت Body شیء MimeMessage انتساب داده خواهد شد. فرمت ایمیل ارسالی را نیز میتوان در اینجا تنظیم کرد. برای مثال TextFormat.Html جهت ارسال پیامهایی حاوی تگهای HTML مناسب است و اگر قرار است صرفا متن ارسال شود، میتوان TextFormat.Plain را انتخاب کرد.
در آخر، این پیام به SmtpClient جهت ارسال نهایی، فرستاده میشود. این SmtpClient هرچند هم نام مشابه آن در System.Net.Mail است اما با آن یکی نیست و متعلق است به MailKit. در اینجا ابتدا LocalDomain تنظیم شدهاست. تنظیم این مورد اختیاری بوده و صرفا به SMTP سرور دریافت کنندهی ایمیلها، مرتبط است که آیا قید آنرا اجباری کردهاست یا خیر. تنظیمات اصلی SMTP Server در متد ConnectAsync ذکر میشوند که شامل مقادیر host ،port و پروتکل ارسالی هستند.
ارسال ایمیل به SMTP pickup folder
روشی که تا به اینجا بررسی شد، جهت ارسال ایمیلها به یک SMTP Server واقعی کاربرد دارد. اما در حین توسعهی محلی برنامه میتوان ایمیلها را در داخل یک پوشهی موقتی ذخیره و آنها را توسط برنامهی Outlook (و یا حتی مرورگر Firefox) بررسی و بازبینی کامل کرد.
در این حالت تنها کاری را که باید انجام داد، جایگزین کردن قسمت ارسال ایمیل واقعی توسط SmtpClient در کدهای فوق، با قطعه کد ذیل است:
تولید فایلهای eml جهت «شبیه سازی ارسال ایمیل در ASP.Net» بسیار مفید هستند.
FAQ و منبع تکمیلی
افزودن وابستگیهای MailKit به برنامه
برای شروع به استفادهی از MailKit، میتوان بستهی نیوگت آنرا به فایل project.json برنامه معرفی کرد:
{ "dependencies": { "MailKit": "1.10.0" } }
استفاده از MailKit جهت تکمیل وابستگیهای ASP.NET Core Identity
قسمتی از ASP.NET Core Identity، شامل ارسال ایمیلهای «ایمیل خود را تائید کنید» است که آنرا میتوان توسط MailKit به نحو ذیل تکمیل کرد:
using System.Threading.Tasks; using ASPNETCoreIdentitySample.Services.Contracts.Identity; using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; namespace ASPNETCoreIdentitySample.Services.Identity { public class AuthMessageSender : IEmailSender, ISmsSender { public async Task SendEmailAsync(string email, string subject, string message) { var emailMessage = new MimeMessage(); emailMessage.From.Add(new MailboxAddress("DNT", "do-not-reply@dotnettips.info")); emailMessage.To.Add(new MailboxAddress("", email)); emailMessage.Subject = subject; emailMessage.Body = new TextPart(TextFormat.Html) { Text = message }; using (var client = new SmtpClient()) { client.LocalDomain = "dotnettips.info"; await client.ConnectAsync("smtp.relay.uri", 25, SecureSocketOptions.None).ConfigureAwait(false); await client.SendAsync(emailMessage).ConfigureAwait(false); await client.DisconnectAsync(true).ConfigureAwait(false); } } public Task SendSmsAsync(string number, string message) { // Plug in your SMS service here to send a text message. return Task.FromResult(0); } } }
در آخر، این پیام به SmtpClient جهت ارسال نهایی، فرستاده میشود. این SmtpClient هرچند هم نام مشابه آن در System.Net.Mail است اما با آن یکی نیست و متعلق است به MailKit. در اینجا ابتدا LocalDomain تنظیم شدهاست. تنظیم این مورد اختیاری بوده و صرفا به SMTP سرور دریافت کنندهی ایمیلها، مرتبط است که آیا قید آنرا اجباری کردهاست یا خیر. تنظیمات اصلی SMTP Server در متد ConnectAsync ذکر میشوند که شامل مقادیر host ،port و پروتکل ارسالی هستند.
ارسال ایمیل به SMTP pickup folder
روشی که تا به اینجا بررسی شد، جهت ارسال ایمیلها به یک SMTP Server واقعی کاربرد دارد. اما در حین توسعهی محلی برنامه میتوان ایمیلها را در داخل یک پوشهی موقتی ذخیره و آنها را توسط برنامهی Outlook (و یا حتی مرورگر Firefox) بررسی و بازبینی کامل کرد.
در این حالت تنها کاری را که باید انجام داد، جایگزین کردن قسمت ارسال ایمیل واقعی توسط SmtpClient در کدهای فوق، با قطعه کد ذیل است:
using (var stream = new FileStream($@"c:\smtppickup\email-{Guid.NewGuid().ToString("N")}.eml", FileMode.CreateNew)) { emailMessage.WriteTo(stream); }
FAQ و منبع تکمیلی
تغییرات پردازش تاریخ از زمان ارائهی ASP.NET Core 3.1
از زمان ارائهی کتابخانهی JSON توکار در ASP.NET Core 3x، نحوهی پردازش تاریخهای دریافتی در برنامههای ASP.NET Core نیز تغییر کرد و در حالت دریافت اطلاعات به صورت JSON در اکشن متدها، فقط بر اساس ISO 8601-1:2019 عمل میکند. یعنی اگر تاریخ را با فرمت متداول 2019/06/14 به سمت سرور ارسال کنید، خطای ModelState زیر را دریافت خواهید کرد:
{ "$.time": [ "The JSON value could not be converted to System.DateTime. Path: $.time | LineNumber: 1 | BytePositionInLine: 23." ] }
2019-06-14T02:30:04.0576719Z
'Full date' "yyyy'-'MM'-'dd" "'Full date''T''Hour'':''Minute'" "yyyy'-'MM'-'dd'T'HH':'mm" "'Full date''T''Partial time'" "yyyy'-'MM'-'dd'T'HH':'mm':'ss" (The Sortable ("s") Format Specifier) "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF" "'Full date''T''Time hour'':''Minute''Time offset'" "yyyy'-'MM'-'dd'T'HH':'mmZ" "yyyy'-'MM'-'dd'T'HH':'mm('+'/'-')HH':'mm" 'Date time' "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ" "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFZ" "yyyy'-'MM'-'dd'T'HH':'mm':'ss('+'/'-')HH':'mm" "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF('+'/'-')HH':'mm"
تغییرات پردازش تاریخ در ASP.NET Core 5x
در نگارشهای قبلی ASP.NET Core، اگر تاریخی از طریق کوئری استرینگ و با فرمت ISO فوق دریافت میشد، مانند:
https://localhost:44393/time?time=2019-06-14T02:30:04.0576719Z
Model-bound value is: 2019-06-13T19:30:04.0576719-07:00, Kind is: Local
یک نکته: ویژگیهای BindProperty و DisplayFormat در razor pages، امکان تغییر فرمت ورودی و نمایشی را میدهند:
[BindProperty, DisplayFormat(DataFormatString = "{0:yyyy-MM-ddTHH:mm}", ApplyFormatInEditMode = true)] public DateTime DateTime { get; set; } DateTime: <input asp-for="DateTime" asp-format="{0:yyyy-MM-ddTHH:mm}" />
مطالب
مهارتهای تزریق وابستگیها در برنامههای NET Core. - قسمت اول - تزریق وابستگیها در برنامههای کنسول
پیشتر با مقدمات تزریق وابستگیها در برنامههای ASP.NET Core آشنا شدهایم:
در ادامه در طی چند مطلب میخواهیم نکات و سناریوهای تکمیلی مرتبط با امکانات تزریق وابستگیهای توکار برنامههای مبتنی بر NET Core. را بررسی کنیم.
تزریق وابستگیها در برنامههای کنسول مبتنی بر NET Core.
تزریق وابستگیها، یکی از پرکاربردترین الگوهای طراحی برنامههای مدرن است. در نگارشهای قبلی ASP.NET، به کمک DependencyResolver آن، کتابخانههای ثالث کمکی تزریق وابستگیها میتوانستند خودشان را به سیستم متصل کنند. اینبار ASP.NET Core به همراه IoC Container توکار خودش ارائه شدهاست که این کتابخانه، در خارج از آن، مانند برنامههای کنسول نیز قابل استفاده است.
سرویس نمونهای برای تزریق آن در یک برنامهی کنسول NET Core.
در پوشهی جدید CoreIocServices، دستور dotnet new classlib را صادر میکنیم تا یک پروژهی class library جدید را ایجاد کند. سپس اینترفیس ITestService و یک نمونه پیاده سازی آنرا به این پروژه اضافه میکنیم تا در ادامه بتوانیم تنظیمات تزریق وابستگیهای آنرا در یک پروژهی کنسول، ایجاد کنیم:
در اینجا این سرویس نمونه نیز دارای یک وابستگی تزریق شدهی در سازندهی آن است. این وابستگی، همان امکانات توکار logging مربوط به ASP.NET Core است که در برنامههای کنسول نیز قابل استفاده است. برای اینکه پروژه قابل کامپایل باشد، نیاز است وابستگی Microsoft.Extensions.Logging را نیز به آن افزود:
دسترسی به سرویس TestService از طریق تزریق وابستگیها در یک برنامهی کنسول
در ادامه، یک پوشهی جدید را به نام CoreIocSample01 ایجاد کرده و دستور dotnet new console را در آن اجرا میکنیم تا یک برنامهی کنسول جدید را ایجاد کند.
سپس اولین قدم برای استفادهی از سرویس TestService از طریق تزریق وابستگیها، افزودن وابستگیهای مورد نیاز آن است:
در اینجا بستهی Microsoft.Extensions.DependencyInjection جهت دسترسی به امکانات تزریق وابستگیهای NET Core. به پروژه اضافه شده و همچنین ارجاعی نیز به پروژهی class library که پیشتر ایجاد کردیم، افزوده شدهاست.
اکنون میتوانیم همان روشی را که در یک برنامهی ASP.NET Core با ارائهی متد ConfigureServices به صورت از پیش آماده شده برای ما مهیا است، در اینجا نیز پیاده سازی کنیم:
کار با تعریف یک ServiceCollection جدید شروع میشود. سپس در متد ConfigureServices، همانند کاری که در برنامههای ASP.NET Core انجام میدهیم، ارتباطات اینترفیسها و پیاده سازیهای آنها، به همراه طول عمر آنها را تعریف میکنیم.
سپس نیاز است بر روی این ServiceCollection، متد BuildServiceProvider فراخوانی شود تا بتوانیم به IServiceProvider دسترسی پیدا کنیم. به آن Dependency Management Container نیز میگویند. این Container است که امکان دسترسی به وهلهای از ITestService و سپس فراخوانی متد Run آنرا میسر میکند.
مشکل! برنامهی کنسول اجرا نمیشود!
اگر سعی کنیم مثال فوق را اجرا کنیم، با استثنای زیر برنامه خاتمه مییابد:
عنوان میکند که وابستگی تزریق شدهی در سازندهی کلاس TestService را نمیتواند پیدا کند. علت اینجا است که هرچند ILogger را به سازندهی کلاس سرویس خود اضافه کردهایم، اما هنوز پیاده سازی کنندهی آنرا مشخص نکردهایم. به همین جهت امکان وهله سازی از این کلاس وجود ندارد. عموما در برنامههای ASP.NET Core نیازی به تنظیم زیر ساخت logging آن نیست؛ چون این مورد نیز به صورت پیشفرض انجام شدهاست. اما در اینجا خیر. به همین جهت دو وابستگی جدید Microsoft.Extensions.Logging.Console و Microsoft.Extensions.Logging.Debug را به پروژهی کنسول اضافه میکنیم:
پس از آن متد ConfigureServices ما جهت تعریف logging در دو حالت دیباگ و کنسول، به صورت زیر تغییر میکند:
اکنون اگر برنامه را اجرا کنیم، خروجی زیر قابل مشاهده خواهد بود:
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید: CoreDependencyInjectionSamples-01.zip
در ادامه در طی چند مطلب میخواهیم نکات و سناریوهای تکمیلی مرتبط با امکانات تزریق وابستگیهای توکار برنامههای مبتنی بر NET Core. را بررسی کنیم.
تزریق وابستگیها در برنامههای کنسول مبتنی بر NET Core.
تزریق وابستگیها، یکی از پرکاربردترین الگوهای طراحی برنامههای مدرن است. در نگارشهای قبلی ASP.NET، به کمک DependencyResolver آن، کتابخانههای ثالث کمکی تزریق وابستگیها میتوانستند خودشان را به سیستم متصل کنند. اینبار ASP.NET Core به همراه IoC Container توکار خودش ارائه شدهاست که این کتابخانه، در خارج از آن، مانند برنامههای کنسول نیز قابل استفاده است.
سرویس نمونهای برای تزریق آن در یک برنامهی کنسول NET Core.
در پوشهی جدید CoreIocServices، دستور dotnet new classlib را صادر میکنیم تا یک پروژهی class library جدید را ایجاد کند. سپس اینترفیس ITestService و یک نمونه پیاده سازی آنرا به این پروژه اضافه میکنیم تا در ادامه بتوانیم تنظیمات تزریق وابستگیهای آنرا در یک پروژهی کنسول، ایجاد کنیم:
using System; using Microsoft.Extensions.Logging; namespace CoreIocServices { public interface ITestService { void Run(); } public class TestService : ITestService { private readonly ILogger<TestService> _logger; public TestService(ILogger<TestService> logger) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public void Run() { _logger.LogWarning("A Warning from the TestService!"); } } }
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" /> </ItemGroup> </Project>
دسترسی به سرویس TestService از طریق تزریق وابستگیها در یک برنامهی کنسول
در ادامه، یک پوشهی جدید را به نام CoreIocSample01 ایجاد کرده و دستور dotnet new console را در آن اجرا میکنیم تا یک برنامهی کنسول جدید را ایجاد کند.
سپس اولین قدم برای استفادهی از سرویس TestService از طریق تزریق وابستگیها، افزودن وابستگیهای مورد نیاز آن است:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\CoreIocServices\CoreIocServices.csproj" /> </ItemGroup> </Project>
اکنون میتوانیم همان روشی را که در یک برنامهی ASP.NET Core با ارائهی متد ConfigureServices به صورت از پیش آماده شده برای ما مهیا است، در اینجا نیز پیاده سازی کنیم:
using CoreIocServices; using Microsoft.Extensions.DependencyInjection; namespace CoreIocSample01 { class Program { static void Main(string[] args) { var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); var serviceProvider = serviceCollection.BuildServiceProvider(); var testService = serviceProvider.GetService<ITestService>(); testService.Run(); } private static void ConfigureServices(IServiceCollection services) { services.AddTransient<ITestService, TestService>(); } } }
سپس نیاز است بر روی این ServiceCollection، متد BuildServiceProvider فراخوانی شود تا بتوانیم به IServiceProvider دسترسی پیدا کنیم. به آن Dependency Management Container نیز میگویند. این Container است که امکان دسترسی به وهلهای از ITestService و سپس فراخوانی متد Run آنرا میسر میکند.
مشکل! برنامهی کنسول اجرا نمیشود!
اگر سعی کنیم مثال فوق را اجرا کنیم، با استثنای زیر برنامه خاتمه مییابد:
Exception has occurred: CLR/System.InvalidOperationException An unhandled exception of type 'System.InvalidOperationException' occurred in Microsoft.Extensions.DependencyInjection.dll: 'Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger`1[CoreIocServices.TestService]' while attempting to activate 'CoreIocServices.TestService'.'
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\CoreIocServices\CoreIocServices.csproj" /> </ItemGroup> </Project>
private static void ConfigureServices(IServiceCollection services) { services.AddLogging(configure => configure.AddConsole().AddDebug()); services.AddTransient<ITestService, TestService>(); }
CoreIocServices.TestService:Warning: A Warning from the TestService!
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید: CoreDependencyInjectionSamples-01.zip
نگارش پایدار NET Core 1.1. روز قبل منتشر شد. در ادامه نحوهی ارتقاء پروژههای نگارش 1.0 RTM را به این نگارش بررسی خواهیم کرد.
دریافت نصاب NET Core 1.1.
برای این منظور به آدرس https://www.microsoft.com/net/download/core مراجعه کرده و فایل NET Core 1.1 SDK - Installer. را دریافت و نصب کنید. برای ظاهر شدن این گزینه باید حالت Current را بجای LTS (Long Term Support) انتخاب کرد:
همچنین در اینجا بسته NET Core 1.1 runtime - Installer. را هم جداگانه میتوان دریافت و نصب کرد.
به روز رسانی فایلهای global.json پروژهها
اولین کاری را که باید پس از نصب نگارشهای جدید NET Core. انجام داد، به روز رسانی شماره نگارش SDK درج شدهی در فایلهای global.json تمام پروژههای موجود است. در غیراینصورت NuGet بستههای جدید مرتبط با آنها را دریافت نخواهد کرد و آنها را در لیست به روز شدهها نخواهید یافت.
برای این منظور خط فرمان را گشوده و دستور ذیل را صادر کنید:
خروجی آن عبارتی است که باید قسمت نگارش SDK درج شود:
اصلاح فایل project.json پس از به روز رسانی فایل global.json
در ادامه باید فایل project.json نیز اندکی ویرایش شود تا شماره platform جدید را نیز درج کند. همچنین محل قرارگیری یکسری از بستهها نیز باید تغییر کنند. در غیر اینصورت با اولین کامپایل Solution چنین خطاهایی را دریافت خواهید کرد:
برای رفع این مشکل، عبارت netcoreapp را در Solution جاری جستجو کرده و آنها را به نحو ذیل تغییر دهید:
یک نکته: اگر هنوز Microsoft.NETCore.App را در لیست dependencies ابتدای فایل project.json دارید، آنرا حذف کنید؛ چون در قسمت frameworks فوق درج شدهاست. در غیراینصورت پیام تکراری بودن این کلید را دریافت خواهید کرد.
پس از طی دو مرحلهی فوق، یکبار پروژه را بسته و مجددا باز کنید.
به روز رسانی بستههای نیوگت پایدار
قبل از هر کاری مطمئن شوید که آخرین بستهی خود NuGet را نیز نصب کردهاید (مهم). به روز رسانیهای اخیر آن بیشتر در جهت سازگاری با پروژههای NET Core. است.
https://dist.nuget.org/index.html
در ادامه برای به روز رسانی بستههای نیوگت، میتوان بر روی گره References کلیک راست کرد و سپس انتخاب گزینهی Manage NuGet Packages و در آخر انتخاب برگهی Updates و انتخاب کتابخانههای به روز شده. این روش برای حالت داشتن چندین پروژه در یک Solution اندکی کند است.
روش سریعتر که تمام پروژهها را نیز به صورت خودکار بررسی و به روز میکند، مراجعه به کنسول پاورشل نیوگت و سپس صدور دستور ذیل است:
اگر در میان کار خطایی را دریافت کردید، این دستور را مجددا اجرا کنید (جهت اطمینان حداقل دوبار این دستور را صادر کنید).
به علاوه پس از پایان کار، یکبار به طور کامل ویژوال استودیو را بسته و مجددا باز کنید. سپس این دستور را یکبار دیگر هم صادر کنید.
به روز رسانی بستههای نیوگت آزمایشی
یکسری از بستهها مانند Microsoft.AspNetCore.Razor.Tools تنها با انتخاب حالت include prereleases ظاهر میشوند که آنها را نیز باید به روز کرد:
تغییر مهم ابزارهای EF Core
در کل Solution عبارت Microsoft.EntityFrameworkCore.Tools را جستجو کرده و با نام جدید Microsoft.EntityFrameworkCore.Tools.DotNet جایگزین کنید.
در آخر یک نمونه فایل project.json به روز شدهی یک برنامهی ASP.NET Core 1.1 را در ذیل مشاهده میکنید:
به روز رسانی پروژهی Test
اگر از MSTest برای انجام آزمونهای واحد استفاده میکنید، تغییرات فایل project.json آن نیز شامل تغییر شماره نگارش NETStandard.Library به 1.6.1 است و همچنین خود بستههای mstest نیز به روز شدهاند. به علاوه قسمت frameworks آن نیز باید همانند مطالبی که عنوان شد، به روز شود:
دریافت نصاب NET Core 1.1.
برای این منظور به آدرس https://www.microsoft.com/net/download/core مراجعه کرده و فایل NET Core 1.1 SDK - Installer. را دریافت و نصب کنید. برای ظاهر شدن این گزینه باید حالت Current را بجای LTS (Long Term Support) انتخاب کرد:
همچنین در اینجا بسته NET Core 1.1 runtime - Installer. را هم جداگانه میتوان دریافت و نصب کرد.
به روز رسانی فایلهای global.json پروژهها
اولین کاری را که باید پس از نصب نگارشهای جدید NET Core. انجام داد، به روز رسانی شماره نگارش SDK درج شدهی در فایلهای global.json تمام پروژههای موجود است. در غیراینصورت NuGet بستههای جدید مرتبط با آنها را دریافت نخواهد کرد و آنها را در لیست به روز شدهها نخواهید یافت.
برای این منظور خط فرمان را گشوده و دستور ذیل را صادر کنید:
C:\>dotnet --version 1.0.0-preview2-1-003177
{ "projects": [ "src", "test" ], "sdk": { "version": "1.0.0-preview2-1-003177" } }
اصلاح فایل project.json پس از به روز رسانی فایل global.json
در ادامه باید فایل project.json نیز اندکی ویرایش شود تا شماره platform جدید را نیز درج کند. همچنین محل قرارگیری یکسری از بستهها نیز باید تغییر کنند. در غیر اینصورت با اولین کامپایل Solution چنین خطاهایی را دریافت خواهید کرد:
Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section.
"frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } },
یک نکته: اگر هنوز Microsoft.NETCore.App را در لیست dependencies ابتدای فایل project.json دارید، آنرا حذف کنید؛ چون در قسمت frameworks فوق درج شدهاست. در غیراینصورت پیام تکراری بودن این کلید را دریافت خواهید کرد.
پس از طی دو مرحلهی فوق، یکبار پروژه را بسته و مجددا باز کنید.
به روز رسانی بستههای نیوگت پایدار
قبل از هر کاری مطمئن شوید که آخرین بستهی خود NuGet را نیز نصب کردهاید (مهم). به روز رسانیهای اخیر آن بیشتر در جهت سازگاری با پروژههای NET Core. است.
https://dist.nuget.org/index.html
در ادامه برای به روز رسانی بستههای نیوگت، میتوان بر روی گره References کلیک راست کرد و سپس انتخاب گزینهی Manage NuGet Packages و در آخر انتخاب برگهی Updates و انتخاب کتابخانههای به روز شده. این روش برای حالت داشتن چندین پروژه در یک Solution اندکی کند است.
روش سریعتر که تمام پروژهها را نیز به صورت خودکار بررسی و به روز میکند، مراجعه به کنسول پاورشل نیوگت و سپس صدور دستور ذیل است:
PM> Update-Package
به علاوه پس از پایان کار، یکبار به طور کامل ویژوال استودیو را بسته و مجددا باز کنید. سپس این دستور را یکبار دیگر هم صادر کنید.
به روز رسانی بستههای نیوگت آزمایشی
یکسری از بستهها مانند Microsoft.AspNetCore.Razor.Tools تنها با انتخاب حالت include prereleases ظاهر میشوند که آنها را نیز باید به روز کرد:
تغییر مهم ابزارهای EF Core
در کل Solution عبارت Microsoft.EntityFrameworkCore.Tools را جستجو کرده و با نام جدید Microsoft.EntityFrameworkCore.Tools.DotNet جایگزین کنید.
در آخر یک نمونه فایل project.json به روز شدهی یک برنامهی ASP.NET Core 1.1 را در ذیل مشاهده میکنید:
{ "dependencies": { "Microsoft.AspNetCore.Diagnostics": "1.1.0", "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.1.0", "Microsoft.AspNetCore.Http.Extensions": "1.1.0", "Microsoft.AspNetCore.Mvc": "1.1.0", "Microsoft.AspNetCore.Mvc.Core": "1.1.0", "Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0", "Microsoft.AspNetCore.Razor.Runtime": "1.1.0", "Microsoft.AspNetCore.Razor.Tools": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0", "Microsoft.AspNetCore.Server.Kestrel": "1.1.0", "Microsoft.AspNetCore.Session": "1.1.0", "Microsoft.AspNetCore.SpaServices": "1.0.0-beta-000019", "Microsoft.AspNetCore.StaticFiles": "1.1.0", "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.InMemory": "1.1.0", "Microsoft.EntityFrameworkCore.Tools.DotNet": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.Extensions.Configuration.Binder": "1.1.0", "Microsoft.Extensions.Configuration.Json": "1.1.0", "Microsoft.Extensions.Logging.Console": "1.1.0", "Microsoft.Extensions.Logging.Debug": "1.1.0", "Microsoft.VisualStudio.Web.CodeGeneration.Tools": { "version": "1.1.0-preview4-final", "type": "build" }, "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": { "version": "1.1.0-preview4-final", "type": "build" } }, "tools": { "BundlerMinifier.Core": "2.2.301", "Microsoft.AspNetCore.Razor.Tools": "1.1.0-preview4-final", "Microsoft.VisualStudio.Web.CodeGeneration.Tools": { "version": "1.1.0-preview4-final", "imports": [ "portable-net45+win8" ] }, "Microsoft.EntityFrameworkCore.Tools.DotNet": { "version": "1.1.0-preview4-final", "imports": [ "portable-net45+win8" ] }, "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final" }, "frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } }, "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true }, "runtimeOptions": { "configProperties": { "System.GC.Server": true } }, "publishOptions": { "include": [ "wwwroot", "Features", "appsettings.json", "web.config" ] }, "configurations": { "Release": { "buildOptions": { "optimize": true, "platform": "anycpu" } } }, "scripts": { "precompile": [ "dotnet bundle" ], "prepublish": [ //"bower install" ], "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] } }
به روز رسانی پروژهی Test
اگر از MSTest برای انجام آزمونهای واحد استفاده میکنید، تغییرات فایل project.json آن نیز شامل تغییر شماره نگارش NETStandard.Library به 1.6.1 است و همچنین خود بستههای mstest نیز به روز شدهاند. به علاوه قسمت frameworks آن نیز باید همانند مطالبی که عنوان شد، به روز شود:
{ "version": "1.0.0-*", "testRunner": "mstest", "dependencies": { "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.InMemory": "1.1.0", "NETStandard.Library": "1.6.1", "dotnet-test-mstest": "1.1.2-preview", "MSTest.TestFramework": "1.0.6-preview" }, "frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" } }, "imports": [ "dnxcore50", "portable-net45+win8" ] } } }
اشتراکها
پروژه Lynicon CMS
+ متد ApplyCorrectYeKe کتابخانهی « DNTPersianUtils.Core » فراتر است از روشهای متداول موجود.