Giter Club home page Giter Club logo

dotnetzoom / aspnetcore-webapi-course Goto Github PK

View Code? Open in Web Editor NEW
793.0 23.0 141.0 927 KB

🥇 Professional REST API design with ASP.NET Core WebAPI

Home Page: http://beyamooz.com/project-based-aspnet/%D8%AF%D9%88%D8%B1%D9%87-api-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D8%B5%D9%88%D9%84%DB%8C-%D9%88-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%D8%AF%D8%B1-asp-net-core

C# 95.85% TSQL 4.15%
aspnet-core webapi ef-core jwt jwt-authentication jwt-encryption identity elmah nlog autofac

aspnetcore-webapi-course's Introduction

🥇Professional REST API design with ASP.NET Core WebAPI

This project is an example of lightweight and extensible infrastructure for building RESTful Web API with ASP.NET Core.

This example contains a number of tricks and techniques that is the result of many years of my experience in WebAPI/RESTful programming in ASP.NET Core

If you want a total deep dive on REST, API security, ASP.NET Core and much more, check out my Course.

Testing it out

  1. Clone or download this repository
  2. Build the solution using command line with dotnet build
  3. Go to MyApi directory and run project using command line with dotnet run
  4. Browse to this url https://localhost:5001/swagger to see SwaggerUI page

Techniques and Features

  • JWT Authentication
  • Secure JWT using Encryption (JWE)
  • Logging to File, Console and Database using Elmah & NLog
  • Logging to sentry.io (Log Management System)
  • Exception Handling using Custom Middleware
  • Automatic Validation
  • Standard API Resulting
  • Dependency Injection using Autofac (Ioc Container)
  • Map resources using AutoMapper
  • Async/Await Best Practices
  • Versioning Management
  • Using Swagger (Swashbuckle)
  • Auto Document Generator for Swagger
  • Integrate Swagger and Versioning
  • Integrate Swagger and JWT/OAuth Authentication
  • Best Practices for Performance and Security

Give a Star! ⭐️

If you like this project, learn something or you are using it in your applications, please give it a star. Thanks!


🥇پروژه دوره API نویسی اصولی و حرفه ای در ASP.NET Core

در این دوره همه نکات مهم و پرکاربرد در API نویسی اصولی و حرفه ای در ASP.NET Core بررسی شده اند.

در این دوره سعی شده بهترین و محبوب ترین تکنولوژی ها، کتابخانه ها و ابزار ها داخل پروژه استفاده بشه. همچنین Best Practice های پرفرمنسی و امنیتی بعلاوه تکنیک های پرکاربرد را بررسی و در قالب یک معماری حرفه ای و اصولی استفاده می کنیم.

توجه:

  • برنچ master این مخزن همواره به آخرین نسخه ASP.NET Core (به همراه تمام Dependency هایش) بروز رسانی شده و خواهد شد (در حال حاضر ASP.NET Core 6.0 می باشد)
  • جهت دسترسی به کد اولیه پروژه که با ASP.NET Core 2.1 در هنگام تهیه دوره نوشته بود به این برنچ مراجعه کنید
  • جهت دسترسی به کد پروژه در ورژن ASP.NET Core 3.1 به این برنچ مراجعه کنید
  • جهت دسترسی به کد پروژه در ورژن ASP.NET Core 5.0 به این برنچ مراجعه کنید
  • همچنین جهت اطلاعات بیشتر از تغییرات که به هنگام Upgrade پروژه از نسخه 2.1 به 3.1 انجام شد، میتونین به قسمت ChangeLog مراجعه کنید

