Elegant Global Error Handling Using Middleware In ASP.NET Core

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ก.ค. 2024
  • Get the source code for this video for FREE → the-dotnet-weekly.ck.page/err...
    ☄️ Master the Modular Monolith Architecture: bit.ly/3SXlzSt
    📌 Accelerate your Clean Architecture skills: bit.ly/3PupkOJ
    🚀 Support me on Patreon to access the source code: / milanjovanovic
    Error handling in APIs is very important. In ASP.NET Core, it is very simple to add global error handling using middleware. In this video, I'll show you how to create a global error handling middleware and it to our Web API.
    Join my weekly .NET newsletter:
    www.milanjovanovic.tech
    3 Ways To Create Middleware In ASP .NET Core
    www.milanjovanovic.tech/blog/...
    Subscribe for more:
    th-cam.com/users/MilanJovano...
    Chapters
    0:00 What is middleware?
    1:20 First approach: With RequestDelegate
    3:34 Manipulating the HTTP Response
    4:14 Second approach: Convention based
    6:55 Configuring the middleware
    8:15 Third approach: Factory based
    10:00 Improving the global error handler
    11:38 Configuring factory-based middleware
    12:26 How it works
  • วิทยาศาสตร์และเทคโนโลยี

ความคิดเห็น • 210

  • @MilanJovanovicTech
    @MilanJovanovicTech  ปีที่แล้ว +11

    Get the source code for this video for FREE → the-dotnet-weekly.ck.page/error-handling
    Want to master Clean Architecture? Go here: bit.ly/3PupkOJ
    Want to unlock Modular Monoliths? Go here: bit.ly/3SXlzSt

  • @Uncle-Dee
    @Uncle-Dee 4 หลายเดือนก่อน +1

    Thank you Milan...
    This was a very clear and beautiful explanation.

  • @sagarchowdhury2493
    @sagarchowdhury2493 ปีที่แล้ว +4

    Hi Milan, this is a great tutorial for handling error globally. Of course, I would love to know some more complex functionality which we can make place inside some other subsequent middleware to make our code better.

  • @lazziemunetsi1498
    @lazziemunetsi1498 8 หลายเดือนก่อน +1

    Great stuff, thanks very much Milan.👏

  • @samehkeshta89
    @samehkeshta89 ปีที่แล้ว +1

    Great tutorial, thanks Milan.

  • @88spaces
    @88spaces 4 หลายเดือนก่อน

    Thank you, Milan. I'm using your example in a new project. It's already helpful.

  • @DarshanaHashendra
    @DarshanaHashendra ปีที่แล้ว +1

    Great stuff. keep up the good work.

  • @mesutdemirci7933
    @mesutdemirci7933 ปีที่แล้ว +1

    Great tutorial Milan.thanks

  • @James66662
    @James66662 3 หลายเดือนก่อน +1

    You make concepts very easy

  • @nikuniku1235
    @nikuniku1235 3 หลายเดือนก่อน +1

    how simple and efficient, really good job.

  • @abdelrahmananwar885
    @abdelrahmananwar885 9 หลายเดือนก่อน

    i liked your way of explanation, thank you.

  • @YaSiRaRaFaTdoTNet
    @YaSiRaRaFaTdoTNet ปีที่แล้ว

    The 3rd option was new learning for me and enjoyed the custom JSON response throwing most! Thanks, ​ @Milan Jovanović for your community effort!

  • @Nicetrycutiepie
    @Nicetrycutiepie ปีที่แล้ว +1

    Thank you, Very useful, i learned lot from this.

  • @Valoo24
    @Valoo24 9 หลายเดือนก่อน +1

    Great Tutorial ! Thanks :)

  • @tayyabshaikh3286
    @tayyabshaikh3286 5 หลายเดือนก่อน

    Awesome video, great explanation!!

  • @user-xs6xu8om1e
    @user-xs6xu8om1e ปีที่แล้ว +1

    excellent video Milan (y) Thanks

  • @kodindoyannick5328
    @kodindoyannick5328 4 หลายเดือนก่อน +1

    Great Great content! Thank you so much Milan.

  • @AtenaMohammadvandAzad
    @AtenaMohammadvandAzad 7 วันที่ผ่านมา

    Great Tutorial ! Thanks😍

  • @sajithsageer182
    @sajithsageer182 ปีที่แล้ว +1

    Nice one as usual😀

  • @pawegruba4719
    @pawegruba4719 ปีที่แล้ว +11

    I think it might be worth to mention something about Exception Filters, I know they are a bit different but in general are also used to handle exceptions

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +3

      I haven't used them in practice to be honest, Middleware is what I default to

    • @bloopers2967
      @bloopers2967 9 หลายเดือนก่อน +2

      ​@@MilanJovanovicTechI use exception filter all the time, you just have more content in the exception filter than exception middleware because they are called later after the pipelines

  • @AmirHashemZadeh
    @AmirHashemZadeh ปีที่แล้ว +1

    it was simple and awesome.

  • @maxiklife
    @maxiklife ปีที่แล้ว +1

    Awesome content

  • @user-bh2pm3fr4f
    @user-bh2pm3fr4f 10 หลายเดือนก่อน +1

    Thanks a lot 🎉

  • @upendrakumarpandey2838
    @upendrakumarpandey2838 3 หลายเดือนก่อน

    This is very good example of

  • @voltairend
    @voltairend 10 หลายเดือนก่อน +1

    Thank you

  • @krishanthadharmasiri5266
    @krishanthadharmasiri5266 ปีที่แล้ว +2

    Great video, thanks , is there any particular reason to add the middleware as Transient why not scoped?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      Scoped only makes sense if you need a scoped service inside

  • @musacj
    @musacj ปีที่แล้ว +2

    Great tutorial Milan.
    I wonder if it would make sense to have an error tracking id, like a GUID or any unique id. That is, to pass it to LogError and also on the to the Title or Detail property of ProblemDetails object.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +3

      We can add a middleware that sets a Request Id header for each request

    • @musacj
      @musacj ปีที่แล้ว

      @@MilanJovanovicTech thanks for the reply. I'll try that out

  • @AmjadKhateeb
    @AmjadKhateeb ปีที่แล้ว +2

    Thanks for the great video.
    I think using the status code again in the body of the response is unnecessary duplicate.
    I also prefer to add a RefID in the response body which is linked to the error log. So, in case that the client contacted the support team, they can easily find the original error log.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      It's not a unnecessary/duplicate. Why would the consumer of your API have to see the HTTP response code?
      We're giving them the ability to take a look at the response body, and have all of the relevant information.

    • @AmjadKhateeb
      @AmjadKhateeb ปีที่แล้ว +1

      ​@@MilanJovanovicTech There is an http status in the response header

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      @@AmjadKhateeb www.rfc-editor.org/rfc/rfc7807

    • @AmjadKhateeb
      @AmjadKhateeb ปีที่แล้ว +1

      ​@@MilanJovanovicTech Thanks. The explanation is very clear in the document. I didn't know that there is such a standard.

  • @surenrdashrestha2831
    @surenrdashrestha2831 ปีที่แล้ว

    Hey thanks for sharing this. I have one question. I am using global exception handler in my project but some scenario i need to keep going even if i have exception. For example i have Mongo Database and SQL Database, If mongo fails for some reason (wrong conn string) and It comes to exception however i dont want to send back 500 status code in response because i have SQL database to query and send back data to the client. Please advise.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      Well you need to handle this with some sort of decorator on your data access code

  • @FalcoSparverius
    @FalcoSparverius 8 หลายเดือนก่อน

    Hi! thanks for your videos, are amazing. I have a question, (im sorry if its a bad one, I am a begginer ) I could add some others Catchs with particular exceptions and handle them each one in a particular way, with differentes codes an differentes ProblemDetails, or thats not the use for this kind of middleware? thanks!

    • @MilanJovanovicTech
      @MilanJovanovicTech  8 หลายเดือนก่อน

      No bad question on this channel :)
      Yes, you can definitely do that. A global exception handler based on exception type. 👌

  • @zikkrype
    @zikkrype ปีที่แล้ว +2

    Like. Unless you need to have additional data from failed request middleware is a good option. In other cases consider exception filters.btw: may be a nice topic middleware vs filter

  • @Marcos-XurryPET
    @Marcos-XurryPET 5 หลายเดือนก่อน

    Nice work, Milan Jovanovic!!!
    How to use middelware to make filters, orderby and pagination???, Thank u.
    Regards.

  • @nebomusic2024
    @nebomusic2024 ปีที่แล้ว +2

    Great video Milan! Thank you for presenting these important topics.
    One observation: Instead of using two statements to write the json body in the response you could merge them in one statement.
    await context.Response.WriteAsJsonAsync(errorResponse);
    Also, why do you need to make the middleware a transient service? Can you please explain, I was sure this worked without needing to do this

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      With the IMiddleware approach you do. Otherwise it's fine.

  • @richardhaughton9633
    @richardhaughton9633 ปีที่แล้ว +3

    Hi Milan, Great Tutorial. Could you make a tutorial on how to handle Errors on the client side. For example for a http client who can have a T Resposne or a problemDetails. I struggle to find an elegant way to handle both type of response. And maybe also how to handle it in an MVC or even better a blazor app. Thanks!

    • @richardhaughton9633
      @richardhaughton9633 ปีที่แล้ว +2

      Also, why not return an application/json+problem as response content type?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +2

      - why not return an application/json+problem as response content type?
      I missed that, to be honest
      - And maybe also how to handle it in an MVC or even better a blazor app
      You need some way to create a hook when an error happens, and you need to make your error responses generic for the entire API to be able to do that. If you always return a ProblemDetails, on the API consumer side that becomes doable.

  • @adilbangush5014
    @adilbangush5014 ปีที่แล้ว +1

    Can you make one video about Extending ProblemDetails, using with the above global error handling in which a developer can include the custom payload of an error information.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      ProblemDetails already has an Errors property which is a dictionary, and you can extend it freely

  • @ssushovan
    @ssushovan ปีที่แล้ว +1

    Excellent video!
    But, could you tell what's the benefit of using 3rd approach here?

  • @sudhirkumar-wx8hn
    @sudhirkumar-wx8hn ปีที่แล้ว +1

    Awesome

  • @gabriel.andreato
    @gabriel.andreato 3 หลายเดือนก่อน

    Amazing

  • @mumk
    @mumk 2 หลายเดือนก่อน

    thx!

  • @CarrigansGuitarClub
    @CarrigansGuitarClub 4 วันที่ผ่านมา

    Excellent

  • @washingtonacero8375
    @washingtonacero8375 ปีที่แล้ว +1

    awesome

  • @nayanchoudhary4353
    @nayanchoudhary4353 ปีที่แล้ว +1

    @milan I wish you had explained the sequence of middlewares invocation; how order matters

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      Doesn't the visual explanation at the start illustrate the concept? 🤔

    • @nayanchoudhary4353
      @nayanchoudhary4353 ปีที่แล้ว

      @@MilanJovanovicTech Kind of. But what happens when I mix IMiddleware and non IMiddleware implementation?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      @@nayanchoudhary4353 Both approaches work, the order they are registered in is the order in which they execute

  • @coder3123
    @coder3123 5 หลายเดือนก่อน

    Hey, can you shed some light on use of AddTransient vs AddScoped in this case?

    • @MilanJovanovicTech
      @MilanJovanovicTech  5 หลายเดือนก่อน

      learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection#service-lifetimes

  • @shakib4845
    @shakib4845 ปีที่แล้ว

    nice video but just for very beginners! you could dig more into various ways of global error handling and come up with a nice fancy way dude :)

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +2

      Do we need anything more complicated than the basics?

  • @davidemmanuel3001
    @davidemmanuel3001 ปีที่แล้ว +1

    This is cool. Please can you drop the github public repo for your videos? It will really be helpful

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      I share the code with my Patreon supporters, but I'm sure you can dig up something similar on my github:
      github.com/m-jovanovic

  • @vicky2118
    @vicky2118 ปีที่แล้ว +1

    Great video
    One Question
    Why you registered GlobalExceptionHandlingMiddleware as Transient not Scoped?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      Since I don't inject any Scoped services, it can be Transient

  • @user-xm7sh3vw8o
    @user-xm7sh3vw8o 10 หลายเดือนก่อน +1

    ExceptionHandlingMiddleware switch need to add OrderNotFoundException, Write it every time?

    • @MilanJovanovicTech
      @MilanJovanovicTech  10 หลายเดือนก่อน

      You can create a base NotFoundException and catch that one

  • @nullentrophy
    @nullentrophy 2 หลายเดือนก่อน

    What do you think about Exception filter instead of middleware for error handling?

  • @francoislepron2301
    @francoislepron2301 ปีที่แล้ว +1

    Yes, I have learned something new, but I can not tell that I master it. Your audience is not only composed by experts, but also by intermediate developers. I would be really interested in more details explanations or links on the documentations where we can find what you don't explain, because you assume that developers already know these fundamental concepts. It is an hard work, but this is how Brackeys has reached more than one million of followers for Unity3D tutorials.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +6

      Hey Francois, I really appreciate the feedback.
      To be honest, intermediate-to-senior level engineers are my intended target audience at the moment. Until I can master the skill of being able to explain concepts in even simpler terms.
      For documentation links, that's a great suggestion. I'll try to improve on that front.

    • @francoislepron2301
      @francoislepron2301 ปีที่แล้ว

      @@MilanJovanovicTech Many thanks.

  • @manojkumar-gt6ng
    @manojkumar-gt6ng 6 หลายเดือนก่อน

    Can you provide a video on c# creating custom attributes for class, method and variable

  • @birukayalew3862
    @birukayalew3862 ปีที่แล้ว +1

    Hi Milan as Always this is helpful ... How can we ensure the exact status code and description for problem detail ?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      What do you mean by "exact"? Do you want the status code to be dynamic based on the exception?

    • @birukayalew3862
      @birukayalew3862 ปีที่แล้ว +1

      Yes i mean the status code

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      @@birukayalew3862 We have to catch the specific exception in the middleware, and set the appropriate status code

  • @ramonventoso
    @ramonventoso ปีที่แล้ว +1

    What about aspnetcore web apps. There's a if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    else
    {
    app.UseExceptionHandler("/Home/Error");
    app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
    } code to add. Do you have a video touching on this ? Thanks

  • @Zisane21
    @Zisane21 4 หลายเดือนก่อน

    Hi Milan, if you place the middleware AFTER UseAuthorization\UseAuthentication then it won't cacth exceptions thrown by an AuthHanlder class for example. Shouldn't it go before UseAuthorization\UseAuthentication ?

    • @MilanJovanovicTech
      @MilanJovanovicTech  4 หลายเดือนก่อน

      Yes

    • @Zisane21
      @Zisane21 3 หลายเดือนก่อน

      @@MilanJovanovicTech Why with the 3rd option did you register the ExceptionMiddleware with Transient scope? ChatGPT says it should be singleton 🙂

  • @namratamatkar7638
    @namratamatkar7638 ปีที่แล้ว +1

    System.InvalidOperationException: 'An error occurred when configuring the exception handler middleware.
    Either the 'ExceptionHandlingPath' or the
    'ExceptionHandler' property must be set in 'UseExceptionHandler()'. Alternatively, set one of the aforementioned properties in 'Startup.ConfigureServices' as follows..I am facing this issue

  • @filthkyory
    @filthkyory 3 หลายเดือนก่อน +1

    Milan... How to configure an inline watch in your visual studio, could you tell us?

    • @MilanJovanovicTech
      @MilanJovanovicTech  3 หลายเดือนก่อน

      ReSharper

    • @filthkyory
      @filthkyory 3 หลายเดือนก่อน

      @@MilanJovanovicTech thanks 🙏🏻👍🏻

  • @BiaoTV
    @BiaoTV ปีที่แล้ว +1

    Hi
    As a note, on the blog its missing the third option code.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      Isn't it this:
      www.milanjovanovic.tech/blog/3-ways-to-create-middleware-in-asp-net-core#adding-factory-based-middleware

  • @talwinter
    @talwinter ปีที่แล้ว +1

    I am trying to catch the Model Validation error where I get an 400 bad request when one of the fields have incorrect data like required validation or regex validation but I can't catch it a log it. I can use a middleware and get the request but the response returns as 200 status code and not 400 bad request so I can't differ between requests ... any ideas?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      Place your custom middleware at the top of the middleware chain, so any exception thrown is propagated to it.
      Secondly, are you sure Model Validation throws an exception at all?

    • @talwinter
      @talwinter ปีที่แล้ว

      @@MilanJovanovicTech well, in the middleware I just use next.invoke and then if I check the Context.Reaponse.Body, I get the 400 status code on the validation error which sets as bad request. The problem is that I need to open a new MemoryStream for every request and then check for the status code and that's a bad practice that can cause a huge memory leak. I didn't find anything more elegant.

  • @sabajangidze
    @sabajangidze ปีที่แล้ว

    Hello,1:18 three middleware is just an example or it is 3 middleware between request and respone?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      It's one middleware - implement in three different ways

    • @sabajangidze
      @sabajangidze ปีที่แล้ว

      @@MilanJovanovicTech thank for you answer

  • @MolotovClipes
    @MolotovClipes 10 หลายเดือนก่อน +1

    When i do return BadRequest this code dont catch... Is correctly ?

  • @hamlet.h.hakobyan
    @hamlet.h.hakobyan 11 หลายเดือนก่อน +1

    I think, if we will put this middleware at the start of the pipeline we can log unhandled exceptions from other middleware

  • @GarethDoherty1985
    @GarethDoherty1985 ปีที่แล้ว +1

    Weird that your video appeared when it did. I had already applied option 2 to my API. But randomly, when I explicitly throw, or an unhandled error occurs, the middleware isn't catching it =/ I can see I enter the middleware fine, but it never enters the catch. Can you think of any reason why?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      Which exception are you catching?

    • @GarethDoherty1985
      @GarethDoherty1985 ปีที่แล้ว

      @@MilanJovanovicTech Just the base "Exception" exact same code as you and everyone else on the internet has done when writing about this :D

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      @@GarethDoherty1985 Could be something around invoking the RequestDelegate

    • @GarethDoherty1985
      @GarethDoherty1985 ปีที่แล้ว

      @@MilanJovanovicTech
      private readonly RequestDelegate _next;
      public ExceptionHandlingMiddleware(RequestDelegate next)
      {
      _next = next;
      }
      public async Task InvokeAsync(HttpContext context)
      {
      try
      {
      await _next.Invoke(context);
      }
      catch (Exception ex)
      {
      await HandleExceptionAsync(ex, context);
      }
      }
      Anything weird here you see? I see it goes into the try, go elsewhere in code get or throw error, but never goes inside the catch!

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      @@GarethDoherty1985 That is entirely wild 😱
      I have no idea why it's behaving like that

  • @monsieurnet
    @monsieurnet ปีที่แล้ว +1

    I followed the 2nd way in your tutorial step by step but got this error : "Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'WebApi.Middleware.GlobalExceptionHandlingMiddleware'". So i tried to add this : "builder.Services.AddTransient(typeof(ILogger), typeof(Logger)); " in the Program.cs but still not working. Do you have a solution ?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      services.AddLogger? 🤔

    • @monsieurnet
      @monsieurnet ปีที่แล้ว

      @@MilanJovanovicTech oh gosh i didn't know there was such a service. Thank you bro ;-D

  • @mohamedroshdy4916
    @mohamedroshdy4916 ปีที่แล้ว +1

    very clear and good, but by this way all errors will have the same response can you indicate this point to me , what I should do to
    describe each type of error
    ..thanks

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      You have two options:
      - Use the middleware only for 500 internal server + return meaningful errors in controller
      - Throw custom exceptions (NotFound, BadRequest) from your code, and handle them in middleware and return appropriate response code

    • @mohamedroshdy4916
      @mohamedroshdy4916 ปีที่แล้ว

      @@MilanJovanovicTech, oh right, thanks

    • @mohamedroshdy4916
      @mohamedroshdy4916 ปีที่แล้ว

      @@MilanJovanovicTech ,please can you have an example or demo to view this point,I understand it but need to show in practice

  • @maxpuissant2
    @maxpuissant2 ปีที่แล้ว +1

    What if exceptions are thrown for 404 or other status code?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      How will you know it's thrown for 404 status code?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      @@MarcusKaseder Right, that's the idea!

    • @unskeptable
      @unskeptable ปีที่แล้ว

      Exception.ToString() is bulletproof

  • @Busk1
    @Busk1 ปีที่แล้ว +1

    What about "UseExceptionHandler" ?
    It's cleaner for me to use "UseExceptionHandler", so you don't have to add the middleware to the serviceCollection and you dont have to put that try..catch block
    but good approaches 😁😁

  • @moon5964
    @moon5964 หลายเดือนก่อน

    Interesting, y set ContentType after sending response? that might works for you:(

  • @mzolisidywili2230
    @mzolisidywili2230 ปีที่แล้ว +1

    Mine seems to not have triggered the exception even when it threw an exception

  • @user-rv1it2xm4x
    @user-rv1it2xm4x 3 หลายเดือนก่อน

    In the middleware everything performs according to their presence in the sequence. Because we know that every component will execute after their prior component. In this video, you are putting exception handling(obviously as a middleware component) after executing other components of middleware. Have you think, it should be introduced at initial levels in the Program.cs

    • @MilanJovanovicTech
      @MilanJovanovicTech  3 หลายเดือนก่อน

      You're welcome to apply the ordering you want. Most middleware doesn't throw exceptions until we get to our actual request handler

  • @kiquenet
    @kiquenet ปีที่แล้ว +1

    Applies to Blazor ?

  • @ramytawfik9168
    @ramytawfik9168 7 หลายเดือนก่อน

    why did you register it as a transient service not scoped ?

    • @MilanJovanovicTech
      @MilanJovanovicTech  7 หลายเดือนก่อน

      Because it's stateless

    • @ramytawfik9168
      @ramytawfik9168 7 หลายเดือนก่อน

      @@MilanJovanovicTech could you please explain what do you mean by stateless ?

  • @coding-gemini
    @coding-gemini ปีที่แล้ว

    Very Interesting, thanks for the video Milan, looking forward for more content from you. Can you post a video of how to use the Ilogger to log the error to database or a file ?

  • @diegobonura3485
    @diegobonura3485 ปีที่แล้ว

    Thanks for your videos Milan. Main question is about JsonSerializerOptions, how to easily get same json options configured by AddControllers() .AddJsonOptions() call? is it possible to share same settings also on middleware?

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      I think a better option would be create a static field with JsonSerializerOptions and use the inside of the middleware

    • @diegobonura3485
      @diegobonura3485 ปีที่แล้ว

      @@MilanJovanovicTech I will try to inject IOptions and let you know!

  • @gauravsingh-qt2zo
    @gauravsingh-qt2zo ปีที่แล้ว +1

    Can anyone tell when to use "is null" vs == while comparison

    • @neociber24
      @neociber24 ปีที่แล้ว +1

      Always use "is null" because the operator == can be override.
      But to be real, rarely someone override the equality operator, maybe library authors

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      "is null" reads better. What Fredd mentioned is correct. But in 99% of use cases, this won't happen.

    • @gauravsingh-qt2zo
      @gauravsingh-qt2zo ปีที่แล้ว

      @@neociber24 One more question-> When to use object keyword vs dynamic keyword?. Both can be used to store some complex data at run time. Any advantage of using one over other

    • @gauravsingh-qt2zo
      @gauravsingh-qt2zo ปีที่แล้ว

      @@MarcusKaseder thanks a lot for your answer. Can u answer one more question-> the one reason of using var keyword is that it is short to write as compared to big data type. What is the other major reason to use var keyword????

    • @gauravsingh-qt2zo
      @gauravsingh-qt2zo ปีที่แล้ว

      @@MarcusKaseder thankyou so much sir. One last question how many years of .net development experience u have???

  • @osherhajaj8565
    @osherhajaj8565 ปีที่แล้ว +1

    On minute 0:19 you say the concept of middleware in asp.net core but concepts (e.g middleware) are framework agnostic.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      "the concept of middleware in asp.net core" is obviously not framework agnostic
      That's why I said it like that and not just "the concept of middleware"

    • @osherhajaj8565
      @osherhajaj8565 ปีที่แล้ว

      There is no such thing as concept x in framework y. Middleware in .net are not different at the concept level from nestjs middleware and so on. If you want to talk about a concept it is important to note that the framework is insignificant.

  • @jayakumar2927
    @jayakumar2927 10 หลายเดือนก่อน +1

    can you share source code

  • @regestea
    @regestea ปีที่แล้ว +2

    don't forget to use sentry in your project

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      I've never used it to be honest. Should I take a look?

    • @regestea
      @regestea ปีที่แล้ว

      @@MilanJovanovicTech absolutely, use it in all of your projects, every time that your product users get an error sentry tells you when and where, and which line of your code has an error and you can see every error that user sees with full detail

    • @ryan-heath
      @ryan-heath ปีที่แล้ว

      @@regestea like … an … exception? 😊

    • @regestea
      @regestea ปีที่แล้ว

      @@ryan-heath maybe 😁

  • @onlyforkbj
    @onlyforkbj ปีที่แล้ว

    Hey Mian, I love your video and they are so educational to me and I'm sure to others as well. I would like to ask your opinion on another video from Nick Chapsas which is quite intriguing.
    th-cam.com/video/a1ye9eGTB98/w-d-xo.html
    What do you reckon on this? There seems to be a clear trade off when throwing exception and catching them as part of the global exception middleware.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      With proper Client side validation - bad requests are highly unlikely to reach your API. So the only reason a bad request would happen is someone calling your API directly - so I'm fine with the tradeoff i'm making here, and throwing exceptions

  • @AndreasToth
    @AndreasToth 5 หลายเดือนก่อน

    That's how to do a tutorial!

  • @oguzhan2393
    @oguzhan2393 7 หลายเดือนก่อน

    for every error you are returning 500 code. I think it is not good for use case.

    • @MilanJovanovicTech
      @MilanJovanovicTech  7 หลายเดือนก่อน

      This is a fail-safe for unhandled exceptions. What else would you return?

    • @oguzhan2393
      @oguzhan2393 7 หลายเดือนก่อน

      @@MilanJovanovicTech can be 404 sometimes can be 400 error. dependens on the case.

  • @stevehiggin
    @stevehiggin ปีที่แล้ว +2

    My comment seemed to be deleted before, but the StatusCodes class in the Microsoft.AspNetCore.Http namespace already has fields that are ints (no casting) for all the Http response codes you might want to return, and it also has the code with the description, which is good when dealing with the less common response codes.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      Absolutely Steve, that's what I usually use with Swagger's [ProducesResponseType]

  • @punitchachan2517
    @punitchachan2517 6 หลายเดือนก่อน

    your videos are good, but person who has only good knowledge of Dot net tech can understand your stuff. You explain it very fast it is tough to understand.

    • @MilanJovanovicTech
      @MilanJovanovicTech  6 หลายเดือนก่อน +1

      Well, I only care about speaking to a .NET audience 🤷‍♂️

    • @eobardthawne6903
      @eobardthawne6903 5 หลายเดือนก่อน

      This is Wendy's sir 😂

  • @olekristiansjbakken4204
    @olekristiansjbakken4204 ปีที่แล้ว +1

    I like your videos, but please stop with the zoom inn and out. Looks better without it.

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว +1

      It's only in the first 30s, come on 🙄🙄🙄

  • @oneillci
    @oneillci ปีที่แล้ว +2

    Instead of manually serializing and setting the content type, I like to just use _await context.Response.WriteAsJsonAsync(problem);_ Really enjoying your videos BTW

    • @MilanJovanovicTech
      @MilanJovanovicTech  ปีที่แล้ว

      You're writing to a Response which is in memory. Nothing too asynchronous there.

    • @velebyte
      @velebyte ปีที่แล้ว

      @@MilanJovanovicTech What he is saying, why do serialization and setting the content type with those two lines of code, when the WriteAsJsonAsync method does both of those things? Great videos btw, and I love the WoW collection in the back

  • @dylanv.dmerwe5960
    @dylanv.dmerwe5960 ปีที่แล้ว +1

    context.Response.WriteAsJsonAsync