Skip to main content

Complete Tutorial on Developing Custom Middleware in ASP.NET Core MVC

 Complete Tutorial on Developing Custom Middleware in ASP.NET Core MVC:

Middleware plays a crucial role in handling requests and responses in an ASP.NET Core application. This comprehensive tutorial will guide you through the process of creating custom middleware in an ASP.NET Core MVC application, using a practical example to demonstrate key concepts.

1. Introduction

Middleware in ASP.NET Core is a software component that is executed on each request. It can be used to handle various concerns like authentication, logging, error handling, and more. Middleware components form a pipeline, and each component can process requests, generate responses, and call the next middleware in the sequence.

2. Setting Up the Project

  1. Create a New ASP.NET Core MVC Project:
    • Open Visual Studio and create a new project.
    • Select "ASP.NET Core Web Application" and click "Next".
    • Name your project (e.g., "CustomMiddlewareExample"), select "ASP.NET Core 6.0" as the target framework, and click "Create".
  2. Add Middleware Folder and Class:
    • Right-click on the project, select "Add" > "New Folder", and name it "Middlewares".
    • Right-click on the "Middlewares" folder, select "Add" > "Class", and name it "RequestLoggingMiddleware.cs".

3. Implementing the Middleware

  1. Open RequestLoggingMiddleware.cs:
    • Add the following code to implement the middleware class:

csharp

using Microsoft.AspNetCore.Http;

using Microsoft.Extensions.Logging;

using System.Diagnostics;

using System.IO;

using System.Threading.Tasks;

 

namespace CustomMiddlewareExample.Middlewares

{

    public class RequestLoggingMiddleware

    {

        private readonly RequestDelegate _next;

        private readonly ILogger<RequestLoggingMiddleware> _logger;

 

        public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)

        {

            _next = next;

            _logger = logger;

        }

 

        public async Task Invoke(HttpContext context)

        {

            var watch = Stopwatch.StartNew();

            var originalBodyStream = context.Response.Body;

 

            using (var responseBody = new MemoryStream())

            {

                context.Response.Body = responseBody;

 

                await _next(context);

 

                watch.Stop();

                context.Response.Body = originalBodyStream;

 

                _logger.LogInformation($"Request: {context.Request.Method} {context.Request.Path} - Body: {await FormatRequestBody(context.Request)}");

                _logger.LogInformation($"Response: {context.Response.StatusCode} - Body: {await FormatResponseBody(responseBody)}");

                _logger.LogInformation($"Duration: {watch.ElapsedMilliseconds} ms");

 

                await responseBody.CopyToAsync(originalBodyStream);

            }

        }

 

        private async Task<string> FormatRequestBody(HttpRequest request)

        {

            request.EnableBuffering();

            var body = await new StreamReader(request.Body).ReadToEndAsync();

            request.Body.Position = 0;

            return body;

        }

 

        private async Task<string> FormatResponseBody(Stream responseBody)

        {

            responseBody.Seek(0, SeekOrigin.Begin);

            var body = await new StreamReader(responseBody).ReadToEndAsync();

            responseBody.Seek(0, SeekOrigin.Begin);

            return body;

        }

    }

 

    public static class RequestLoggingMiddlewareExtensions

    {

        public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)

        {

            return builder.UseMiddleware<RequestLoggingMiddleware>();

        }

    }

}

4. Registering the Middleware

  1. Open Startup.cs:
    • Add the following code to the Configure method to register the middleware:

csharp

using CustomMiddlewareExample.Middlewares;

 

public class Startup

{

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    {

        if (env.IsDevelopment())

        {

            app.UseDeveloperExceptionPage();

        }

        else

        {

            app.UseExceptionHandler("/Home/Error");

            app.UseHsts();

        }

 

        app.UseHttpsRedirection();

        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

       

        // Register the custom middleware

        app.UseRequestLogging();

 

        app.UseEndpoints(endpoints =>

        {

            endpoints.MapControllerRoute(

                name: "default",

                pattern: "{controller=Home}/{action=Index}/{id?}");

        });

    }

}

5. Testing the Middleware

  1. Run the Application:
    • Start the application by pressing F5 or clicking the "Run" button.
  2. Make HTTP Requests:
    • Use a tool like Postman or your browser to make HTTP requests to your application endpoints.
  3. Check Logs:
    • Check the logs in the console or log file to see the logged requests and responses.

Detailed Explanation and Benefits

  • RequestDelegate: Represents a function that can process an HTTP request.
  • ILogger: Used for logging information, which can help in debugging and monitoring.
  • Stopwatch: Measures the time taken to process the request.
  • MemoryStream: Used to temporarily store the response body.
  • FormatRequestBody: Reads and returns the request body as a string.
  • FormatResponseBody: Reads and returns the response body as a string.

Conclusion

Middleware is an essential part of ASP.NET Core applications, allowing you to process requests and responses in a flexible and modular way. By creating custom middleware, you can add specific functionalities like logging, authentication, and error handling to your application pipeline. This tutorial demonstrates how to create, register, and test custom middleware in an ASP.NET Core MVC application.

 





Comments

Popular posts from this blog

Uncontrolled form input in React-JS

  Uncontrolled form input in React-JS? If we want to take input from users without any separate event handling then we can uncontrolled the data binding technique. The uncontrolled input is similar to the traditional HTML form inputs. The DOM itself handles the form data. Here, the HTML elements maintain their own state that will be updated when the input value changes. To write an uncontrolled component, you need to use a ref to get form values from the DOM. In other words, there is no need to write an event handler for every state update. You can use a ref to access the input field value of the form from the DOM. Example of Uncontrolled Form Input:- import React from "react" ; export class Info extends React . Component {     constructor ( props )     {         super ( props );         this . fun = this . fun . bind ( this ); //event method binding         this . input = React . createRef ();...

JSP Page design using Internal CSS

  JSP is used to design the user interface of an application, CSS is used to provide set of properties. Jsp provide proper page template to create user interface of dynamic web application. We can write CSS using three different ways 1)  inline CSS:-   we will write CSS tag under HTML elements <div style="width:200px; height:100px; background-color:green;"></div> 2)  Internal CSS:-  we will write CSS under <style> block. <style type="text/css"> #abc { width:200px;  height:100px;  background-color:green; } </style> <div id="abc"></div> 3) External CSS:-  we will write CSS to create a separate file and link it into HTML Web pages. create a separate file and named it style.css #abc { width:200px;  height:100px;  background-color:green; } go into Jsp page and link style.css <link href="style.css"  type="text/css" rel="stylesheet"   /> <div id="abc"> </div> Exam...

JDBC using JSP and Servlet

JDBC means Java Database Connectivity ,It is intermediates from Application to database. JDBC has different type of divers and provides to communicate from database server. JDBC contain four different type of approach to communicate with Database Type 1:- JDBC-ODBC Driver Type2:- JDBC Vendor specific Type3 :- JDBC Network Specific Type4:- JDBC Client-Server based Driver  or JAVA thin driver:- Mostly we prefer Type 4 type of Driver to communicate with database server. Step for JDBC:- 1  Create Database using MYSQL ,ORACLE ,MS-SQL or any other database 2   Create Table using database server 3   Create Form according to database table 4  Submit Form and get form data into servlet 5  write JDBC Code:-     5.1)   import package    import java.sql.*     5.2)  Add JDBC Driver according to database ide tools     5.3)  call driver in program         ...