تکنولوژی، ابزار ها و قابلیت ها

  • لایه بندی اصولی پروژه (Project Layering and Architecture) : در این دوره لایه بندی اصولی یک پروژه را از ابتدا شروع و هر بخش را بررسی می کنیم. همچنین مباحث Repository و UOW رو هم بررسی می کنیم.
  • احراز هویت (Authentication)
    • ASP.NET Core Identity : احراز هویت توسط Identity + سفارشی سازی
    • (Json Web Token) JWT : احراز هویت توسط Jwt + یکپارچه سازی آن با Identity
    • (Json Web Encryption) JWE : ایمن سازی توکن ها بوسیله رمزنگاری توکن (JWE)
    • Security Stamp : جلوگیری از اعتبارسنجی توکن به هنگام تغییر دسترسی های کاربر جهت امنیت بیشتر
    • Claims : کار با Claim ها و تولید خودکار آنها توسط ClaimsFactory
  • Logging (ثبت خطا ها)
    • Elmah : استفاده از Elmah برای لاگ خطا ها در Memory, XML File و Database
    • NLog : استفاده از NLog برای لاگ خطا ها در File و Console
    • Custom Middleware : نوشتن یک میدلویر سفارشی جهت لاگ تمامی خطا (Exception) ها
    • Custom Exception : نوشتن Exception برای مدیریت ساده تر خطا ها
    • Sentry : ثبت خطا ها در سیستم مدیریت لاگ sentry.io (مناسب برای پروژه های بزرگ)
  • تزریق وابستگی (Dependency Injection)
    • ASP.NET Core IOC Container : استفاده از Ioc container داخلی Asp Core
    • Autofac : استفاده از محبوب ترین کتابخانه Autofac (Ioc Container)
    • Auto Registeration : ثبت خودکار سرویس ها توسط یک تکنیک خلاقانه با کمک Autofac
  • ارتباط با دیتابیس (Data Access)
    • Entity Framework Core : استفاده از EF Core
    • Auto Entity Registration : ثبت Entity های DbContext به صورت خودکار توسط Reflection
    • Pluralizing Table Name : جمع بندی نام جداول EF Core به صورت خودکار توسط کتابخانه Pluralize.NET و Reflection
    • Automatic Configuration : اعمال کانفیگ های EntityTypeConfiguration (FluentApi) به صورت خودکار توسط Reflection
    • Sequential Guid : بهینه سازی مقدار دهی identity برای Guid به صورت خودکار توسط Reflection
    • Repository : توضیحاتی در مورد معماری اصولی Repository در EF Core
    • Data Intitializer : یک معماری اصولی برای Seed کردن مقادیر اولیه به Database
    • Auto Migrate : آپدیت Database به آخرین Migration به صورت خودکار
    • Clean String : اصلاح و یک دست سازی حروف "ی" و "ک" عربی به فارسی و encoding اعداد فارسی در DbContext به صورت خودکار به هنگام SaveChanges
  • Versioning : نسخه بندی و مدیریت نسخه های پروژه + سفارشی سازی و ایجاد یک معماری حرفه ای
  • ابزار (Swashbuckle) Swagger
    • Swagger UI : ساخت یک ظاهر شکیل به همراه داکیومنت Aciton ها و Controller های پروژه و امکان تست API ها توسط Swagger UI
    • Versioning : یکپارچه سازی اصولی Swagger با سیستم نسخه گذاری (Versioning)
    • JWT Authentication : یکپارچه سازی Swagger با سیستم احراز هویت بر اساس Jwt
    • OAuth Authentication : یکپارچه سازی Swagger با سیستم احراز هویت بر اساس OAuth
    • Auto Summary Document Generation : تولید خودکار داکیومنت (توضیحات) برای API های پروژه
    • Advanced Customization : سفارشی سازی های پیشرفته در Swagger
  • دیگر قابلیت ها
    • API Standard Resulting : استاندارد سازی و یک دست سازی خروجی API ها توسط ActionFilter
    • Automatic Model Validation : اعتبار سنجی خودکار
    • AutoMapper : جهت Mapping اشیاء توسط کتابخانه محبوب AutoMapper
    • Auto Mapping : سفارشی سازی وایجاد یک معماری حرفه ای برای Mapping اشیا توسط Reflection
    • Generic Controller : ساخت کنترلر برای عملیات CRUD بدون کد نویسی توسط ارث بری از CrudController
    • Site Setting : مدیریت تنظیمات پروژ توسط Configuration و ISnapshotOptions
    • Postman : آشنایی و کار با Postman جهت تست API ها
    • Minimal Mvc : حذف سرویس های اضافه MVC برای افزایش پرفرمنس در API نویسی
    • Best Practices : اعمال Best Practices ها جهت بهینه سازی، افزایش پرفرمنس و کدنویسی تمیز و اصولی
    • و چندین نکته مفید دیگر ...

