“Middleware is defined in the OWIN specification as pass through components that form a pipeline between a server and application to inspect, route, or modify request and response messages for a specific purpose. Middleware consists of application components are incorporated into the ASP.NET HTTP pipeline.” The text is in the
documentation, and as can be seen, with middleware we can insert a component that is incorporated in ASP.NET HTTP pipeline, that is, we can develop a code with a purpose to manipulate the requests and responses.
A characteristic of middleware is that normally there will a chain of middleware whereby order of configuration, one is called after the end of other and the current middleware can on any moment cancel invoking the next middleware, thus all chains of middleware will be canceled.
Do you have doubts about what is middlewares? We can compare middleware with the old http modules that today don't exist in the new ASP.NET. To get more clarity about the subject, I am going to show some middlewares that already are utilized by default in application templates to ASP.NET Core, and after I am going to create a custom middleware.
Below I show the startup class, note that there are some comments that indicate where there is a middleware.
Did you see the middlewares utilized in code? Here, each middleware has a responsibility and the gain that we have is we can choose only the ones needed for our project, different from old version of ASP.NET that by default many features were added even when they were not necessary. A very good phrase says: "Pay only by what you use", in other words, how many fewer middleware you use, the less heavy will be the HTPP pipeline.
Other thing to observe that in code above, all the middlewares start with a “Use”, this is a pattern done by team ASP.NET.
Now I am going to create a own middleware and my goal will be creating one that shows the total time of application to take care of a request. Below following the code.
As can be seen, making a middleware is not difficult, it needs a constructor to receive the next middleware and an “Invoke” method that receives the context of HTTP. The goal of showing the total time of application gets in method Invoke. Before calling the next middleware, it is started the time and after of calling the next middleware, when all the middlewares already were executed, I execute the code to show in the HTML the total time.
Remember, I know that all middleware were executed because our middleware must be configured before of all others, thus the code will wait all executions and after the instruction “await _next(context);” we can write our code.
The code above is only to show the set up of our middleware in the Configure method of the Startup class. To that this works, it is needed using the instruction “app.UseMiddleware<ResponseTime>();”, where the UseMiddleware method is used to call custom middlewares.
Conclusion
The ASP.NET Core has changed, not the code that we know, but your core and by this, the way of manipulating a request and a response was changed to middleware. Now it's lighter and easier to stay between an application and a server. However, take care, it is not because it got better that you must now only use that to develop.