مزیت اصلی این دوره؟

به جای اینکه ماه ها وقت صرف کنین تحقیق کنین، مطالعه کنین و موارد کاربردی و مهم API نویسی رو یاد بگیرین توی این دوره همشو یک جا و سریع یاد میگیرین و تو وقتتون صرفه جویی میشه. همچنین یک پله هم به Senior Developer شدن نزدیک میشین ;)

دانلود ویدئو های آموزشی دوره

این دوره در قالب (در مجموع) 22 ساعت آموزش ویدئویی توسط محمد جواد ابراهیمی (mjebrahimi) تدریس شده است.

لینک دانلود : خرید از سایت بیاموز (کد تخفیف 20 درصدی : DotNetZoom)

پیش نیاز این دوره :

سطح دوره پیشرفته بوده و برای افراد مبتدی مناسب نیست.

این دوره، آموزش ASP.NET Core نیست و زیاد روی مباحثش عمیق نمیشیم و فقط به مباحثی می پردازیم که مرتبط با API نویسی توی ASP.NET Core هستش.

انتظار میره برای شروع این دوره پیش نیاز های زیر رو داشته باشین :

  1. تسلط نسبی بر روی زبان سی شارپ
  2. آشنایی با پروتکل Http و REST
  3. آشنایی با Entity Framework (ترجیحا EF Core)
  4. آشنایی با ASP.NET MVC یا ASP.NET Core (و ترجیحا آشنایی با WebAPI)

ارتباط با مدرس

جهت ارتباط با مدرس و ارائه هرگونه پیشنهاد، انتقاد، نظر و سوالاتتون میتونین با اکانت تلگرام محمد جواد ابراهیمی در ارتباط باشین mjebrahimi@

حمایت از ما

⭐️در پایان اگه واقعا از دوره خوشتون اومده بود حتما بهش Star بدین . با اینکار حمایت خودتون رو از ما اعلام میکنین🙏 و این به ما انگیزه میده آموزش های بیشتری تهیه کنیم✌

aspnetcore-webapi-course's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar mjebrahimi avatar rezakargar avatar seyedmhm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aspnetcore-webapi-course's Issues

cannot be tracked... error for update entity with collection navigation property

for example if your entity has property same as
public ICollection<DiseaseAttachment> Attachments { get; set; }
in update method in your controller you must load it by using LoadCollectionAsync
in my usecase :
var model = await Repository.GetByIdAsync(cancellationToken, dto.Id); await Repository.LoadCollectionAsync(model, x => x.Attachments, cancellationToken);
but problem is here that exception occurred
`
model = dto.ToEntity(Mapper, model);

        await Repository.UpdateAsync(model, cancellationToken);

`

exception is this :

System.InvalidOperationException : The instance of entity type 'DiseaseAttachment
' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attac
hing existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbC
ontextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values

Dto in ServiceLayer

سلام . تشکر از اموزش خوبتون. چرا ما نمیتونیم توی لایه سرویس از ویومدل هایی که در لایه api ساختیم استفاده کنیم؟
مگر لایه سرویس نمیتونه ویو مدل بگیره؟

bug

با سلام خدمت شما
مودل یوزر نمیتونه از
ientity
ارث بری کنه . چون یوزر از
identity
ارث بری کرده و
Id
دارد. برای همین اگر بخواهیم یوزر را به سایر جداول ریلیشن بزنیم در هنگام عملیات کراد ممکن از با خطا مواجه شود.

از کار افتادن توکن با رفرش

با سلام خدمت آقای ابراهیمی عزیز
من مشکلی که با این برنامه دارم اینکه که تازمانی که سایت رفرش نشود و مدت زمان توکن انقضا نشود توکن به دستی کار میکند. اما حتی زمانی که زمان انقضا هم تمام نشده و سایت را رفرش کنیم مجدد نیاز به لاگین هست. چطور میشود این مشکل را حل کرد؟

Add OData

Add OData functionality to project, which is useful for querying data

TableNotracking vs Entity or Table

سلام و وقت بخیر.
لطفا تفاوت بین TableNotracking vs Entity or Table در ریپازیتوری را در صورت امکان توضیح دهید. با تشکر

اشتراک گذاری منبع

سلام عرض خسته نباشید من یه فریم ورک ایرانی دیدم که واقعا توی فریم ورک ها خیلی تمیز بود مثلا برای عملیات کراد دیگه نیاز نبود بهش بگی مپ را
انجام بده و خودش توی لایه ریپوزیتوری این کار را انجام میداد و یه سری قابلیت دیگه گفتم یاهاتون به اشتراک بذارم تاشاید به درد بخوره و ماهایی که علممون کلمتره بتونیم توی اپدیت پکیج هاتون این هارا یاد بگیریم
https://auaframework.com/Website/DownloadBasicPackage

اضافه کردن GetFirstAsync

سلام
من در IRepository
ValueTask<TEntity> GetFirstAsync(CancellationToken cancellationToken);
و در Repository

public virtual ValueTask<TEntity> GetFirstAsync(CancellationToken cancellationToken) { return Entities.FirstOrDefaultAsync(cancellationToken); }
اضافه کردم

ولی به خط return Entities.FirstOrDefaultAsync(cancellationToken) خطا زیر را میده
cannot implicitly convert type system.threading.tasks.task<tentity?> to system.threading.tasks.task

داخل تیبل مورد نظر من کلا قراره یک ردیف داشته باشه.میخوام همون یک ردیف را نمایش بده

در صورت امکان راهنمایی بفرمائید.

Speed

استاد این فریم ورد جهت پروژه های بزرگ قابل استفاده است؟ به لحاظ سرعت . چون به علت جنریک بود ککنترل ها و سایر سرویس ها اینها باید در هر لحظه با توجه ده درخواست ایجاد شوند. که ممکن است باعت کندی سرعت شوند. ؟

Current User

با سلام . اگر بخواهیم در جدول هایی که به یوزر وصل هستند ای دی یوزر فعلی را قرار بدهیم از طریق همین جنریک ریپازیتوری . اگر امکانش هست توضیح دهید.
مثلا ایدی کسی که ویرایش یا جدید انجام داده در جدول مربوطه ذخیره کنیم.

ProjectTo

سلام توی تغییرات جدید
.ProjectTo(mapper.ConfigurationProvider)

این کار نمیکنه و ارور
InvalidOperationException: Missing map from Entities.User.User to Core.DTO.GetUserFromLoginDto. Create using CreateMap<User, GetUserFromLoginDto>.
را میده در صورتی که بقیه قسمت ها داره درست کار میکتنه چجوری میشه درستش کنم؟

public class GetUserFromLoginDto
{
public long Id { get; set; }
public string FullName { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
public string RoleTitle { get; set; }
public string RoleName { get; set; }
public bool IsActive { get; set; }
}

عدم پشتیبانی کانفیگ کننده اتوماتیک از کلید اصلی چند گانه

زمانی که جدولی مانند جداول واسطه از چند کلید اصلی استفاده میکنند از
پیش فرض نمیشه استفاده کرد چرا که بخش سوم صرفا یک کلید را قبول میکند BaseDto
و اجازه نمیدهد ما از کانفیگ خودکار اتومپر استفاده کنیم

public class StudentHomeWorks : IEntity
{
    public int StudentId { get; set; }
    public long HomeWorkId { get; set; }
    public StudentHomeWorkStatus Status { get; set; }
    public Student Student { get; set; }
    public HomeWork HomeWork { get; set; }
}

public class StudentHomeWorksConfiguration : IEntityTypeConfiguration<StudentHomeWorks>
{
    public void Configure(EntityTypeBuilder<StudentHomeWorks> builder)
    {
        builder.HasKey(s => new { s.StudentId, s.HomeWorkId });
        builder.HasIndex(c => c.StudentId);
        builder.HasIndex(c => c.HomeWorkId);
        #region Relations
        builder.HasOne(s => s.Student)
            .WithMany(s => s.HomeWorks)
            .HasForeignKey(s => s.StudentId);
        builder.HasOne(s => s.HomeWork)
            .WithMany(e => e.Students)
            .HasForeignKey(s => s.HomeWorkId);
        #endregion
    }
}

``

public abstract class BaseDto<TDto, TEntity, TKey> : IHaveCustomMapping
    where TDto : class, new()
    where TEntity : class, IEntity<TKey>, new()
{
    [Display(Name = "ردیف")]
    public TKey Id { get; set; }

    public TEntity ToEntity(IMapper mapper)
    {
        return mapper.Map<TEntity>(CastToDerivedClass(mapper, this));
    }

    public TEntity ToEntity(IMapper mapper, TEntity entity)
    {
        return mapper.Map(CastToDerivedClass(mapper, this), entity);
    }

    public static TDto FromEntity(IMapper mapper, TEntity model)
    {
        return mapper.Map<TDto>(model);
    }

    protected TDto CastToDerivedClass(IMapper mapper, BaseDto<TDto, TEntity, TKey> baseInstance)
    {
        return mapper.Map<TDto>(baseInstance);
    }

    public void CreateMappings(Profile profile)
    {
        var mappingExpression = profile.CreateMap<TDto, TEntity>();

        var dtoType = typeof(TDto);
        var entityType = typeof(TEntity);
        //Ignore any property of source (like Post.Author) that dose not contains in destination 
        foreach (var property in entityType.GetProperties())
        {
            if (dtoType.GetProperty(property.Name) == null)
                mappingExpression.ForMember(property.Name, opt => opt.Ignore());
        }

        CustomMappings(mappingExpression.ReverseMap());
    }

    public virtual void CustomMappings(IMappingExpression<TEntity, TDto> mapping)
    {
    }
}

و مساله اینجاست که زمانی که دی تی او رو میسازیم چگونه کانفیگ کینم

public class ViewAllQuestionOfStudentDto : BaseDto<ViewAllQuestionOfStudentDto, StudentHomeWorks, ???>

ارسال توکن

سلام ، در مورد اتصال از application asp.net به api و روش ارسال توکن jwt اگر امکان دارد یک توضیح بدهید

Refresh Token and Pagination

سلام
لذت بردم از کدتون لطفا در صورت امکان refresh token و همچنین pagination dynamic را هم داخل پروژه تون پیاده سازی کنید.
ممنون

Overrid crud

سلام و خسته نباشید.
یک سوال داشتم در مورد اینکه اگر در کنترلر های جنریک که از CrudController ارث بری کرده اند
یک متد را اوراید کنیم. و مثلا یک crate جدید بنویسیم
اما مابقی متد ها تغیر نکنند چه کار باید انجام داد؟
با تشکر از اموزش خوبتون

خطا در ModelBuilderExtensions - 'immutable entity type' does not contain a definition for 'relational'

error
سلام در پروژه ای که در آموزش ویدئویی تون توضیح دادین ، من به مشکل خوردم . در کلاس
ModelBuilderExtensions
با پیغام خطای بالا مواجه میشم که میگه باید از Relational ، Using کنم
منم پکیج زیر را نصب کردم ( دومین آیتم در تصویر زیر )
1
ولی باز همچنان مشکل وجود داره
2

میشه راهنمایی کنید ؟؟
ورژن .net core ام 2.1 هست

استفاده از لایه سرویس

سلام
من آموزش شما رو تهیه کردم و ازتون بابت این آموزش خوب و کارآمد تشکر میکنم

سوالی که داشتم اینکه در آموزش درخصوص لایه سرویس و معماری استفاده از اون صحبتی نشده

آیا دیگه نیازی به لایه سرویس نیست؟ و باید کدها رو داخل کنترلرها نوشت؟>

bug

سلام .
در صفحه سواگر با زدن دکمه
Authorize
و پر کردن فیلد ها این مقادیر به سمت کنترلر فرستاده نمیشود. و سوال دوم در مودال لاگین مقدار
grant_type
را نمیتوان وارد نمود. با تشکر

How Decrypt Jwt Token

hi,
i want to use this jwe Token in blazor,
how can decrypt token?
this is my parser
this line has exception

        var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);




   public static IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
    {
        var claims = new List<Claim>();
        var payload = jwt.Split('.')[1];
        var jsonBytes = ParseBase64WithoutPadding(payload);
        var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);
        claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString())));
        return claims;
    }

    private static byte[] ParseBase64WithoutPadding(string base64)
    {
        switch (base64.Length % 4)
        {
            case 2: base64 += "=="; break;
            case 3: base64 += "="; break;
        }
        return Convert.FromBase64String(base64);
    }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.