{"data":{"blogs":{"edges":[{"node":{"frontmatter":{"title":"Simplifying ASP.NET Core s Program cs A Beginner s Guide","date":"Sep 30, 2024","readtime":"10 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACqElEQVQozwXBWVMSAQAA4P1NPfdSOZOVTTKCF4ocBnEoiCyCbsrlrgKCsAGthNyHXCpQyCoKCiKZqJB4j+WRNWZOWeNr3wcQ62u59GYxp00lZqv7uXbjcNiGxtzYwrQ3n5otFzI7xZVqMXf7/eLv9fXd338OzFDM4koRi91aB9Dam2AJz2FEtDKREx32T6JdQhGrq/tll4D/WtEHjwmVWpFCLVGMVLa3xQKuEhKtpeNDfFovgwiIOVQTAtn1CpdJnY974hEvgSet40jlFo8hkNQH8VFfcjyID1sD5Uo5HvEVsnN75Ry75TnY2QioQJbHrJ5xWVbnpnOp2WjAVUckP6xvzW4dnFzeHJxdHf/48+Xqdv/8525142S/eH5aOdpdHuym0Ym1wBCP7H2jshmRsMOcScVnI/4XLdQaIiW2Uto8+rZWPtzYP9s8OFutHKUSM3k89jGPp5NTsh4Go/EZIJN0qwaEAasR08qiVo1OJX1AID8iUd8XPn/9dbd3fr17cXN4+btyev3OghpgCOkXQDwqm9JAJz0BNINCBOqNea3aIaFB1YeOQJ2vOCQKw2Bzow6fbsJpD0RQm1NvtiIDPSCf2UF8KmM2CBjNdOJjYHnGlZ91lfCgUyOJed6WVvCgHS0tz31aTHS0NVLbm6rF7E5hKbOI+5ILR1tFNpkg5VCMCjCf8AOl+VARD6XnE26HRa8Ui0QCrV6zncOjbsxp0fqt4+uZ5O358fpO1ZUuVNcLOkQRdZoTQfvaag4gdVAIQ4buUEaeWJ1I4HazWodAnkmTY8I45camXBYXpjdplKlpP6zVtXUy8cxyfCn/IR5Jh22AnNtcc/8ek8sKO9DQhBqDwcEuslxAk/fQ5EK6EmTCUq6qj2MegdyYXj+qHIMHVRAo4bNgkPUf576IsGx5GVEAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/e1663bf8c94a59693002b7e79d14d62b/dcd92/SecureAPI.webp","srcSet":"/static/e1663bf8c94a59693002b7e79d14d62b/745fa/SecureAPI.webp 175w,\n/static/e1663bf8c94a59693002b7e79d14d62b/b0f73/SecureAPI.webp 350w,\n/static/e1663bf8c94a59693002b7e79d14d62b/dcd92/SecureAPI.webp 700w,\n/static/e1663bf8c94a59693002b7e79d14d62b/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/e1663bf8c94a59693002b7e79d14d62b/1934d/SecureAPI.avif 175w,\n/static/e1663bf8c94a59693002b7e79d14d62b/8f8aa/SecureAPI.avif 350w,\n/static/e1663bf8c94a59693002b7e79d14d62b/a273d/SecureAPI.avif 700w,\n/static/e1663bf8c94a59693002b7e79d14d62b/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["ASP.NET Core",".Net 8 Core","Microservice"],"github":null,"external":"https://www.prafulchauhan.com/blogs/simplifying-asp-net-core-s-program-cs-a-beginner-s-guide","cta":"https://www.prafulchauhan.com/blogs/simplifying-asp-net-core-s-program-cs-a-beginner-s-guide"},"html":"<p>In the world of ASP.NET Core development, the <code class=\"language-text\">Program.cs</code> file is like the control center of your application. It's where you configure everything that your web app needs to run smoothly. Let's take a closer look at what <code class=\"language-text\">Program.cs</code> is and how you can use it to set up your ASP.NET Core application.</p>\n<h2>What is Program.cs?</h2>\n<p>Think of <code class=\"language-text\">Program.cs</code> as the starting point of your ASP.NET Core application. It's where you define how your app should be built and configured before it starts serving requests from users. Inside <code class=\"language-text\">Program.cs</code>, you'll find code that sets up things like services, database connections, API versioning, authentication, and more.</p>\n<h2>Configuring Services</h2>\n<p>One of the most important tasks in <code class=\"language-text\">Program.cs</code> is configuring the services that your app needs. These services could be anything from database access to logging utilities. Here's a simple example of how you can configure a service:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Configuring Services</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddScoped</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>IAuthService<span class=\"token punctuation\">,</span> AuthService<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Health Checks</h2>\n<p>Health checks are like routine check-ups for your application. They help you monitor the health of your app's components and dependencies. Here's how you can set up health checks in <code class=\"language-text\">Program.cs</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Health Checks</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddHealthChecks</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">AddSqlServer</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetConnectionString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"DefaultConnection\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token named-parameter punctuation\">tags</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">new</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"database\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>CORS Policies</h2>\n<p>CORS (Cross-Origin Resource Sharing) policies control which external domains can access your API. You can configure CORS policies in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// CORS Policies</span>\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> myCorsPolicy <span class=\"token operator\">=</span> <span class=\"token string\">\"MyCorsPolicy\"</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddCors</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">AddPolicy</span><span class=\"token punctuation\">(</span>myCorsPolicy<span class=\"token punctuation\">,</span> builder <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        builder<span class=\"token punctuation\">.</span><span class=\"token function\">AllowAnyOrigin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">WithExposedHeaders</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"x-my-custom-header\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Database Connections</h2>\n<p>Connecting your ASP.NET Core app to a database is essential for storing and retrieving data. Here's how you can set up database connections in <code class=\"language-text\">Program.cs</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Database Connections</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddDbContext</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>MyDbContext<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">UseSqlServer</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetConnectionString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"DefaultConnection\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddDbContext</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>AppDbContext<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">UseNpgsql</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetConnectionString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"DefaultConnectionPS\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>API Versioning</h2>\n<p>API versioning allows you to manage changes to your API over time. You can configure API versioning in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// API Versioning</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddApiVersioning</span><span class=\"token punctuation\">(</span>o <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    o<span class=\"token punctuation\">.</span>AssumeDefaultVersionWhenUnspecified <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    o<span class=\"token punctuation\">.</span>DefaultApiVersion <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">ApiVersion</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    o<span class=\"token punctuation\">.</span>ReportApiVersions <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Swagger for API Documentation</h2>\n<p>Swagger generates interactive API documentation for your ASP.NET Core app. Here's how you can set up Swagger in <code class=\"language-text\">Program.cs</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Swagger for API Documentation</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddSwaggerGen</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Harnessing the Power of MassTransit for Messaging</h2>\n<p>MassTransit is a powerful messaging library for .NET applications. You can configure MassTransit in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// MassTransit Setup</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddMassTransit</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    x<span class=\"token punctuation\">.</span><span class=\"token function\">UsingRabbitMq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddMassTransitHostedService</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Authentication and Authorization</h2>\n<p>Authentication and authorization control access to your app's resources. Here's how you can set up authentication and authorization in <code class=\"language-text\">Program.cs</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Authentication and Authorization</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddJwtAuthentication</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span><span class=\"token function\">AddAppAuthentication</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Configuring Logging</h2>\n<p>Logging helps you keep track of what's happening in your application. Configure logging in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Configuring Logging</span>\nbuilder<span class=\"token punctuation\">.</span>Host<span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureLogging</span><span class=\"token punctuation\">(</span>logging <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    logging<span class=\"token punctuation\">.</span><span class=\"token function\">ClearProviders</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    logging<span class=\"token punctuation\">.</span><span class=\"token function\">AddConsole</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> logger <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">LoggerConfiguration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span>ReadFrom<span class=\"token punctuation\">.</span><span class=\"token function\">Configuration</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span>Enrich<span class=\"token punctuation\">.</span><span class=\"token function\">FromLogContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">CreateLogger</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Logging<span class=\"token punctuation\">.</span><span class=\"token function\">ClearProviders</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Logging<span class=\"token punctuation\">.</span><span class=\"token function\">AddSerilog</span><span class=\"token punctuation\">(</span>logger<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Enlisting Hosted Services for Background Tasks</h2>\n<p>Hosted services allow you to run background tasks in your ASP.NET Core app. You can enlist hosted services in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Enlisting Hosted Services for Background Tasks</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddHostedService</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>MyBackgroundService<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddHostedService</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>CartCleanupService<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>API Key Validation in ASP.NET Core's Program.cs</h2>\n<p>API key validation helps you control access to your API endpoints. You can set up API key validation in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// API Key Validation</span>\napp<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">UseMiddleware</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>ApiKeyMiddleware<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>AutoMapper Configuration</h2>\n<p>AutoMapper simplifies object-to-object mapping in your ASP.NET Core app. Configure AutoMapper in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// AutoMapper Configuration</span>\n<span class=\"token class-name\">IMapper</span> mapper <span class=\"token operator\">=</span> MappingConfig<span class=\"token punctuation\">.</span><span class=\"token function\">RegisterMaps</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">CreateMapper</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddSingleton</span><span class=\"token punctuation\">(</span>mapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">MapperConfiguration</span> <span class=\"token function\">RegisterMaps</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> mappingConfig <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">MapperConfiguration</span><span class=\"token punctuation\">(</span>config <span class=\"token operator\">=></span>\n\t<span class=\"token punctuation\">{</span>\n\t\tconfig<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">CreateMap</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>LocationDto<span class=\"token punctuation\">,</span> Location<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ReverseMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">return</span> mappingConfig<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Ocelot Configuration</h2>\n<p>Ocelot is a library for building API gateways on ASP.NET Core. You can configure Ocelot in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Ocelot Configuration</span>\nbuilder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span><span class=\"token function\">AddOcelotWithSwaggerSupport</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    options<span class=\"token punctuation\">.</span>Folder <span class=\"token operator\">=</span> <span class=\"token string\">\"OcelotConfiguration\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddOcelot</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddAppConfiguration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddSwaggerForOcelot</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Rate Limiting</h2>\n<p>Rate limiting helps you control the rate of requests to your API endpoints. You can set up rate limiting in <code class=\"language-text\">Program.cs</code> like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token comment\">// Rate Limiting</span>\n\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddRateLimiter</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    options<span class=\"token punctuation\">.</span>RejectionStatusCode <span class=\"token operator\">=</span> StatusCodes<span class=\"token punctuation\">.</span>Status429TooManyRequests<span class=\"token punctuation\">;</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">addfixedwindowlimiter</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fixed\"</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        options<span class=\"token punctuation\">.</span>permitlimit <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>window <span class=\"token operator\">=</span> timespan<span class=\"token punctuation\">.</span><span class=\"token function\">fromseconds</span><span class=\"token punctuation\">(</span><span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>queueprocessingorder <span class=\"token operator\">=</span> queueprocessingorder<span class=\"token punctuation\">.</span>oldestfirst<span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>queuelimit <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">AddTokenBucketLimiter</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"token\"</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        options<span class=\"token punctuation\">.</span>TokenLimit <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>QueueProcessingOrder <span class=\"token operator\">=</span> QueueProcessingOrder<span class=\"token punctuation\">.</span>OldestFirst<span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>QueueLimit <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>ReplenishmentPeriod <span class=\"token operator\">=</span> TimeSpan<span class=\"token punctuation\">.</span><span class=\"token function\">FromSeconds</span><span class=\"token punctuation\">(</span><span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>TokensPerPeriod <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>AutoReplenishment <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">AddPolicy</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fixed-by-ip\"</span><span class=\"token punctuation\">,</span> httpContext <span class=\"token operator\">=></span>\n        RateLimitPartition<span class=\"token punctuation\">.</span><span class=\"token function\">GetFixedWindowLimiter</span><span class=\"token punctuation\">(</span>\n            httpContext<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">.</span>Headers<span class=\"token punctuation\">[</span><span class=\"token string\">\"X-Forwarded-For\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token named-parameter punctuation\">factory</span><span class=\"token punctuation\">:</span> _ <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">FixedWindowRateLimiterOptions</span>\n            <span class=\"token punctuation\">{</span>\n                PermitLimit <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n                Window <span class=\"token operator\">=</span> TimeSpan<span class=\"token punctuation\">.</span><span class=\"token function\">FromMinutes</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    options<span class=\"token punctuation\">.</span><span class=\"token function\">AddConcurrencyLimiter</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"concurrency\"</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        options<span class=\"token punctuation\">.</span>PermitLimit <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>QueueProcessingOrder <span class=\"token operator\">=</span> QueueProcessingOrder<span class=\"token punctuation\">.</span>OldestFirst<span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>QueueLimit <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Conclusion</h2>\n<p>The <code class=\"language-text\">Program.cs</code> file in ASP.NET Core 8 is the heart of your application’s configuration. From setting up databases to API versioning, authentication, messaging, and more, this file defines how your app behaves and scales. With real-world examples, you can see how each of these features applies to building a robust application, like an e-commerce site. Mastering the configurations in <code class=\"language-text\">Program.cs</code> will help you build more efficient, scalable, and secure applications in ASP.NET Core.</p>"}},{"node":{"frontmatter":{"title":"Deep Dive into Minimal APIs in ASP.NET Core 8","date":"Sep 30, 2024","readtime":"10 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACjUlEQVQozwXB608SAQAA8FtbKk1ibporHwMEBBEEjjuO47gXHHcH3AN53snzBBHTQJaISFtmrrZqrQY1V222PvQl+9Cqze/9Yf1+gNes85imQNMUYtOjjjncZaR8LhqCIiEyIeQ5Ph2hecLvjQQ8UdSHWPSkbzlgnYYsOp9pAiB8RgZZJTeWqPUFmSUkjk/GBJ7NSUpX2X+jHn0uHH6UM7vZbFUt7RBus5qSZQYL2g2IbRqgkDWBQeN4QKSIlCAr5YNM5UQ7/Xr47uZ4/Hf//DIupzeV3UrrTFHqpbwaQwMs6sVd94N2A0BB1iQN82FU5ORNKVvQ+trwSmsP80omEQuAVr1jFkiXGt2L79XGcaXUEBmWx2AGsmOOWSDsXmRAR5rnKpWmEM82eqP2q2s27ILtMyzhwUDThnGi2h50X/6oPXxWq3fTkpqkCA71EO5FgIYcCQJLknhxq54rtNqn45PRL4En4bV7BOrkaMj5AGgdPxmObrYaw2K10xm8lTme3DCFHLNADPOVitUkRWaknLbT0/aen4z/SDyJOOdxvxFxztnmgPrB4fnVv2ZvpJY7clxMEKGI1xyyG4CMst05+5TmoyInypm95uDyxZdrjgb9VgPqXsJRRN3tPX79LZ5pslFuM1WUeTGBIwxoxhx3ARqDhYQUg10yK5S3B9l8JZcvCFJKSMaLj87749+99z+bww9qvZcr7kliTowxDOIOO+cQqw7wGW8hKzrStcwHPRKbpKB1nomV6n210tI6F7X20/JOX6kd5fJaggpHgyAFr4ec8wHbtH9lEvCYJiCLDrZMwRZdcHUm5FygYDeLkwyKsWGcDgT5MBaFvZjbFnQuIjZ9wKLzW++AK5Ne0+3/qsu+ae83TIcAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/c73e04e2dc39185c554932b7acc46a24/dcd92/SecureAPI.webp","srcSet":"/static/c73e04e2dc39185c554932b7acc46a24/745fa/SecureAPI.webp 175w,\n/static/c73e04e2dc39185c554932b7acc46a24/b0f73/SecureAPI.webp 350w,\n/static/c73e04e2dc39185c554932b7acc46a24/dcd92/SecureAPI.webp 700w,\n/static/c73e04e2dc39185c554932b7acc46a24/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/c73e04e2dc39185c554932b7acc46a24/1934d/SecureAPI.avif 175w,\n/static/c73e04e2dc39185c554932b7acc46a24/8f8aa/SecureAPI.avif 350w,\n/static/c73e04e2dc39185c554932b7acc46a24/a273d/SecureAPI.avif 700w,\n/static/c73e04e2dc39185c554932b7acc46a24/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["ASP.NET Core",".Net 8 Core","Microservice","Minimal API"],"github":null,"external":"/blogs/deep-dive-into-minimal-apis-in-asp-net-core-8","cta":"/blogs/deep-dive-into-minimal-apis-in-asp-net-core-8"},"html":"<h3>What is a Minimal API?</h3>\n<p>Minimal APIs were introduced in ASP.NET Core 6 and have been further enhanced in ASP.NET Core 8. Unlike traditional MVC-based APIs, <strong>Minimal APIs</strong> provide a lightweight and simplified approach for building HTTP services. They aim to reduce boilerplate code, allowing developers to create RESTful services using a more functional programming style.</p>\n<p>In a Minimal API, you directly define routes and handle requests within the <code class=\"language-text\">Program.cs</code> file, without the need for controllers, attributes, or extensive configuration. This approach is ideal for microservices, serverless functions, and small services where you need quick, straightforward implementations.</p>\n<h3>Key Features of Minimal APIs in ASP.NET Core 8</h3>\n<ol>\n<li><strong>Minimal Configuration</strong>: No need for controllers, attributes, or dependency-heavy configurations.</li>\n<li><strong>Route Handling Simplified</strong>: You define HTTP methods (GET, POST, PUT, DELETE, etc.) with Lambda expressions.</li>\n<li><strong>Automatic Model Binding</strong>: Minimal APIs provide built-in support for binding request data to method parameters.</li>\n<li><strong>Endpoint Filters</strong>: A powerful new feature in ASP.NET Core 8 for processing requests or responses globally or at specific endpoints.</li>\n<li><strong>OpenAPI/Swagger Integration</strong>: Easily enable Swagger documentation even with minimal APIs.</li>\n<li><strong>Dependency Injection (DI)</strong>: Still supports all the powerful features of DI that ASP.NET Core offers.</li>\n<li><strong>Lightweight and Fast</strong>: Since there’s less abstraction, Minimal APIs can be more performant, especially for small, focused tasks.</li>\n</ol>\n<h3>Why Choose Minimal APIs?</h3>\n<ul>\n<li><strong>Faster Development</strong>: Minimal APIs reduce the need for extensive setup and configuration, speeding up the development process.</li>\n<li><strong>Lower Overhead</strong>: With less boilerplate code and fewer abstractions, Minimal APIs are lightweight and can perform better for small-scale services or microservices.</li>\n<li><strong>Flexible and Extensible</strong>: Minimal APIs still offer the flexibility of ASP.NET Core, including dependency injection, middleware, and integration with existing libraries.</li>\n<li><strong>Easier for Small Projects</strong>: Ideal for small, single-purpose APIs, microservices, or serverless applications that don't require the full MVC framework.</li>\n</ul>\n<h3>Setting Up a Minimal API in ASP.NET Core 8</h3>\n<p>Let's walk through a complete example of how to set up a Minimal API from scratch in ASP.NET Core 8.</p>\n<h4>Step 1: Create a New ASP.NET Core 8 Project</h4>\n<p>Start by creating a new ASP.NET Core 8 project using the command line.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new web <span class=\"token parameter variable\">-n</span> MinimalApiExample\n<span class=\"token builtin class-name\">cd</span> MinimalApiExample</code></pre></div>\n<p>This template generates a basic web project, which you can modify to implement a minimal API.</p>\n<h4>Step 2: Basic Setup of a Minimal API in <code class=\"language-text\">Program.cs</code></h4>\n<p>In ASP.NET Core 8, you define endpoints directly in the <code class=\"language-text\">Program.cs</code> file. Here's an example:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// A simple GET request</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">\"Welcome to Minimal API in ASP.NET Core 8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Start the application</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In this basic setup:</p>\n<ul>\n<li><strong>MapGet</strong>: Defines a route for the HTTP GET request. When the root URL <code class=\"language-text\">/</code> is hit, it returns the message \"Welcome to Minimal API in ASP.NET Core 8\".</li>\n</ul>\n<h4>Step 3: Adding Multiple Routes and Parameterized Endpoints</h4>\n<p>You can add routes for different HTTP methods and include parameters in the routes to handle more complex operations.</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// GET method to fetch all users</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/users\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Bob\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Charlie\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// GET method with a parameter to fetch a user by ID</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/users/{id}\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> id<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token interpolation-string\"><span class=\"token string\">$\"User ID: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token expression language-csharp\">id</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// POST method to create a new user</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapPost</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/users\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">User</span> newUser<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Results<span class=\"token punctuation\">.</span><span class=\"token function\">Created</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">$\"/users/</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token expression language-csharp\">newUser<span class=\"token punctuation\">.</span>Id</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">,</span> newUser<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Start the application</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Define the User model</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">record</span> <span class=\"token class-name\">User</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> Id<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> Name<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> Email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4>Explanation:</h4>\n<ol>\n<li><strong>MapGet(\"/users\")</strong>: Returns a list of users (for simplicity, just an array of strings).</li>\n<li><strong>MapGet(\"/users/{id}\")</strong>: Accepts a parameter <code class=\"language-text\">id</code> and returns the corresponding user ID.</li>\n<li><strong>MapPost(\"/users\")</strong>: Accepts a <code class=\"language-text\">User</code> object (model binding) and returns a \"Created\" response with a link to the newly created user.</li>\n</ol>\n<h4>Step 4: Adding Dependency Injection</h4>\n<p>You can still use all the ASP.NET Core features, such as Dependency Injection, with minimal APIs.</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Add services to DI container</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddSingleton</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>IUserService<span class=\"token punctuation\">,</span> UserService<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// GET method with DI</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/users\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">IUserService</span> userService<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> userService<span class=\"token punctuation\">.</span><span class=\"token function\">GetAllUsers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Start the application</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Service and Interface</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">IUserService</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token return-type class-name\">IEnumerable<span class=\"token punctuation\">&lt;</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">GetAllUsers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">UserService</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">IUserService</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\">IEnumerable<span class=\"token punctuation\">&lt;</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">GetAllUsers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Bob\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Charlie\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4>Step 5: Adding Swagger for API Documentation</h4>\n<p>Even in Minimal APIs, you can easily integrate Swagger to generate API documentation.</p>\n<p>Add the <code class=\"language-text\">Swashbuckle.AspNetCore</code> NuGet package for Swagger.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet <span class=\"token function\">add</span> package Swashbuckle.AspNetCore</code></pre></div>\n<p>Next, configure Swagger in <code class=\"language-text\">Program.cs</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Add Swagger services</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddEndpointsApiExplorer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddSwaggerGen</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Enable Swagger</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseSwagger</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseSwaggerUI</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Define minimal API routes</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">\"Hello, World!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Start the app</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now, when you run the application, Swagger documentation will be available at <code class=\"language-text\">/swagger</code> in the browser.</p>\n<h4>Step 6: Adding Authentication and Authorization</h4>\n<p>Minimal APIs also support authentication and authorization. Here’s a basic example using JWT authentication.</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Add JWT authentication</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddAuthentication</span><span class=\"token punctuation\">(</span>JwtBearerDefaults<span class=\"token punctuation\">.</span>AuthenticationScheme<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">AddJwtBearer</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n    <span class=\"token punctuation\">{</span>\n        options<span class=\"token punctuation\">.</span>Authority <span class=\"token operator\">=</span> <span class=\"token string\">\"https://your-auth-server\"</span><span class=\"token punctuation\">;</span>\n        options<span class=\"token punctuation\">.</span>Audience <span class=\"token operator\">=</span> <span class=\"token string\">\"your-api-audience\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseAuthentication</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// A protected API route</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapGet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/secure\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">\"This is a protected resource\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">RequireAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In this example:</p>\n<ul>\n<li>JWT authentication is added using <code class=\"language-text\">AddJwtBearer</code>.</li>\n<li>The <code class=\"language-text\">/secure</code> route is protected by <code class=\"language-text\">RequireAuthorization</code>, ensuring that only authenticated users can access it.</li>\n</ul>\n<h4>Step 7: Leveraging Endpoint Filters (New in ASP.NET Core 8)</h4>\n<p><strong>Endpoint filters</strong> in ASP.NET Core 8 allow you to define reusable logic that can be applied to multiple endpoints. This could include validation, logging, or modifying the request/response.</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Define an endpoint filter</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapPost</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/users\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">User</span> newUser<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Results<span class=\"token punctuation\">.</span><span class=\"token function\">Created</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">$\"/users/</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token expression language-csharp\">newUser<span class=\"token punctuation\">.</span>Id</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">,</span> newUser<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddEndpointFilter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">,</span> next<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> user <span class=\"token operator\">=</span> context<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetArgument</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>User<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">IsNullOrEmpty</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> Results<span class=\"token punctuation\">.</span><span class=\"token function\">BadRequest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Name is required\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">next</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// User model</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">record</span> <span class=\"token class-name\">User</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> Id<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> Name<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> Email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In this example:</p>\n<ul>\n<li>We define an endpoint filter that ensures a user's name is not empty before proceeding with the request.</li>\n</ul>\n<h3>Conclusion</h3>\n<p>Minimal APIs in ASP.NET Core 8 provide a streamlined and efficient way to build small-scale web services. They reduce the overhead of traditional MVC patterns while still retaining the full power of ASP.NET Core's middleware, dependency injection, and other features. Whether you're building microservices, serverless functions, or just want a lightweight API for quick tasks, Minimal APIs offer a flexible and easy-to-use solution.</p>"}},{"node":{"frontmatter":{"title":"Secure Your API By IP Whitelisting Using ASP.NET Core 8 Web API","date":"Sep 29, 2024","readtime":"8 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACiUlEQVQozwXBb08ScQAA4PsmrV60ZZNaaqDCcXccB3cHd9yPA47jOE7+c3J6BwgODDkQVExTZJnOaDld2exFY2ttrjWXq1VvW5+n54Ew2ySNPY1w3hBHxuJRJhxh5RTIG7xanvMHZz0+nGG5EHDjTpJwEE4r4Xjisk3Aj+85LHcgArEyNCbLQrVeXTXbIF3gFqvR1kHx8CzXG1R2BqJeY5OqVn9m9jo+ng+EeD+J+gmYRK2Qx4NExEggGpWXy9FSI9ToZ46umpfX51+/v7v5aeyflnr9Qr0Z1lbSK/VATgd5nYvLDEsT8DTk9rjCCSWcLUjVlrjWF3rH6mg8+vZ788MX480n/fhSqHXW+31jY5tUa8Fyi8npzELOA4Io5oA4QRAXS/6UGqu1hcZ2cO3F0vahZm4yRsu8GJvvP2vdXUaUqq0WV9sMtYdCc5dRK76k6hNECKdpTkmT8XRAq3Flk610lzt9RV2UNf3X33/jH3/Orz4SDFNpNkVzX9g751tDslinM0uspEBeH1XvdPZOTrdejXonb3unF93hkWYUYwn5+vZ2fHP7cjTy0N7i6mq8fSD0R77GnidX9ufLnJKBCC8ek2ONjtk9GKRKNb6gy0tlo7KUTYlcgBJjYZrCM+nYxmAIaybYORM2hmyhTEYk3I1ABGrzU1hCkZRsJiRJQJLoIE9xXCopCjwdBlQuGU5nFdFoVAev440tsbIOEmkfACQBQ+jMA0A5I0E6BGiO9QKOBsAPowhOkiAEMvlMbCGR1HRGWmjvPFdyWRdNuXEYh2ew2UnI/ugubnvonrNgtknXnIVwThOoDYOtKGqHnfMwCqM4StKk3W7DkHnMaUPmp5BZCzIz4Zy6/x8KUgCPiOusTwAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/773623bdb434960fc399f5295e06e5f2/dcd92/SecureAPI.webp","srcSet":"/static/773623bdb434960fc399f5295e06e5f2/745fa/SecureAPI.webp 175w,\n/static/773623bdb434960fc399f5295e06e5f2/b0f73/SecureAPI.webp 350w,\n/static/773623bdb434960fc399f5295e06e5f2/dcd92/SecureAPI.webp 700w,\n/static/773623bdb434960fc399f5295e06e5f2/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/773623bdb434960fc399f5295e06e5f2/1934d/SecureAPI.avif 175w,\n/static/773623bdb434960fc399f5295e06e5f2/8f8aa/SecureAPI.avif 350w,\n/static/773623bdb434960fc399f5295e06e5f2/a273d/SecureAPI.avif 700w,\n/static/773623bdb434960fc399f5295e06e5f2/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["ASP.NET Core",".Net 8 Core","Microservice","Secure API"],"github":null,"external":"/blogs/secure-your-api-by-ip-whitelisting-using-asp-net-core-8-web-api","cta":"/blogs/secure-your-api-by-ip-whitelisting-using-asp-net-core-8-web-api"},"html":"<p>In today’s digital landscape, securing APIs is a top priority, especially when exposing services over the internet. One way to increase security is through <strong>IP whitelisting</strong> — a technique that restricts access to only a specified set of IP addresses, effectively blocking traffic from unauthorized sources. This can be a crucial component in applications where access must be tightly controlled, like in financial services, internal APIs, or administrative dashboards.</p>\n<p>In this blog, we’ll dive deep into how to implement <strong>IP whitelisting</strong> in an ASP.NET Core 8 Web API using a custom middleware.</p>\n<h3>What is IP Whitelisting?</h3>\n<p><strong>IP Whitelisting</strong> is the process of allowing access to a web service only from pre-approved IP addresses. This ensures that even if someone has the correct credentials, they cannot access the API unless they’re using an approved IP address.</p>\n<p>In an ASP.NET Core Web API, this functionality can be implemented via middleware that intercepts incoming requests, checks the origin’s IP, and determines whether to grant or deny access based on the whitelist.</p>\n<hr>\n<h3>Setting up IP Whitelisting in ASP.NET Core 8</h3>\n<h4>Step 1: Creating the Middleware</h4>\n<p>Middleware is perfect for this task since it can inspect each HTTP request as it arrives. The following code shows how to create a custom <code class=\"language-text\">IPWhitelistMiddleware</code> that checks the client’s IP address against a predefined whitelist in the configuration:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">System<span class=\"token punctuation\">.</span>Net</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token namespace\">BEArgentina<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span>AuthAPI<span class=\"token punctuation\">.</span>Middlewares</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">IPWhitelistMiddleware</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">RequestDelegate</span> _next<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">IConfiguration</span> _configuration<span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token function\">IPWhitelistMiddleware</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">RequestDelegate</span> next<span class=\"token punctuation\">,</span> <span class=\"token class-name\">IConfiguration</span> configuration<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            _next <span class=\"token operator\">=</span> next<span class=\"token punctuation\">;</span>\n            _configuration <span class=\"token operator\">=</span> configuration<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">async</span> <span class=\"token return-type class-name\">Task</span> <span class=\"token function\">InvokeAsync</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpContext</span> context<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// Get the remote IP address of the client</span>\n            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> remoteIp <span class=\"token operator\">=</span> context<span class=\"token punctuation\">.</span>Connection<span class=\"token punctuation\">.</span>RemoteIpAddress<span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// Fetch the allowed IPs from configuration</span>\n            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> allowedIPs <span class=\"token operator\">=</span> _configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetSection</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"AllowedIPs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">Get</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// Check if the remote IP is in the allowed IP list</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>IPAddress<span class=\"token punctuation\">.</span><span class=\"token function\">IsLoopback</span><span class=\"token punctuation\">(</span>remoteIp<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>allowedIPs<span class=\"token punctuation\">.</span><span class=\"token function\">Contains</span><span class=\"token punctuation\">(</span>remoteIp<span class=\"token punctuation\">?.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">{</span>\n                <span class=\"token comment\">// If the IP is not allowed, return a forbidden response</span>\n                context<span class=\"token punctuation\">.</span>Response<span class=\"token punctuation\">.</span>StatusCode <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>HttpStatusCode<span class=\"token punctuation\">.</span>Forbidden<span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">await</span> context<span class=\"token punctuation\">.</span>Response<span class=\"token punctuation\">.</span><span class=\"token function\">WriteAsync</span><span class=\"token punctuation\">(</span><span class=\"token interpolation-string\"><span class=\"token string\">$\"Access denied from IP: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token expression language-csharp\">remoteIp</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\">// Proceed to the next middleware in the pipeline if the IP is allowed</span>\n            <span class=\"token keyword\">await</span> <span class=\"token function\">_next</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>Step 2: Registering Middleware in <code class=\"language-text\">Program.cs</code></h3>\n<p>Now that the middleware is created, we need to register it in the request pipeline. Open your <code class=\"language-text\">Program.cs</code> file and add the <code class=\"language-text\">IPWhitelistMiddleware</code> to the pipeline using <code class=\"language-text\">app.UseMiddleware</code>.</p>\n<p>Here’s how to do that:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Add services to the container.</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddControllers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Configure IP whitelist middleware</span>\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Adding IP Whitelisting Middleware</span>\napp<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">UseMiddleware</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>BEArgentina<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span>AuthAPI<span class=\"token punctuation\">.</span>Middlewares<span class=\"token punctuation\">.</span>IPWhitelistMiddleware<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Configure the HTTP request pipeline.</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapControllers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Step 3: Configuring Allowed IPs in <code class=\"language-text\">appsettings.json</code></h3>\n<p>We’ll store the list of allowed IP addresses in the <code class=\"language-text\">appsettings.json</code> file. This makes it easy to configure and update the whitelist without touching the application’s codebase.</p>\n<p>Add the following section to your <code class=\"language-text\">appsettings.json</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"AllowedIPs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">\"192.168.1.100\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"203.0.113.42\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"203.0.113.50\"</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In this example, the application will only allow requests originating from the IP addresses <code class=\"language-text\">192.168.1.100</code>, <code class=\"language-text\">203.0.113.42</code>, and <code class=\"language-text\">203.0.113.50</code>.</p>\n<h3>Step 4: Testing the Middleware</h3>\n<p>Now that you’ve set up the middleware and configured the allowed IPs, you can test the functionality by sending requests from an unauthorized IP. The middleware should respond with:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Access denied from IP: {client IP}</code></pre></div>\n<p>If the IP address is allowed, the request will proceed as usual.</p>\n<h3>Enhancing IP Whitelisting</h3>\n<p>You can enhance the basic implementation of IP whitelisting in several ways, such as:</p>\n<ol>\n<li>\n<p><strong>Environment-Specific IP Whitelists</strong>: You may want different whitelists for different environments (development, staging, production). This can be handled by creating environment-specific configuration files (<code class=\"language-text\">appsettings.Development.json</code>, <code class=\"language-text\">appsettings.Production.json</code>).</p>\n</li>\n<li>\n<p><strong>CIDR Support</strong>: Instead of only allowing individual IP addresses, you could allow entire IP ranges using CIDR notation. This would require checking if the client’s IP falls within the allowed range.</p>\n</li>\n<li>\n<p><strong>Dynamic IP Whitelisting</strong>: You could build a more dynamic system by fetching the allowed IPs from a database or a remote API, allowing administrators to update the whitelist without restarting the application.</p>\n</li>\n</ol>\n<h3>Real-World Use Cases</h3>\n<p><strong>IP whitelisting</strong> can be useful in various scenarios:</p>\n<ol>\n<li>\n<p><strong>Internal APIs</strong>: APIs that are only intended for internal use, such as those used by company applications or within corporate networks.</p>\n</li>\n<li>\n<p><strong>Administrative Panels</strong>: Admin panels or dashboards that should only be accessible from within the office network or through a VPN.</p>\n</li>\n<li>\n<p><strong>Compliance Requirements</strong>: Some industries, such as finance or healthcare, have strict compliance requirements that mandate restricting access based on IP address.</p>\n</li>\n<li>\n<p><strong>External Service Access</strong>: APIs that allow access to external services but want to limit access to specific trusted partners or clients.</p>\n</li>\n</ol>\n<h3>Conclusion</h3>\n<p>Implementing IP whitelisting in an ASP.NET Core 8 Web API adds an additional layer of security to your application. By controlling which IP addresses can access your API, you mitigate the risk of unauthorized access, especially to sensitive or administrative endpoints.</p>\n<p>This simple yet effective technique can be easily set up using middleware in ASP.NET Core. You can also customize and enhance the whitelist logic as needed to fit more complex scenarios or requirements.</p>\n<p>By implementing this security measure, your APIs are much more robust and ready to handle real-world security challenges.</p>"}},{"node":{"frontmatter":{"title":"Stripe Payment using .NET 8 Core Microservice and React JS","date":"Sep 27, 2024","readtime":"10 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACiklEQVQozwXBWU/aAAAA4P6VJcviJgleTEAFPGq5ESg3lkLpRRHKYZFytrYrt4hMxE2cR1yWPRgfdmS/YMme97Zkj/sb+z7gxfLmIripcQRUG5Z5PajaMKtNdrXJpt5yLGw5F3ecYAQDo5jRG4EiqD2Ow1QqmM6QlXJREYC51ztaJ6gLEwug55UO3A2iTEPSW31aKxxksql6xUHn8qOJBSUcZMbLZPzpA6RYpOvVvCICL1dBU8BmPCirQa/e5tlLUO4EaUuiZjKHST1a7pA8T9eFzOQqLirBPBdk8yjHUY1aTjkGXukgKOYFj4QFyOdEcDua3jwqk2+ztc9fhNkHplSB3EEQSZLdHqu0WEWJFksIV6KaDbYlA/NrVhsG7/H8qhvx0ZlwoeqeXtUeL3PDCX73SW33PVNpLCjJdFuJukhJSpyvRjieEES23QJUBsd22G8ncQtGBEp17mzSvnkojM7hepf49fe5LRTyR6maEOTquZMxN5lGilys2iQlhe13AfWWawWCV6z+QCqHNOXieHx2PZMfPm4HYtFijWtJjrZsrogOPI01Ffy4E6sKiaZEKe1svw8sgV4wTBgD2FaIMBJs4+Lyx9frw9nAmcg+fX/6/e9P4/4Ovbrxib3C+Q3VHiBNCTtW6E4vOxwBS7uwOZaGEEbjiMwZnUjmEC+L6wUOllteXm7M7h9/fmvdTiNCPzl4h7wZxKU2rvTp3kl2NAaWQFhjDWhd0XUY1XlihkRxg5UNyUM/L/mEPja8hcp0uNsIKVNYPg1Kw4TSxzsnmfGUnbwHli1+rWtf74mtwXFDmDTup0xYDmR4KC/usE1bue2qDfdqA7/QC4ndfakXVwbJ3ilzNmUvZv8B150SuKogXmgAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/2d5dcc2b30dca75b0bab3a133db10e0a/dcd92/SecureAPI.webp","srcSet":"/static/2d5dcc2b30dca75b0bab3a133db10e0a/745fa/SecureAPI.webp 175w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/b0f73/SecureAPI.webp 350w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/dcd92/SecureAPI.webp 700w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/2d5dcc2b30dca75b0bab3a133db10e0a/1934d/SecureAPI.avif 175w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/8f8aa/SecureAPI.avif 350w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/a273d/SecureAPI.avif 700w,\n/static/2d5dcc2b30dca75b0bab3a133db10e0a/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["Stripe","ASP.NET Core",".Net 8 Core","Microservice","React.js","React Hooks"],"github":null,"external":"https://www.prafulchauhan.com/blogs/stripe-payment-using-net-8-core-microservice-and-react-js","cta":"https://www.prafulchauhan.com/blogs/stripe-payment-using-net-8-core-microservice-and-react-js"},"html":"<p>In this blog, we will walk through the process of integrating Stripe payments into a .NET 8 Core Microservice architecture with a React JS front-end. This will cover both the backend API for processing payments and the React component for capturing customer details and initiating payments.</p>\n<h2>Prerequisites</h2>\n<ol>\n<li><strong>Stripe Account</strong>: <a href=\"https://stripe.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Sign up</a> for a Stripe account.</li>\n<li><strong>Stripe API Keys</strong>: Get your publishable and secret keys from the Stripe Dashboard.</li>\n<li><strong>.NET 8 SDK</strong>: Ensure you have the latest version of the .NET 8 SDK installed.</li>\n<li><strong>React JS</strong>: Basic knowledge of React JS and how to set up a React application.</li>\n</ol>\n<hr>\n<h2>Setting Up the .NET 8 Core Microservice</h2>\n<h3>1. Create a New .NET 8 API Project</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new webapi <span class=\"token parameter variable\">-n</span> StripePaymentService\n<span class=\"token builtin class-name\">cd</span> StripePaymentService</code></pre></div>\n<h3>2. Install Stripe SDK</h3>\n<p>Add the Stripe NuGet package to your project:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet <span class=\"token function\">add</span> package Stripe.net <span class=\"token parameter variable\">--version</span> <span class=\"token number\">42.0</span>.0</code></pre></div>\n<h3>3. Configure Stripe in <code class=\"language-text\">appsettings.json</code></h3>\n<p>In the <code class=\"language-text\">appsettings.json</code> file, add your Stripe secret key.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"Stripe\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"SecretKey\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"your-stripe-secret-key\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"PublishableKey\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"your-stripe-publishable-key\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>4. Setup Stripe Service in .NET 8 Core</h3>\n<p>In the <code class=\"language-text\">Program.cs</code> file, configure Stripe services:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token class-name\"><span class=\"token keyword\">var</span></span> builder <span class=\"token operator\">=</span> WebApplication<span class=\"token punctuation\">.</span><span class=\"token function\">CreateBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Add services to the container.</span>\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">Configure</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>StripeSettings<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetSection</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Stripe\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">AddSingleton</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>IStripeClient<span class=\"token punctuation\">,</span> StripeClient<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span>sp <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> config <span class=\"token operator\">=</span> sp<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetRequiredService</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>IOptions<span class=\"token punctuation\">&lt;</span>StripeSettings<span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">StripeClient</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">.</span>SecretKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nbuilder<span class=\"token punctuation\">.</span>Services<span class=\"token punctuation\">.</span><span class=\"token function\">AddControllers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> app <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseHttpsRedirection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">UseAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">MapControllers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">Run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>5. Create a Stripe Payment Controller</h3>\n<p>Create a new controller named <code class=\"language-text\">PaymentController.cs</code> to handle the payment request.</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">ApiController</span></span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">Route</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token string\">\"api/[controller]\"</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentController</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">ControllerBase</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">IStripeClient</span> _stripeClient<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token function\">PaymentController</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">IStripeClient</span> stripeClient<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        _stripeClient <span class=\"token operator\">=</span> stripeClient<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">HttpPost</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token string\">\"create-payment-intent\"</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">async</span> <span class=\"token return-type class-name\">Task<span class=\"token punctuation\">&lt;</span>IActionResult<span class=\"token punctuation\">></span></span> <span class=\"token function\">CreatePaymentIntent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">FromBody</span></span><span class=\"token punctuation\">]</span> <span class=\"token class-name\">PaymentIntentRequest</span> request<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> options <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">PaymentIntentCreateOptions</span>\n        <span class=\"token punctuation\">{</span>\n            Amount <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span>Amount<span class=\"token punctuation\">,</span>\n            Currency <span class=\"token operator\">=</span> request<span class=\"token punctuation\">.</span>Currency<span class=\"token punctuation\">,</span>\n            PaymentMethodTypes <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">List<span class=\"token punctuation\">&lt;</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"card\"</span> <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> service <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">PaymentIntentService</span><span class=\"token punctuation\">(</span>_stripeClient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> paymentIntent <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">CreateAsync</span><span class=\"token punctuation\">(</span>options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token function\">Ok</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token punctuation\">{</span> clientSecret <span class=\"token operator\">=</span> paymentIntent<span class=\"token punctuation\">.</span>ClientSecret <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentIntentRequest</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">long</span></span> Amount <span class=\"token punctuation\">{</span> <span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Currency <span class=\"token punctuation\">{</span> <span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>6. Test the API</h3>\n<p>You can test the API using Postman or another API testing tool. Send a <code class=\"language-text\">POST</code> request to <code class=\"language-text\">https://localhost:5001/api/payment/create-payment-intent</code> with the following JSON payload:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"amount\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"currency\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"usd\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If successful, it will return a <code class=\"language-text\">clientSecret</code> which you will use in the front-end to complete the payment.</p>\n<hr>\n<h2>React JS Frontend Integration</h2>\n<h3>1. Install Stripe React and Stripe.js</h3>\n<p>In your React project, install the necessary Stripe packages:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> @stripe/react-stripe-js @stripe/stripe-js</code></pre></div>\n<h3>2. Configure Stripe in React</h3>\n<p>Set up the <code class=\"language-text\">StripeProvider</code> and <code class=\"language-text\">Elements</code> in your <code class=\"language-text\">App.js</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Elements <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@stripe/react-stripe-js'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> loadStripe <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@stripe/stripe-js'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PaymentForm <span class=\"token keyword\">from</span> <span class=\"token string\">'./PaymentForm'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> stripePromise <span class=\"token operator\">=</span> <span class=\"token function\">loadStripe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'your-publishable-key'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Elements</span></span> <span class=\"token attr-name\">stripe</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>stripePromise<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">PaymentForm</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Elements</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<h3>3. Create Payment Form Component</h3>\n<p>Create a new component <code class=\"language-text\">PaymentForm.js</code> that will handle the payment process:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> CardElement<span class=\"token punctuation\">,</span> useStripe<span class=\"token punctuation\">,</span> useElements <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@stripe/react-stripe-js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">PaymentForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>amount<span class=\"token punctuation\">,</span> setAmount<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">2000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Amount in cents</span>\n  <span class=\"token keyword\">const</span> stripe <span class=\"token operator\">=</span> <span class=\"token function\">useStripe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> elements <span class=\"token operator\">=</span> <span class=\"token function\">useElements</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> error<span class=\"token punctuation\">,</span> paymentIntent <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">createPaymentIntent</span><span class=\"token punctuation\">(</span>amount<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>error <span class=\"token operator\">&amp;&amp;</span> stripe <span class=\"token operator\">&amp;&amp;</span> elements<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">error</span><span class=\"token operator\">:</span> stripeError <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> stripe<span class=\"token punctuation\">.</span><span class=\"token function\">confirmCardPayment</span><span class=\"token punctuation\">(</span>paymentIntent<span class=\"token punctuation\">.</span>clientSecret<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">payment_method</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token literal-property property\">card</span><span class=\"token operator\">:</span> elements<span class=\"token punctuation\">.</span><span class=\"token function\">getElement</span><span class=\"token punctuation\">(</span>CardElement<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>stripeError<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Payment failed'</span><span class=\"token punctuation\">,</span> stripeError<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Payment successful'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">createPaymentIntent</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">amount</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://localhost:5001/api/payment/create-payment-intent'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">'Content-Type'</span><span class=\"token operator\">:</span> <span class=\"token string\">'application/json'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">body</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> amount<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">currency</span><span class=\"token operator\">:</span> <span class=\"token string\">'usd'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">CardElement</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">disabled</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>stripe<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Pay</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> PaymentForm<span class=\"token punctuation\">;</span></code></pre></div>\n<h3>4. Test the Frontend</h3>\n<p>Run your React application and test the payment flow by entering card details such as:</p>\n<ul>\n<li><strong>Card Number</strong>: <code class=\"language-text\">4242 4242 4242 4242</code></li>\n<li><strong>Expiration Date</strong>: Any future date</li>\n<li><strong>CVC</strong>: Any 3-digit number</li>\n</ul>\n<p>If everything is configured correctly, you should see a successful payment response in your browser.</p>\n<hr>\n<h2>Conclusion</h2>\n<p>Integrating Stripe payments with a .NET 8 Core Microservice and React JS is a powerful way to handle secure transactions. The combination of .NET for backend processing and React for handling frontend interactions ensures a smooth and efficient payment experience.</p>\n<p>This blog demonstrated setting up a microservice, processing payments with Stripe, and building a frontend interface for users. Happy coding!</p>"}},{"node":{"frontmatter":{"title":"Mastering NuGet Package Creation in .NET 8 Core: A Complete Guide to Building, Packaging, and Publishing","date":"Oct 18, 2024","readtime":"12 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACpElEQVQozwXBWU/TAAAA4P4KHowPGiMajeIgEoLcuiEbMgaFwYBxFQTG2BjsYN1R2o4dXdt1PUbp1q0dsAyUBRCEGA94IvGID8Q3H0188T/4fYC4lS7ILMtEZInKiqQkUkVV2C3lDyo770/3Dyo7YpZN0Ri27sZj69kcJysSyaY2ZbGwnQdIKiqJ5CaLp5JhLh3NSXROog/2lb1yDo2j3ebBu7V1PvuwQjgVAf95dfT7+lM+n0lnWFnJAkkS3y2wb1Qmx+GqRO6rLMsT0IqjE+x/0NRevYi0cmXQpMVWJ6DBF1lknA9PM0mElzLZ/CagZOm3hdSXiljOIN9OBCG+oukx3XrW0vK89dGQrSr//T5R1OnbnQvDBl39QMdD0jNaUjhhSxC2OGBHTh3J2C7rzUTm0zYtMqNr1HU80eru1T/VGIx1xkEEg/PKVsA5mkBXAmFvPjr3cSfC8SQjMMDwWL8bMijRWTk8MtVTL9ARyL18p62tWdeGoF5Z4TEKp3laLalJOprLpZdsY/DqdIpJ0CwJVN2+caf6JrmgK6LWDDbrd0ITE6APXmZ5Yhl2jdshNL5+9fXy778/oUgoADs2NoIobCPjwWQqAdQ01NY0aJqaHvNBawDqGjW/jKCeUMgdI3H/uu/krPL54vzw3QGZim2XCijiphJBIh5EMBiL44Ae7NV2azWNtT2GlmTY5ltbKtPuYsyulNTrXz9Oz48Ynjo83sOICCcyFEt51xxrYb83DIdwBOjqfwVaQOuUBbSAE9b+Hn2z2dKrFkWnZ8kT9JX31YvLs9MPxzgRMU+O2QKBeY/b4V11+b2+MAzojAbjYG+vuc9kGTCB3UajtkPf0d7Z0jc6ZBoZSkubOBEdm5m0zkxB9oUp2+s55+Kcy2H3rLj8nv+KmD/qs3SqrgAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/04a8104dc44cede314613fc0faf50be2/dcd92/SecureAPI.webp","srcSet":"/static/04a8104dc44cede314613fc0faf50be2/745fa/SecureAPI.webp 175w,\n/static/04a8104dc44cede314613fc0faf50be2/b0f73/SecureAPI.webp 350w,\n/static/04a8104dc44cede314613fc0faf50be2/dcd92/SecureAPI.webp 700w,\n/static/04a8104dc44cede314613fc0faf50be2/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/04a8104dc44cede314613fc0faf50be2/1934d/SecureAPI.avif 175w,\n/static/04a8104dc44cede314613fc0faf50be2/8f8aa/SecureAPI.avif 350w,\n/static/04a8104dc44cede314613fc0faf50be2/a273d/SecureAPI.avif 700w,\n/static/04a8104dc44cede314613fc0faf50be2/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":[".NET 8 Core","NuGet","IP Whitelisting","Web API"],"github":null,"external":"/blogs/mastering-nu-get-package-creation-in-net-8-core-a-complete-guide-to-building-packaging-and-publishing","cta":"/blogs/mastering-nu-get-package-creation-in-net-8-core-a-complete-guide-to-building-packaging-and-publishing"},"html":"<p>Creating a custom NuGet package is an excellent way to distribute reusable code across projects and share it with the .NET community. In this blog, we'll walk through the entire process of building and publishing a NuGet package in .NET 8 Core, using a practical example: an IP whitelisting middleware.</p>\n<p>This step-by-step guide will help you understand how to package your .NET code and publish it on the official NuGet registry for others to use.</p>\n<h3>Table of Contents</h3>\n<ol>\n<li>What is a NuGet Package?</li>\n<li>Prerequisites</li>\n<li>Step 1: Setting up Your .NET 8 Core Project</li>\n<li>Step 2: Writing the Middleware</li>\n<li>Step 3: Preparing the Project for Packaging</li>\n<li>Step 4: Adding a License</li>\n<li>Step 5: Creating the NuGet Package</li>\n<li>Step 6: Testing the NuGet Package</li>\n<li>Step 7: Publishing the NuGet Package</li>\n<li>Conclusion</li>\n</ol>\n<hr>\n<h3>1. What is a NuGet Package?</h3>\n<p>A NuGet package is essentially a compiled library that can be shared and reused across different projects. It contains assemblies, files, and metadata that describe the contents and dependencies. With NuGet, you can easily share reusable code or libraries with other developers.</p>\n<hr>\n<h3>2. Prerequisites</h3>\n<p>Before starting, make sure you have the following:</p>\n<ul>\n<li>.NET 8 SDK installed. <a href=\"https://dotnet.microsoft.com/download/dotnet/8.0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Download here</a></li>\n<li>An IDE like Visual Studio or VS Code installed.</li>\n<li>A <a href=\"https://www.nuget.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">NuGet.org</a> account for publishing the package.</li>\n<li>Basic knowledge of C# and .NET Core development.</li>\n</ul>\n<hr>\n<h3>3. Step 1: Setting up Your .NET 8 Core Project</h3>\n<p>The first step is to create a new project in .NET 8 Core.</p>\n<h4>Open your terminal and run the following commands:</h4>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new classlib <span class=\"token parameter variable\">-n</span> IPWhitelist\n<span class=\"token builtin class-name\">cd</span> IPWhitelist</code></pre></div>\n<p>This creates a new class library project named <code class=\"language-text\">IPWhitelist</code>.</p>\n<h4>Open the project in Visual Studio or your preferred IDE.</h4>\n<hr>\n<h3>4. Step 2: Writing the Middleware</h3>\n<p>We'll now write the actual middleware that will whitelist certain IP addresses and block others.</p>\n<h4>Create a file named <code class=\"language-text\">IPWhitelist.cs</code>:</h4>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre class=\"language-csharp\"><code class=\"language-csharp\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>AspNetCore<span class=\"token punctuation\">.</span>Http</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>Extensions<span class=\"token punctuation\">.</span>Configuration</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">System<span class=\"token punctuation\">.</span>Net</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token namespace\">IPWhitelist</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">IPWhitelist</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">RequestDelegate</span> _next<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">IConfiguration</span> _configuration<span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token function\">IPWhitelist</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">RequestDelegate</span> next<span class=\"token punctuation\">,</span> <span class=\"token class-name\">IConfiguration</span> configuration<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            _next <span class=\"token operator\">=</span> next<span class=\"token punctuation\">;</span>\n            _configuration <span class=\"token operator\">=</span> configuration<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">async</span> <span class=\"token return-type class-name\">Task</span> <span class=\"token function\">InvokeAsync</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpContext</span> context<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> remoteIp <span class=\"token operator\">=</span> context<span class=\"token punctuation\">.</span>Connection<span class=\"token punctuation\">.</span>RemoteIpAddress<span class=\"token punctuation\">;</span>\n            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> allowedIPs <span class=\"token operator\">=</span> _configuration<span class=\"token punctuation\">.</span><span class=\"token function\">GetSection</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"AllowedIPs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">Get</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>IPAddress<span class=\"token punctuation\">.</span><span class=\"token function\">IsLoopback</span><span class=\"token punctuation\">(</span>remoteIp<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>allowedIPs<span class=\"token punctuation\">.</span><span class=\"token function\">Contains</span><span class=\"token punctuation\">(</span>remoteIp<span class=\"token punctuation\">?.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">{</span>\n                context<span class=\"token punctuation\">.</span>Response<span class=\"token punctuation\">.</span>StatusCode <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>HttpStatusCode<span class=\"token punctuation\">.</span>Forbidden<span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">await</span> context<span class=\"token punctuation\">.</span>Response<span class=\"token punctuation\">.</span><span class=\"token function\">WriteAsync</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Access denied for IP: \"</span> <span class=\"token operator\">+</span> remoteIp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token keyword\">await</span> <span class=\"token function\">_next</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This  reads a list of allowed IP addresses from the configuration and blocks any requests coming from an IP not in the list.</p>\n<hr>\n<h3>5. Step 3: Preparing the Project for Packaging</h3>\n<p>Now we need to prepare the project for packaging. This involves updating the project file (<code class=\"language-text\">.csproj</code>) with important metadata like package name, version, description, and authors.</p>\n<h4>Open your <code class=\"language-text\">.csproj</code> file and modify it as follows:</h4>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Project</span> <span class=\"token attr-name\">Sdk</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Microsoft.NET.Sdk<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PropertyGroup</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>TargetFramework</span><span class=\"token punctuation\">></span></span>net8.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>TargetFramework</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageId</span><span class=\"token punctuation\">></span></span>IPWhitelist<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>PackageId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Version</span><span class=\"token punctuation\">></span></span>1.0.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Version</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Authors</span><span class=\"token punctuation\">></span></span>Praful Chauhan<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Authors</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Description</span><span class=\"token punctuation\">></span></span>IP whitelisting in ASP.NET Core<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Description</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageLicenseFile</span><span class=\"token punctuation\">></span></span>LICENSE.txt<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>PackageLicenseFile</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageProjectUrl</span><span class=\"token punctuation\">></span></span>https://github.com/cprafulm-gmail/IPWhitelist<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>PackageProjectUrl</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>RepositoryUrl</span><span class=\"token punctuation\">></span></span>https://github.com/cprafulm-gmail/IPWhitelist<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>RepositoryUrl</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>PropertyGroup</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ItemGroup</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageReference</span> <span class=\"token attr-name\">Include</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Microsoft.AspNetCore.Http<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">Version</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>8.0.0<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageReference</span> <span class=\"token attr-name\">Include</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Microsoft.Extensions.Configuration<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">Version</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>8.0.0<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>PackageReference</span> <span class=\"token attr-name\">Include</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Microsoft.Extensions.Configuration.Binder<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">Version</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>8.0.0<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ItemGroup</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Project</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Here’s what each property means:</p>\n<ul>\n<li><strong>PackageId</strong>: The unique identifier for your package.</li>\n<li><strong>Version</strong>: The package version.</li>\n<li><strong>Authors</strong>: Your name or organization name.</li>\n<li><strong>Description</strong>: A brief description of the package.</li>\n<li><strong>PackageLicenseFile</strong>: The location of your license file.</li>\n<li><strong>PackageProjectUrl</strong>: The URL for your project or GitHub repository.</li>\n<li><strong>RepositoryUrl</strong>: The URL for your source repository.</li>\n</ul>\n<hr>\n<h3>6. Step 4: Adding a License</h3>\n<p>To include a license with your package, create a file called <code class=\"language-text\">LICENSE.txt</code> in the root of your project directory. Here’s an example of an MIT license:</p>\n<div class=\"gatsby-highlight\" data-language=\"plaintext\"><pre class=\"language-plaintext\"><code class=\"language-plaintext\">MIT License\n\nCopyright (c) 2024 Your Name\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n...</code></pre></div>\n<p>Make sure you add the path to this file in your <code class=\"language-text\">.csproj</code> file as demonstrated above.</p>\n<hr>\n<h3>7. Step 5: Creating the NuGet Package</h3>\n<p>With the code and metadata ready, it’s time to create the actual NuGet package.</p>\n<h4>Run the following command to package your project:</h4>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet pack <span class=\"token parameter variable\">--configuration</span> Release</code></pre></div>\n<p>This will generate a <code class=\"language-text\">.nupkg</code> file in the <code class=\"language-text\">bin/Release</code> folder. The package is now ready to be published.</p>\n<hr>\n<h3>8. Step 6: Testing the NuGet Package</h3>\n<p>Before publishing your package to NuGet.org, it's a good idea to test it locally.</p>\n<h4>You can install the NuGet package locally by using:</h4>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet nuget <span class=\"token function\">add</span> <span class=\"token builtin class-name\">source</span> <span class=\"token string\">\"path/to/your/package/directory\"</span> <span class=\"token parameter variable\">-n</span> LocalPackages\ndotnet <span class=\"token function\">add</span> package IPWhitelist <span class=\"token parameter variable\">--source</span> LocalPackages</code></pre></div>\n<p>This allows you to verify the functionality of your package in a new project.</p>\n<hr>\n<h3>9. Step 7: Publishing the NuGet Package</h3>\n<p>Once you're satisfied with the package, you can publish it to NuGet.org.</p>\n<h4>Steps to Publish:</h4>\n<ol>\n<li><strong>Create a NuGet.org account</strong>: If you don’t have one already, go to <a href=\"https://www.nuget.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">NuGet.org</a> and create an account.</li>\n<li><strong>Get an API key</strong>: Go to your account settings on NuGet.org and generate an API key. You’ll need this to publish the package.</li>\n<li><strong>Publish the package</strong>: Run the following command in your terminal:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet nuget push bin/Release/IPWhitelist.1.0.0.nupkg <span class=\"token parameter variable\">-k</span> <span class=\"token operator\">&lt;</span>your-api-key<span class=\"token operator\">></span> <span class=\"token parameter variable\">-s</span> https://api.nuget.org/v3/index.json</code></pre></div>\n<p>Replace <code class=\"language-text\">&lt;your-api-key></code> with the API key you generated on NuGet.org.</p>\n<hr>\n<h3>10. Conclusion</h3>\n<p>In this blog, we walked through the process of creating, packaging, and publishing a NuGet package in .NET 8 Core. By following these steps, you can create your own reusable middleware or library, and share it with the world through NuGet.</p>\n<p>Creating and publishing NuGet packages empowers developers to build reusable, modular code that others can benefit from. Whether it’s for internal use or for the community, the process is straightforward and allows you to contribute to the broader .NET ecosystem.</p>\n<p>Happy coding!</p>"}},{"node":{"frontmatter":{"title":"Create and Publish a Custom React Hook as an NPM Package","date":"Oct 16, 2024","readtime":"10 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACqklEQVQozwGfAmD9AIJfQINdO1I5H4ZvW6R4Vq19WayYiKyZiqajori1tqysr7O0t7m5u8nDw6uhm1RVS5aMhcG0tLSloo99cQCQdmKfhG+pjXqxlYKvl4SBeG2HhX99d22Fgn6LiYSUkYqOi4SlnZfTwbqRhnCAfGq0p6GQh4SnmpebhHUAqpuRrZ6ToZaNx7ixrp+UMmJ+RYq1HzY7PkhHSFdZRFNTRFNTgXx32cO48drO6NHCyLeytKWghnx0g3RlAK6bjpqIeId+criqn7uqnUpmc1GDn0BQUz9HSkZGRzhHRjRGSHx5c9fCt6OccaiidMSzrr2qo4d6cHZoVwCXgnCpk4KxnY++qJrBrJ9gYVxQV1VLU1A4SUw7QUU3SEcrP0JeYV7Sv7JmZzWIiUnLurSsmpJ3al2QemUAo5CDqpWFtpyKin5wiWpTZVxSREpGTFBNTVRUPUdER09UR1JVTFdVsJ6SqYxw0buqs56ThnVkemZSkHJWAJ+Dapd5XqeOe6WRgZqKfYB5clxdV0VNS1dVVjlJRzVDSD1IS0JRT49tUr6Tb+rKq5yBZXNgSoNxXdu5nAB/aE1zWT2CXkCghnGdi352Z1k/RkE/Rj9PTUhUUUdTT0ZdVEpqW02tkHriw6TAo4uyn5G5noTfu5/uyaoAd2RPn4Bixpx3dFs/va+lnoNpREE3Ozw1T0g+YlpSbmVfiXx4qZaSuKGVxKqX1LWar492tqSY6cmx58OoAJRnQaZ7VZVzU4JfP9m5nvbPq41uVEdKRGdgV5aGgKiYlrajnbmkmMGkjsOiiNOxmcSgh6WLeLmXgJ96XgCUakawhWCUcVBrWkSLeWvBo4nJoHpuXUaegGW1j2++lXC7kWy8kWy5kHC3j3OdeFyHY0hyUTZVQSw/NSR2JUuWZaJ9tQAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/b1b3c134b9e43e809e89780141cd7c41/dcd92/SecureAPI.webp","srcSet":"/static/b1b3c134b9e43e809e89780141cd7c41/745fa/SecureAPI.webp 175w,\n/static/b1b3c134b9e43e809e89780141cd7c41/b0f73/SecureAPI.webp 350w,\n/static/b1b3c134b9e43e809e89780141cd7c41/dcd92/SecureAPI.webp 700w,\n/static/b1b3c134b9e43e809e89780141cd7c41/c98e3/SecureAPI.webp 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/b1b3c134b9e43e809e89780141cd7c41/1934d/SecureAPI.avif 175w,\n/static/b1b3c134b9e43e809e89780141cd7c41/8f8aa/SecureAPI.avif 350w,\n/static/b1b3c134b9e43e809e89780141cd7c41/a273d/SecureAPI.avif 700w,\n/static/b1b3c134b9e43e809e89780141cd7c41/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["NPM","ReactJS","Package","Frontend"],"github":null,"external":"/blogs/create-and-publish-a-custom-react-hook-as-an-npm-package","cta":"/blogs/create-and-publish-a-custom-react-hook-as-an-npm-package"},"html":"<p>As React developers, we often come across scenarios where we want to reuse specific logic across multiple components. React hooks make this easy, but what if you want to share your hooks with the wider community? Publishing your custom hooks as NPM packages allows you to contribute to the open-source community while making your work reusable across different projects.</p>\n<p>In this blog, I’ll guide you through the process of creating a custom hook and publishing it as an NPM package step-by-step. We will cover:</p>\n<ul>\n<li>Creating a custom hook in React.</li>\n<li>Setting up the project with Babel.</li>\n<li>Publishing the hook to NPM.</li>\n</ul>\n<p>By the end of this tutorial, you will have your own React hook published on NPM, ready for the world to use.</p>\n<p>It looked something like this:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/35cb2327167fb97a08d58a5036fc3bb9/e043d/installed_npm.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 52%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAABJklEQVQoz5WSW0sDMRCF8/9/m+CDoAgFX1rtZbdNdnKbXOZI0q5a2VZMOGSSYc58CVHDMGLzscV68w5tDEqtyKXg/pCbGZXdGrR/RNCvSHSE3e4w0QklZbjRgQYCO0ZJguPBQ48eJQu0Z4zkwUWQjQGfTqgpQbHXcNMegQa4ScMbgzQZhIlgjYWb3FnkQZMDxwLmjMAJuQpyqd2oK2cosg7Wx6+LyI9Lya85Z2st4BgRQ+gSEVSR/lwqWkIkQvG+d+llIjfVRmhGkXvsvUdK6QwhAiXNhBmldcr5grf86LNhjBHOub5vMTN/Gy4V3aOcCbXWPW50TXNeLRXIH4SNaBxHMKdrkCXCu7/vYmgtYX/YIXG6Mvu3Ya21r08vD1i9PV+dzR/7E7lREtDzstg3AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Installed NPM\"\n        title=\"Installed NPM\"\n        src=\"/static/35cb2327167fb97a08d58a5036fc3bb9/39600/installed_npm.png\"\n        srcset=\"/static/35cb2327167fb97a08d58a5036fc3bb9/1aaec/installed_npm.png 175w,\n/static/35cb2327167fb97a08d58a5036fc3bb9/98287/installed_npm.png 350w,\n/static/35cb2327167fb97a08d58a5036fc3bb9/39600/installed_npm.png 700w,\n/static/35cb2327167fb97a08d58a5036fc3bb9/57cd1/installed_npm.png 1050w,\n/static/35cb2327167fb97a08d58a5036fc3bb9/4af54/installed_npm.png 1400w,\n/static/35cb2327167fb97a08d58a5036fc3bb9/e043d/installed_npm.png 1498w\"\n        sizes=\"(max-width: 700px) 100vw, 700px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<h2>Step 1: Creating a Custom React Hook</h2>\n<p>First, let's create a simple React hook that tracks the browser window size. This can be useful for responsive layouts.</p>\n<h3>Hook Code: <code class=\"language-text\">useWindowSize</code></h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">useWindowSize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>windowSize<span class=\"token punctuation\">,</span> setWindowSize<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">width</span><span class=\"token operator\">:</span> window<span class=\"token punctuation\">.</span>innerWidth<span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">height</span><span class=\"token operator\">:</span> window<span class=\"token punctuation\">.</span>innerHeight\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">function</span> <span class=\"token function\">handleResize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setWindowSize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">width</span><span class=\"token operator\">:</span> window<span class=\"token punctuation\">.</span>innerWidth<span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">height</span><span class=\"token operator\">:</span> window<span class=\"token punctuation\">.</span>innerHeight\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resize'</span><span class=\"token punctuation\">,</span> handleResize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">handleResize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> window<span class=\"token punctuation\">.</span><span class=\"token function\">removeEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resize'</span><span class=\"token punctuation\">,</span> handleResize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> windowSize<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This hook listens to the <code class=\"language-text\">resize</code> event and updates the <code class=\"language-text\">width</code> and <code class=\"language-text\">height</code> whenever the window size changes.</p>\n<h2>Step 2: Setting Up the Project</h2>\n<p>To publish our hook as an NPM package, we need to set up a project and configure it to build our code. We will use Babel for transpiling our code into a format that can be consumed by projects using different versions of React.</p>\n<h3>1. <strong>Initialize the Project</strong></h3>\n<p>Run the following command to create a new NPM project:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> init</code></pre></div>\n<p>Fill in the details like <code class=\"language-text\">name</code>, <code class=\"language-text\">version</code>, and <code class=\"language-text\">description</code>. Here’s an example of a <code class=\"language-text\">package.json</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"usepcscustomhook\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1.0.0\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A custom hook for window size tracking\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dist/useCustomHook.js\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"babel src --out-dir dist\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"keywords\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"npm\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"custom\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"hook\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"author\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Praful Chauhan\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"license\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"MIT\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"devDependencies\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"@babel/cli\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^7.25.7\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"@babel/core\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^7.25.8\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"@babel/preset-env\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^7.25.8\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"@babel/preset-react\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^7.25.7\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"peerDependencies\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"react\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^18.0.0\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"react-dom\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^18.0.0\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>2. <strong>Install Babel and React</strong></h3>\n<p>Now, install the necessary development dependencies:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev @babel/cli @babel/core @babel/preset-env @babel/preset-react</code></pre></div>\n<p>Add a <code class=\"language-text\">.babelrc</code> configuration file to the root of your project to tell Babel how to transpile your code:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"presets\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"@babel/preset-env\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"@babel/preset-react\"</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>3. <strong>Organize Your Files</strong></h3>\n<p>In the root of your project, create the following structure:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">/src\n  - useWindowSize.js\n/dist (This will be generated after the build)\n/index.js</code></pre></div>\n<p>The <code class=\"language-text\">index.js</code> should look like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> useWindowSize <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./src/useWindowSize'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Step 3: Build the Hook</h2>\n<p>To compile your hook using Babel, run:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run build</code></pre></div>\n<p>This command will transpile the source files in <code class=\"language-text\">src/</code> to the <code class=\"language-text\">dist/</code> folder, making them ready for publication.</p>\n<h2>Step 4: Publish as an NPM Package</h2>\n<p>Now that your hook is ready, you can publish it to NPM.</p>\n<h3>1. <strong>Login to NPM</strong></h3>\n<p>Make sure you have an NPM account. If you don’t have one, <a href=\"https://www.npmjs.com/signup\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">create an account on NPM</a>.</p>\n<p>Then, log in via the command line:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> login</code></pre></div>\n<p>You will be prompted for your username, password, and email.</p>\n<h3>2. <strong>Set the Package Version</strong></h3>\n<p>Make sure your <code class=\"language-text\">package.json</code> version is set appropriately (e.g., <code class=\"language-text\">1.0.0</code>). Every time you publish a new version, you need to increment the version number.</p>\n<h3>3. <strong>Publish the Package</strong></h3>\n<p>Run the following command to publish your package:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> publish <span class=\"token parameter variable\">--access</span> public</code></pre></div>\n<p>Your hook will now be available on NPM, and you can install it in any project by running:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> usepcscustomhook</code></pre></div>\n<h2>Step 5: Adding Documentation</h2>\n<p>It’s important to provide clear instructions for using your hook. Here’s an example <code class=\"language-text\">README.md</code> for our <code class=\"language-text\">useWindowSize</code> hook:</p>\n<h3>README.md Example</h3>\n<div class=\"gatsby-highlight\" data-language=\"md\"><pre class=\"language-md\"><code class=\"language-md\"><span class=\"token title important\"><span class=\"token punctuation\">#</span> usepcscustomhook</span>\n\nA custom React hook for tracking window size.\n\n<span class=\"token title important\"><span class=\"token punctuation\">##</span> Installation</span>\n\n```bash\nnpm install usepcscustomhook</code></pre></div>\n<h2>Usage</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useWindowSize <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'usepcscustomhook'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">MyComponent</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> width<span class=\"token punctuation\">,</span> height <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useWindowSize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Window Size<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Width<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>width<span class=\"token punctuation\">}</span>px<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Height<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>height<span class=\"token punctuation\">}</span>px<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> MyComponent<span class=\"token punctuation\">;</span></code></pre></div>\n<h2>License</h2>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">MIT</code></pre></div>\n<h2>Conclusion</h2>\n<p>In this blog, we walked through the process of creating and publishing a custom React hook as an NPM package. This is a great way to make your reusable code available to the broader developer community.</p>\n<p>Now, go ahead and create your own custom hooks, and don't hesitate to share them with the world via NPM!</p>"}},{"node":{"frontmatter":{"title":"Deep Dive into JavaScript ES6 Features","date":"Oct 02, 2024","readtime":"11 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACuklEQVQozz2TzYsbdRjHn5lJJruTl5lMZjKTyds0CdlJNtl0ts1uu1a725doKh528aUIKl56E/HYgxfBP8CDF6Fv1BdE9FRoq9IWqVDwUESlPVhaoZdS/wJL/cgMWw8/Hn6Xz/N5eL6PjEYjoiii1+vRbrep1+t4nkelUqFUKmEYBrquo6gqmYyGYeiUiga2XaJatQmCKmG7QcLZ2txChsPh/8AwDGk0Gvi+j+M4WJZFoVBgYWEhhWlaDjVbYTEfUDRblJ0Orr+EV4vo9yPW19eRbrebmjWbTYIgwHXdFPTMLpvNoqqCiMLeZZNLn9lcPuNw5azL1XMeP1zwuXLWY/PQgKWlEbK2ts50usaz0Sd7Y8bjMa1WkzBsp7Ve9xHR2X7Jg4cC93ffvd36l3ByZ0I7jJAT82O8/to28/mM2WzG7PgmR4++SLw6ZbwSc3DjeTY2nkPLlHjluA93Mvzzq/D0d4E/hX//EJ78pnFyJybsRMixQzbbsyIntkxGkc2B2ODwms78hSzTscbBibDSl13DAO5oqdmjm8KnHwofvy88+FHl7TdWCTsDJGy79Pa4tJoVXKdM1TVp1Qu06ov4ro5T1nDtLCIGO/MG3NV4/LNw7bzCB+8onD4l/PKNxrtv7mNPdxmxrArFokWhaFIoFFlczJPJLqCoOiIqIloaG1HyvPpyA/4Wbn8rfPSecOsr4ZPTwu3vhFNv7aPTHSG1Wg3TNMnn8+lWk4joehZN09Ko5HI6hbyBniuyMfX5/lyFn750ufFFleufe1y76HPza5/ZkQmDwRgZDAbYtk0ul0tNMpkMqqqmwOSfNEiyaJkmluVQKoc4Xh8/GFJvjQm7Me3OKsPhiMlkgkz3709DnAAURUlhCTRpkFgneSyXy+nlVKsuQa1Ks1FLr6PXDVnqdxktR6ysjInjmP8ASjBXYnM8mZ8AAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/57a30047df84a430a466f3b928e6fa94/40bd6/SecureAPI.png","srcSet":"/static/57a30047df84a430a466f3b928e6fa94/9051f/SecureAPI.png 175w,\n/static/57a30047df84a430a466f3b928e6fa94/15da0/SecureAPI.png 350w,\n/static/57a30047df84a430a466f3b928e6fa94/40bd6/SecureAPI.png 700w,\n/static/57a30047df84a430a466f3b928e6fa94/3ad04/SecureAPI.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/57a30047df84a430a466f3b928e6fa94/2f9bd/SecureAPI.avif 175w,\n/static/57a30047df84a430a466f3b928e6fa94/8024a/SecureAPI.avif 350w,\n/static/57a30047df84a430a466f3b928e6fa94/c141d/SecureAPI.avif 700w,\n/static/57a30047df84a430a466f3b928e6fa94/ea4a7/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/57a30047df84a430a466f3b928e6fa94/9b040/SecureAPI.webp 175w,\n/static/57a30047df84a430a466f3b928e6fa94/3d0d8/SecureAPI.webp 350w,\n/static/57a30047df84a430a466f3b928e6fa94/e7e5b/SecureAPI.webp 700w,\n/static/57a30047df84a430a466f3b928e6fa94/accb3/SecureAPI.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":371}}},"tech":["JavaScript","ES6","Web Development","ReactJS"],"github":null,"external":"/blogs/deep-dive-into-java-script-es-6-features","cta":"/blogs/deep-dive-into-java-script-es-6-features"},"html":"<p>JavaScript ES6 (ECMAScript 2015) brought groundbreaking features that transformed the way we write and maintain code. These features not only made code more concise but also enhanced readability, scalability, and maintainability. Let's take a detailed dive into some of the most impactful ES6 features and understand their practical applications.</p>\n<hr>\n<h3>1. <strong>Arrow Functions</strong></h3>\n<h4>Explanation:</h4>\n<p>Arrow functions provide a more compact syntax for writing functions. They are particularly useful for short, anonymous functions, especially as callbacks. The key distinction is that arrow functions do not bind their own <code class=\"language-text\">this</code> context but inherit it from the surrounding scope, unlike traditional functions.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Syntax</strong>: Arrow functions use <code class=\"language-text\">=></code> to separate the parameters from the function body.</li>\n<li><strong>No <code class=\"language-text\">this</code> Binding</strong>: Arrow functions do not have their own <code class=\"language-text\">this</code>. They capture <code class=\"language-text\">this</code> from the lexical context.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Traditional function</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">*</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Arrow function equivalent</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">multiply</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> a <span class=\"token operator\">*</span> b<span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 15</span>\n\n<span class=\"token comment\">// Arrow functions in callbacks</span>\n<span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> squares <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">num</span> <span class=\"token operator\">=></span> num <span class=\"token operator\">*</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>squares<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: [1, 4, 9]</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>Arrow functions simplify the syntax, making code cleaner and reducing boilerplate, especially in scenarios where <code class=\"language-text\">this</code> is critical (such as event handlers or promises).</li>\n</ul>\n<hr>\n<h3>2. <strong>Template Literals</strong></h3>\n<h4>Explanation:</h4>\n<p>Template literals introduce a new way to work with strings, making it easier to construct complex strings with embedded expressions. They utilize backticks (<code class=\"language-text\">`</code>) instead of single/double quotes, enabling multi-line strings and expression interpolation.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Embedding Expressions</strong>: You can embed variables or expressions directly inside the string using <code class=\"language-text\">${}</code>.</li>\n<li><strong>Multi-line Strings</strong>: Template literals allow for natural multi-line strings without the need for concatenation or newline characters.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> <span class=\"token string\">\"John\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> age <span class=\"token operator\">=</span> <span class=\"token number\">28</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> greeting <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Hello, my name is </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> and I am </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>age<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> years old.</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>greeting<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Output: Hello, my name is John and I am 28 years old.</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>They make string construction more readable and concise, especially when working with dynamic content.</li>\n</ul>\n<hr>\n<h3>3. <strong>Destructuring Assignment</strong></h3>\n<h4>Explanation:</h4>\n<p>Destructuring assignment allows you to unpack values from arrays or properties from objects into distinct variables. This feature simplifies the extraction of values and properties, especially when dealing with nested objects or large datasets.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Array Destructuring</strong>: Extract values from arrays into variables.</li>\n<li><strong>Object Destructuring</strong>: Extract properties from objects into variables, with the option to rename them.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Array Destructuring</span>\n<span class=\"token keyword\">const</span> coordinates <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> coordinates<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 10 20</span>\n\n<span class=\"token comment\">// Object Destructuring</span>\n<span class=\"token keyword\">const</span> person <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Alice'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">age</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> age <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> person<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: Alice 32</span>\n\n<span class=\"token comment\">// Destructuring with renaming</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> personName<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">age</span><span class=\"token operator\">:</span> personAge <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> person<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>personName<span class=\"token punctuation\">,</span> personAge<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: Alice 32</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>Destructuring simplifies the process of extracting data, making code cleaner and easier to maintain, especially in complex data structures.</li>\n</ul>\n<hr>\n<h3>4. <strong>Spread Operator (<code class=\"language-text\">...</code>)</strong></h3>\n<h4>Explanation:</h4>\n<p>The spread operator (<code class=\"language-text\">...</code>) allows iterable elements (like arrays or objects) to be expanded into individual elements. This is useful when creating copies of arrays/objects, combining arrays/objects, or passing arguments to functions.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Array Manipulation</strong>: Spread operator is frequently used to merge arrays or create shallow copies.</li>\n<li><strong>Object Spread</strong>: Copy or merge object properties into a new object.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Merging arrays</span>\n<span class=\"token keyword\">const</span> arr1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> arr2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> combined <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>arr1<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>arr2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>combined<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: [1, 2, 3, 4, 5, 6]</span>\n\n<span class=\"token comment\">// Copying objects</span>\n<span class=\"token keyword\">const</span> obj1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">a</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">b</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> obj2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>obj1<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">c</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>obj2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: { a: 1, b: 2, c: 3 }</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>The spread operator allows for easier manipulation of data structures (arrays and objects), reducing the need for complex methods like <code class=\"language-text\">concat()</code> or <code class=\"language-text\">Object.assign()</code>.</li>\n</ul>\n<hr>\n<h3>5. <strong>Rest Parameter</strong></h3>\n<h4>Explanation:</h4>\n<p>The rest parameter syntax (<code class=\"language-text\">...args</code>) allows functions to accept an indefinite number of arguments as an array. It’s a more flexible way to work with multiple arguments without explicitly listing each one.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Function Arguments</strong>: The rest parameter collects all remaining function arguments into an array.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>numbers</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">total<span class=\"token punctuation\">,</span> number</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> total <span class=\"token operator\">+</span> number<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 6</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">,</span> <span class=\"token number\">40</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 100</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>Rest parameters simplify the handling of multiple arguments, especially in functions where the number of arguments may vary.</li>\n</ul>\n<hr>\n<h3>6. <strong>Async/Await</strong></h3>\n<h4>Explanation:</h4>\n<p><code class=\"language-text\">async/await</code> is a new way to work with asynchronous code in JavaScript, making it more readable and easier to follow than traditional promise chaining. By using <code class=\"language-text\">async</code> functions, you can pause code execution using <code class=\"language-text\">await</code> until a promise is resolved or rejected.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Async Functions</strong>: Declare a function as <code class=\"language-text\">async</code> to enable <code class=\"language-text\">await</code> inside it.</li>\n<li><strong>Awaiting Promises</strong>: The <code class=\"language-text\">await</code> keyword pauses execution until the promise resolves.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fetchData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://api.example.com/data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Error fetching data:'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">fetchData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>It greatly simplifies asynchronous workflows, allowing code to appear synchronous and making error handling cleaner with <code class=\"language-text\">try/catch</code> blocks.</li>\n</ul>\n<hr>\n<h3>7. <strong>Map &#x26; Set</strong></h3>\n<h4>Explanation:</h4>\n<p>ES6 introduces two new data structures: <code class=\"language-text\">Map</code> and <code class=\"language-text\">Set</code>. A <code class=\"language-text\">Map</code> is an ordered collection of key-value pairs, and a <code class=\"language-text\">Set</code> is a collection of unique values.</p>\n<ul>\n<li><strong>Map</strong>: Like an object, but allows keys of any type.</li>\n<li><strong>Set</strong>: Stores unique values of any type, preventing duplicates.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Map Example</span>\n<span class=\"token keyword\">const</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'key1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'value1'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'key2'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'value2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>map<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'key1'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: value1</span>\n\n<span class=\"token comment\">// Set Example</span>\n<span class=\"token keyword\">const</span> set <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>set<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: Set { 1, 2, 3 }</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li><code class=\"language-text\">Map</code> provides better handling for non-string keys, and <code class=\"language-text\">Set</code> ensures data uniqueness, simplifying operations like finding duplicates.</li>\n</ul>\n<hr>\n<h3>8. <strong>Default Parameters</strong></h3>\n<h4>Explanation:</h4>\n<p>Default parameters allow you to set default values for function parameters if no argument is passed, reducing the need for checks like <code class=\"language-text\">if</code> or <code class=\"language-text\">||</code>.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Function Defaults</strong>: If no argument or <code class=\"language-text\">undefined</code> is passed, the default value is used.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">greet</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'Guest'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Hello, </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">!</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">greet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: Hello, Guest!</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">greet</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Alice'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: Hello, Alice!</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>Default parameters simplify functions by reducing conditional checks for missing values, leading to cleaner, more reliable code.</li>\n</ul>\n<hr>\n<h3>9. <strong>Modules</strong></h3>\n<h4>Explanation:</h4>\n<p>ES6 modules provide a structured way to organize and share code across files, promoting better separation of concerns and reusability. By using <code class=\"language-text\">import</code> and <code class=\"language-text\">export</code>, you can share functions, objects, and variables across files.</p>\n<h4>Usage:</h4>\n<ul>\n<li><strong>Export</strong>: Declare what should be shared from a module.</li>\n<li><strong>Import</strong>: Bring the exported functionality into another file.</li>\n</ul>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// utils.js</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> add <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./utils.js'</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 5</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>Modules encourage better code organization, making projects easier to maintain and scale, while avoiding global scope pollution.</li>\n</ul>\n<hr>\n<h3>10. <strong>Map Method</strong></h3>\n<h4>Explanation:</h4>\n<p>The <code class=\"language-text\">map()</code> method creates a new array by applying a function to each element of an existing array. It is commonly used to transform arrays.</p>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> squares <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">num</span> <span class=\"token operator\">=></span> num <span class=\"token operator\">*</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>squares<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: [1, 4, 9, 16]</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>The <code class=\"language-text\">map()</code> method provides an elegant</li>\n</ul>\n<p>way to transform data, making operations on arrays both concise and expressive.</p>\n<hr>\n<h3>11. <strong>Filter Method</strong></h3>\n<h4>Explanation:</h4>\n<p>The <code class=\"language-text\">filter()</code> method creates a new array with elements that pass a test defined by a function. It’s useful for filtering out unwanted data from arrays.</p>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> evenNumbers <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">num</span> <span class=\"token operator\">=></span> num <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>evenNumbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: [2, 4]</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>The <code class=\"language-text\">filter()</code> method provides a simple way to extract only the relevant elements from arrays, improving code readability.</li>\n</ul>\n<hr>\n<h3>12. <strong>Reduce Method</strong></h3>\n<h4>Explanation:</h4>\n<p>The <code class=\"language-text\">reduce()</code> method reduces an array to a single value by applying a function to each element and accumulating the result. It’s useful for summing up values or combining them in some way.</p>\n<h4>Example:</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> sum <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">total<span class=\"token punctuation\">,</span> num</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> total <span class=\"token operator\">+</span> num<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>sum<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Output: 10</span></code></pre></div>\n<h4>Why It's Powerful:</h4>\n<ul>\n<li>The <code class=\"language-text\">reduce()</code> method provides an elegant way to condense arrays into a single value, making it ideal for aggregations and transformations.</li>\n</ul>\n<hr>\n<h3>Conclusion</h3>\n<p>ES6 revolutionized JavaScript, making it more modern, functional, and developer-friendly. Features like arrow functions, destructuring, template literals, and async/await have reshaped how developers write JavaScript, promoting cleaner, more maintainable code. By mastering these features, you can harness the full power of JavaScript to create efficient, readable, and scalable applications.</p>"}},{"node":{"frontmatter":{"title":"ASP.NET Core 8 microservices in a single solution using Docker","date":"Oct 02, 2024","readtime":"8 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4klEQVQoz0XRS1caBwCGYX5Ol111213PSdUaEaMkRhCDUuQ2wAADw3C/FVQYQfAGAlGHQgQ1JrE2Pcc26SKLtifJwtRFfsrbYzb9B+/3PbqxQI6ZSJEHQpw5X5wHQhRHpowzV2FR+YlpXwKznGclVcYcKzHlCmMUEyzJecZXRCZtIhNWP2MWge8WnOgmnDIGXxKjL8HjYBpHZoOnz68oH41wFus0nl2Q6z7DrR7gWNtlNVvh75tbXvz+JzMeGb0jxLQ9yOSyn7FFN7ofrH6M7gjmUAqTlEEoblFoD/Budkh1h+wML4mqLWqjS9LdIfZiHfV4yPVf71nr/MyYTcTgCnPfJjK+JKDTO8I8DiSwyHmexIo4iw181TZSc0Csf4lY3iPaOeWPD7cktzViBwPEaotQtclKcp0Zr8KcV8HgkL5U6gwuGVMojTVewlGoIW0fEdwfkNYuuP74Lw3tjMDpWx51XvP1lJO6dkah94LArsZyusySUmQ+kGTWE+W+LYBuxq2wKOexZVTEWpfyyRWl0WvU0RWpapPB9Tt+ffceS6nLVwY/3z+RCO30SByf49ts4y83MUfyGH1x9PYQujtdS7SAPacilPcJ7mgURr+R3OuzmlaZKPX4xhTl2wUJT6nJcmQN/9YRsaNz/LUutqyKWS7w0J9gelVCNyvEWYzk+bHQQKg08TcOUV+9JdbQ8KRV2pdvEIp7ZCq7lPuvMIfXOTi7Irzfx1vt4C7WMYVz/xcaXFEWgmmsyQ2cpW2izR6p9gnaL9dcf/zEzefP9E5f4lJKVLQLak9PCOaqhNUWyvYh9kyFhVCWWUFh0hZEN2WXeOiLf/nxDiXTPSHYHuHZOuaet8hW/yX/3NzS7D8nkK2iF9LMr3eRqy1WspuYInkeiSnulk7YJHTjy0HuYOZDWayJDXzVLu7dAU61w5y8gaOuEW4NmZPWMGUbKIfnONQ2llQFS2wdo5jG4FLQOxXuWUP8B7cuMauUG1TUAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/8153a81bf484311c1bfeb52fdf433f40/4e258/SecureAPI.png","srcSet":"/static/8153a81bf484311c1bfeb52fdf433f40/68202/SecureAPI.png 175w,\n/static/8153a81bf484311c1bfeb52fdf433f40/fe25d/SecureAPI.png 350w,\n/static/8153a81bf484311c1bfeb52fdf433f40/4e258/SecureAPI.png 700w,\n/static/8153a81bf484311c1bfeb52fdf433f40/a22cc/SecureAPI.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/8153a81bf484311c1bfeb52fdf433f40/1934d/SecureAPI.avif 175w,\n/static/8153a81bf484311c1bfeb52fdf433f40/8f8aa/SecureAPI.avif 350w,\n/static/8153a81bf484311c1bfeb52fdf433f40/a273d/SecureAPI.avif 700w,\n/static/8153a81bf484311c1bfeb52fdf433f40/49b21/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/8153a81bf484311c1bfeb52fdf433f40/745fa/SecureAPI.webp 175w,\n/static/8153a81bf484311c1bfeb52fdf433f40/b0f73/SecureAPI.webp 350w,\n/static/8153a81bf484311c1bfeb52fdf433f40/dcd92/SecureAPI.webp 700w,\n/static/8153a81bf484311c1bfeb52fdf433f40/c98e3/SecureAPI.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["ASP.NET Core",".Net 8 Core","Microservice","Docker"],"github":null,"external":"/blogs/asp-net-core-8-microservices-in-a-single-solution-using-docker","cta":"/blogs/asp-net-core-8-microservices-in-a-single-solution-using-docker"},"html":"<p>To work with multiple ASP.NET Core 8 microservices in a single solution using Docker, you can create individual Dockerfiles for each service and orchestrate them using <strong>Docker Compose</strong>. Docker Compose allows you to define and manage multiple containers (microservices) in a single configuration file (<code class=\"language-text\">docker-compose.yml</code>), making it easier to run, scale, and manage multi-container applications.</p>\n<p>Here’s a detailed step-by-step guide to containerizing multiple ASP.NET Core 8 microservices in a single solution.</p>\n<h3><strong>Scenario Overview</strong></h3>\n<p>Let’s assume you have two microservices in your solution:</p>\n<ol>\n<li><strong>HotelService</strong> (ASP.NET Core 8 Web API for hotel-related operations)</li>\n<li><strong>FlightService</strong> (ASP.NET Core 8 Web API for flight-related operations)</li>\n</ol>\n<p>Each microservice will be built and run as its own container, but Docker Compose will orchestrate them.</p>\n<hr>\n<h3><strong>Step 1: Create the Solution and Microservices</strong></h3>\n<ol>\n<li><strong>Create a new solution</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new sln <span class=\"token parameter variable\">-n</span> MicroservicesSolution\n<span class=\"token builtin class-name\">cd</span> MicroservicesSolution</code></pre></div>\n<ol start=\"2\">\n<li><strong>Create the HotelService project</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new webapi <span class=\"token parameter variable\">-n</span> HotelService</code></pre></div>\n<ol start=\"3\">\n<li><strong>Create the FlightService project</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet new webapi <span class=\"token parameter variable\">-n</span> FlightService</code></pre></div>\n<ol start=\"4\">\n<li><strong>Add the projects to the solution</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dotnet sln <span class=\"token function\">add</span> HotelService/HotelService.csproj\ndotnet sln <span class=\"token function\">add</span> FlightService/FlightService.csproj</code></pre></div>\n<hr>\n<h3><strong>Step 2: Add Docker Support to Each Microservice</strong></h3>\n<p>For each microservice, you’ll add a <code class=\"language-text\">Dockerfile</code> and <code class=\"language-text\">.dockerignore</code> file.</p>\n<h4><strong>HotelService Dockerfile</strong></h4>\n<p>Navigate to the <code class=\"language-text\">HotelService</code> folder and create a <code class=\"language-text\">Dockerfile</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerfile\"><pre class=\"language-dockerfile\"><code class=\"language-dockerfile\"><span class=\"token comment\"># Stage 1: Build the HotelService application</span>\n<span class=\"token instruction\"><span class=\"token keyword\">FROM</span> mcr.microsoft.com/dotnet/sdk:8.0 <span class=\"token keyword\">AS</span> build-env</span>\n<span class=\"token instruction\"><span class=\"token keyword\">WORKDIR</span> /app</span>\n\n<span class=\"token comment\"># Copy csproj and restore as distinct layers</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> *.csproj ./</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> dotnet restore</span>\n\n<span class=\"token comment\"># Copy the rest of the application code</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> . ./</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> dotnet publish -c Release -o out</span>\n\n<span class=\"token comment\"># Stage 2: Build the runtime image</span>\n<span class=\"token instruction\"><span class=\"token keyword\">FROM</span> mcr.microsoft.com/dotnet/aspnet:8.0</span>\n<span class=\"token instruction\"><span class=\"token keyword\">WORKDIR</span> /app</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> <span class=\"token options\"><span class=\"token property\">--from</span><span class=\"token punctuation\">=</span><span class=\"token string\">build-env</span></span> /app/out .</span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">EXPOSE</span> 80</span>\n<span class=\"token instruction\"><span class=\"token keyword\">ENTRYPOINT</span> [<span class=\"token string\">\"dotnet\"</span>, <span class=\"token string\">\"HotelService.dll\"</span>]</span></code></pre></div>\n<p>Create a <code class=\"language-text\">.dockerignore</code> file in the <code class=\"language-text\">HotelService</code> folder:</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerignore\"><pre class=\"language-dockerignore\"><code class=\"language-dockerignore\">bin/\nobj/</code></pre></div>\n<h4><strong>FlightService Dockerfile</strong></h4>\n<p>Navigate to the <code class=\"language-text\">FlightService</code> folder and create a <code class=\"language-text\">Dockerfile</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerfile\"><pre class=\"language-dockerfile\"><code class=\"language-dockerfile\"><span class=\"token comment\"># Stage 1: Build the FlightService application</span>\n<span class=\"token instruction\"><span class=\"token keyword\">FROM</span> mcr.microsoft.com/dotnet/sdk:8.0 <span class=\"token keyword\">AS</span> build-env</span>\n<span class=\"token instruction\"><span class=\"token keyword\">WORKDIR</span> /app</span>\n\n<span class=\"token comment\"># Copy csproj and restore as distinct layers</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> *.csproj ./</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> dotnet restore</span>\n\n<span class=\"token comment\"># Copy the rest of the application code</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> . ./</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> dotnet publish -c Release -o out</span>\n\n<span class=\"token comment\"># Stage 2: Build the runtime image</span>\n<span class=\"token instruction\"><span class=\"token keyword\">FROM</span> mcr.microsoft.com/dotnet/aspnet:8.0</span>\n<span class=\"token instruction\"><span class=\"token keyword\">WORKDIR</span> /app</span>\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> <span class=\"token options\"><span class=\"token property\">--from</span><span class=\"token punctuation\">=</span><span class=\"token string\">build-env</span></span> /app/out .</span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">EXPOSE</span> 80</span>\n<span class=\"token instruction\"><span class=\"token keyword\">ENTRYPOINT</span> [<span class=\"token string\">\"dotnet\"</span>, <span class=\"token string\">\"FlightService.dll\"</span>]</span></code></pre></div>\n<p>Create a <code class=\"language-text\">.dockerignore</code> file in the <code class=\"language-text\">FlightService</code> folder:</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerfile\"><pre class=\"language-dockerfile\"><code class=\"language-dockerfile\">bin/\nobj/</code></pre></div>\n<hr>\n<h3><strong>Step 3: Create the Docker Compose Configuration</strong></h3>\n<p>At the root of your solution (where the <code class=\"language-text\">.sln</code> file is located), create a <code class=\"language-text\">docker-compose.yml</code> file. This file will define and configure both microservices.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'3.8'</span>\n\n<span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">hotelservice</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">build</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">context</span><span class=\"token punctuation\">:</span> ./HotelService\n      <span class=\"token key atrule\">dockerfile</span><span class=\"token punctuation\">:</span> Dockerfile\n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">\"5001:80\"</span>\n    <span class=\"token key atrule\">networks</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> microservices<span class=\"token punctuation\">-</span>network\n    <span class=\"token key atrule\">depends_on</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> flightservice\n\n  <span class=\"token key atrule\">flightservice</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">build</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">context</span><span class=\"token punctuation\">:</span> ./FlightService\n      <span class=\"token key atrule\">dockerfile</span><span class=\"token punctuation\">:</span> Dockerfile\n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token string\">\"5002:80\"</span>\n    <span class=\"token key atrule\">networks</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> microservices<span class=\"token punctuation\">-</span>network\n\n<span class=\"token key atrule\">networks</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">microservices-network</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">driver</span><span class=\"token punctuation\">:</span> bridge</code></pre></div>\n<h3>Explanation:</h3>\n<ul>\n<li><strong>services</strong>: Defines the two microservices (hotelservice and flightservice).</li>\n<li><strong>build</strong>: Specifies the context (project folder) and the Dockerfile for each service.</li>\n<li><strong>ports</strong>: Maps the container port (80) to the host machine’s port (5001 for <code class=\"language-text\">hotelservice</code>, 5002 for <code class=\"language-text\">flightservice</code>).</li>\n<li><strong>networks</strong>: Defines a shared network (<code class=\"language-text\">microservices-network</code>) to allow the services to communicate with each other.</li>\n<li><strong>depends_on</strong>: Ensures that <code class=\"language-text\">hotelservice</code> waits for <code class=\"language-text\">flightservice</code> to be ready.</li>\n</ul>\n<hr>\n<h3><strong>Step 4: Build and Run the Microservices Using Docker Compose</strong></h3>\n<ol>\n<li>\n<p><strong>Navigate to the root directory of your solution</strong> (where the <code class=\"language-text\">docker-compose.yml</code> is located).</p>\n</li>\n<li>\n<p><strong>Build the Docker images for both services</strong>:</p>\n</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker-compose</span> build</code></pre></div>\n<ol start=\"3\">\n<li><strong>Run both microservices</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker-compose</span> up</code></pre></div>\n<p>The <code class=\"language-text\">docker-compose up</code> command will start both microservices in separate containers, map the ports, and handle communication between them.</p>\n<hr>\n<h3><strong>Step 5: Verify the Microservices</strong></h3>\n<p>Once the services are up, you can test them by visiting the following URLs:</p>\n<ul>\n<li>HotelService: <a href=\"http://localhost:5001/swagger\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http://localhost:5001/swagger</a></li>\n<li>FlightService: <a href=\"http://localhost:5002/swagger\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http://localhost:5002/swagger</a></li>\n</ul>\n<p>Both microservices should be running and accessible through their respective ports.</p>\n<hr>\n<h3><strong>Step 6: Access Microservices via Internal Network</strong></h3>\n<p>The two services are on the same Docker network (<code class=\"language-text\">microservices-network</code>). Therefore, you can communicate between services internally using their service names (<code class=\"language-text\">hotelservice</code>, <code class=\"language-text\">flightservice</code>).</p>\n<p>For example, if <code class=\"language-text\">HotelService</code> needs to make a request to <code class=\"language-text\">FlightService</code>, it would use <code class=\"language-text\">http://flightservice:80</code> internally, and similarly, <code class=\"language-text\">FlightService</code> can reach <code class=\"language-text\">HotelService</code> via <code class=\"language-text\">http://hotelservice:80</code>.</p>\n<hr>\n<h3><strong>Step 7: Stopping and Cleaning Up</strong></h3>\n<ol>\n<li><strong>Stop the containers</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker-compose</span> down</code></pre></div>\n<p>This will stop and remove the containers for both microservices.</p>\n<ol start=\"2\">\n<li><strong>Remove unused images</strong> (optional):</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker</span> image prune</code></pre></div>\n<p>This will remove unused Docker images and free up disk space.</p>\n<hr>\n<h3><strong>Step 8: Push the Microservices Images to Docker Hub (Optional)</strong></h3>\n<p>If you want to share or deploy the microservices using Docker Hub, follow these steps:</p>\n<ol>\n<li><strong>Login to Docker Hub</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker</span> login</code></pre></div>\n<ol start=\"2\">\n<li><strong>Tag the images</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker</span> tag hotelservice your_dockerhub_username/hotelservice:latest\n<span class=\"token function\">docker</span> tag flightservice your_dockerhub_username/flightservice:latest</code></pre></div>\n<ol start=\"3\">\n<li><strong>Push the images to Docker Hub</strong>:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">docker</span> push your_dockerhub_username/hotelservice:latest\n<span class=\"token function\">docker</span> push your_dockerhub_username/flightservice:latest</code></pre></div>\n<hr>\n<h3><strong>Step 9: Deploy to Cloud (Optional)</strong></h3>\n<p>You can deploy the Docker images to cloud platforms like <strong>Azure App Service for Containers</strong>, <strong>AWS ECS</strong>, or <strong>Google Cloud Run</strong>. For example, to deploy to Azure:</p>\n<ol>\n<li>Push the images to a container registry (Docker Hub, Azure Container Registry).</li>\n<li>Create an Azure App Service for Containers.</li>\n<li>Configure it to pull your images and deploy them.</li>\n</ol>\n<hr>\n<h3><strong>Conclusion</strong></h3>\n<p>By following these steps, you can containerize multiple ASP.NET Core 8 microservices in a single solution and use Docker Compose to manage them. Docker Compose simplifies the orchestration of multiple microservices, allowing you to run them simultaneously, set up networking between them, and manage dependencies.</p>\n<p>This setup is highly scalable and can be extended to include databases, caching layers, message queues, etc., in the same <code class=\"language-text\">docker-compose.yml</code> file.</p>"}},{"node":{"frontmatter":{"title":"Deep Dive into xUnit Testing in ASP.NET Core Web API","date":"Jun 29, 2024","readtime":"12 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJUlEQVQ4y11Ty27TQBT1d8A3wBcAC9iwoIlj50EawqotIIWsqArxK08VkUiQigVIhEoUBKhFCOpHbUMkioAuK8QGBRr4kTloxjP20MXRHN1zH2eux8rJc6dxYdJALnSgeyY0Dt23GDQpJseFVvQtVAIr1ZQzD5bQ8AzYn/q45BosQW5Eecm3GY7HxVmWuKLFHazEDpqxgxyfSAV6lgIHlaCNcuAwCF485lIeoOiuibxrYsHNgrldA6proRy0WVNRXGKN21Bdm+VkK8hWoYhgUbLd/NzH2re7WAzbUKUiyquhwzSaQ2OipsCdKvKSqdM7B+t4NtvA1mwD9w6H3HWWMzwcYetXorcO1lkNNXM54A7lhhT3v4+wfbSJnaMXePpzjHrssOkUtcjG89kjvPvzGu//vsTDH2NoftJwKUp2m145T3fHHb76/Rg78wlzI++HFtPYm/kE2/MnqUOqqfKV6fQbsYMK5zf3e1j9OkAtbPPrmnxfFovd+jJAY7/739NJP4rovjbtobZnM57bTVD0bfZMxEdLnoyd6plz/nxck12Z6L5FFlyTFDjXfZNUAocshl1SC3vkajQg9ahProQ9Ut3rMI3m0HyNQw8sUv7QIYr8C4mJBc9APerj+nSElekQ16YjBsqXPw5RjwbQPQOr027ylwQW8m9v4/x4GYrmWySFZxHhuOAZJO+2iOq22Ck4BdVoTjWwie6ZpBg55OJmk5w4e4r8A6HOm49pIzVeAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/13db94b88dfceeb94e52f444e9d4026f/c13f1/tripshop2.png","srcSet":"/static/13db94b88dfceeb94e52f444e9d4026f/29e34/tripshop2.png 175w,\n/static/13db94b88dfceeb94e52f444e9d4026f/27866/tripshop2.png 350w,\n/static/13db94b88dfceeb94e52f444e9d4026f/c13f1/tripshop2.png 700w,\n/static/13db94b88dfceeb94e52f444e9d4026f/26347/tripshop2.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/13db94b88dfceeb94e52f444e9d4026f/40567/tripshop2.avif 175w,\n/static/13db94b88dfceeb94e52f444e9d4026f/5e660/tripshop2.avif 350w,\n/static/13db94b88dfceeb94e52f444e9d4026f/f5920/tripshop2.avif 700w,\n/static/13db94b88dfceeb94e52f444e9d4026f/35191/tripshop2.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/13db94b88dfceeb94e52f444e9d4026f/1dac5/tripshop2.webp 175w,\n/static/13db94b88dfceeb94e52f444e9d4026f/4d0bf/tripshop2.webp 350w,\n/static/13db94b88dfceeb94e52f444e9d4026f/a646e/tripshop2.webp 700w,\n/static/13db94b88dfceeb94e52f444e9d4026f/1f347/tripshop2.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":455}}},"tech":["Software Testing","Xunit","Web Api Development","Aspnetcore","Test Automation"],"github":null,"external":"https://www.prafulchauhan.com/blogs/deep-dive-into-x-unit-testing-in-asp-net-core-web-api","cta":"https://www.prafulchauhan.com/blogs/deep-dive-into-x-unit-testing-in-asp-net-core-web-api"},"html":"<p>In the realm of software development, ensuring the reliability, correctness, and maintainability of code is paramount. Automated testing plays a pivotal role in achieving these objectives, and among the plethora of testing frameworks available, xUnit stands out as a powerful and versatile tool. In this in-depth guide, we’ll embark on a journey to...</p>\n<!-- Deja-Vu Tours Treks and Travel plans amazing adventures just for you. They offer personalized trips to different places, including tours, treks, and travel packages. Their team of experts takes care of everything from accommodations to transportation, making sure you're safe and happy.\n\nYou can easily book your trip online for added convenience. Explore fascinating cultures and stunning landscapes with Deja-Vu Tours Treks and Travel. They handle the logistics while you have an unforgettable experience. -->"}},{"node":{"frontmatter":{"title":"Secure Web API by Key Authentication in ASP.NET Core","date":"Jun 29, 2024","readtime":"12 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcklEQVQ4y12TW08TURSF+xv0RWrodKadll6HoS3Tlt5bFJpSAmkplUupKASIF0xU8BYIkcREYqKJkYQHeVNefDCGmBATf9lnzpQptQ8r57b3OuvstY9NlmWcTifWaEGsBSTJgT8QpFVvsjmZYS5t0G5tYMRTOJ0SiqJ0ciWJ64M3sVmJvST9EGftxRV2l+9w8GKf2nwb+8ANPB6PeS5ITWJFwdavzuVy4Xa7u0EiyW4fYGFplc9fTjn5ekY6WzCVq6rajbNg61VnbQpCAYvcNzTERHmao08n7Lw+xOMdwu12mYQixoLgsPWTibkVINbpdJZKZZZaY4mDdx+Zml1AkqSuOofD0RVgElp18nq9jI2NMaJH0HWdWMwgGo3Sat1lbXObZ7v7nJx+ozrTwIgliEZjhMNhisUigUDgSmHnyTKaptFsNrk1XqZWb7C6eo9SqcTR+w+c/77g4s9ffvw8pza3yHyjSbU6RaVS4fj4GMMwTNXdGgqIJ8RiMTQtQjw6SilXJKRprK9v8PjJDiv3H/B0d49EKosvGDLVh0IhstksPp+va6itt11EHRyyTCGi8/3Vc1KGQXhYZ6JcpV5vksuXGA2HKWcyXdNEvlX7jimXLotN0zVVJexVeTmV59fhHm8fbpEcGebR9CRGKMBaMcXZ9hrt8TyyaZ7yXx/b5J6fYTktguJ+D8vZBG+WGkzHdZoJnRljmK2SwWJKJ6C6cfZ1x5XCnsYWF0hOJ16Xi1G/l4hHIR30UtB85DU/OT1oPleSr4g6Ii5dvjZoNwnkS+JuPRUX6WSC8VyW2/kchUyKZDJBJBpDVT3mxeKr9f59Mf4DN3ukMStSBU4AAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/ff193eeaa61c663d9660b1b3053537b5/3e1ab/SecureAPI.png","srcSet":"/static/ff193eeaa61c663d9660b1b3053537b5/57a76/SecureAPI.png 175w,\n/static/ff193eeaa61c663d9660b1b3053537b5/f00e6/SecureAPI.png 350w,\n/static/ff193eeaa61c663d9660b1b3053537b5/3e1ab/SecureAPI.png 700w,\n/static/ff193eeaa61c663d9660b1b3053537b5/9f3f1/SecureAPI.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/ff193eeaa61c663d9660b1b3053537b5/50167/SecureAPI.avif 175w,\n/static/ff193eeaa61c663d9660b1b3053537b5/5a8a9/SecureAPI.avif 350w,\n/static/ff193eeaa61c663d9660b1b3053537b5/bc4f6/SecureAPI.avif 700w,\n/static/ff193eeaa61c663d9660b1b3053537b5/5be71/SecureAPI.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/ff193eeaa61c663d9660b1b3053537b5/81b0f/SecureAPI.webp 175w,\n/static/ff193eeaa61c663d9660b1b3053537b5/bfc62/SecureAPI.webp 350w,\n/static/ff193eeaa61c663d9660b1b3053537b5/74bac/SecureAPI.webp 700w,\n/static/ff193eeaa61c663d9660b1b3053537b5/b7a7f/SecureAPI.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":467}}},"tech":["Api Development","Asp.net","Web Api Development","Security Services","Authentication"],"github":null,"external":"https://www.prafulchauhan.com/blogs/secure-web-api-by-key-authentication-in-asp-net-core","cta":"https://www.prafulchauhan.com/blogs/secure-web-api-by-key-authentication-in-asp-net-core"},"html":"<p>When you’re dealing with Web APIs or REST APIs, it’s important to keep the endpoints secure. One common way to do this is by using something called API Keys. API Keys are special codes that serve as a kind of password for accessing these endpoints. They’re usually stored in files like appsettings.json or other storage places. In this article, we’ll...</p>"}},{"node":{"frontmatter":{"title":"Razorpay Payment Gateway Integration using ASP.NET Core Clean Architecture and React JS","date":"Jun 29, 2023","readtime":"12 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnUlEQVQoz2WLW0uTAQCGv58Q9CPqJuoiqAjNA3iKNE0syzSdRZZ0pxEREtG0xLIIzTQyh4ZOy6ZN89CcrjbNWWtirs2Vm9vcPpsz3drY4QmMyOiF5+KF5xES75nYStJ9E4n1JhLvzhNX/4WD982bP6F+nqQHCyQ3fCWh/q+fcPczyY129lx6wvY9BxBSmxbYSspDC2nNVo42m7lZp+HMg1nSmyxkPP5Gwq0pdhc3k9YwT+ojKylNlk0/vcVGvFTFLokUIUtm4w+ZMjv5L5bJbF1kR62F4xVyauoUxHWKHJS+ZX92FfmlNcTVTpPWtsTh9kWy2+1ktdk42rHMse41hDy5k+NyJ7mdTk4/d9CnMCC5oWFbiZqdN8fZ3mWjeEjkUPUEyUllVLeMUPPGQaHCQ26Pi5M9y5t9XpeDvE47QmG/SJFSJF/hoaTjK42t05x8aibn9nv21hioUrlotvjJaJil+PoAshkvlydclA3ZqB53Ujbo4tSrFc4oRQpfiQilI14ko17ODn8npdfNEU2AkgEPJe0LXJBbqVS7ufzxBwW9LvZd1ZFRO0lln5lBmx/ZmAmj1UX1tJeCYS/nVF6Eixof5RM+zo/5ODG0wh2dm5xuJ0WDbiRKF1c0IkP2IOXjq+yWfiDr4Rx1c34KP/3k2qQLggEWfQFUdj8mbxDhqhUq5+CcPkjrtyBGsxuJYok7c35ufFyn0bjKOzHEgC1Av3GFD0s/UFrXUYsR/Pw/IUvaSMXoZ2SOGK+dP5kQQ+jdARwbYdZCEYLhKJFI9J+o22TnWe9LDFOTaHU6tFodY+px3B4PQnzKIbr6lQSB1fUgvo0wXn8YcT2MuPGb7/4I0ViMSDRGKBpjcknE8MmIwWBgZmYGvV6PVqvF5/PxCxikZamTHT7KAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/8dca34942874ea546bcd08259d84178e/18b2e/tourwiz1.png","srcSet":"/static/8dca34942874ea546bcd08259d84178e/a4d46/tourwiz1.png 175w,\n/static/8dca34942874ea546bcd08259d84178e/d8f52/tourwiz1.png 350w,\n/static/8dca34942874ea546bcd08259d84178e/18b2e/tourwiz1.png 700w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/8dca34942874ea546bcd08259d84178e/19d98/tourwiz1.avif 175w,\n/static/8dca34942874ea546bcd08259d84178e/46c45/tourwiz1.avif 350w,\n/static/8dca34942874ea546bcd08259d84178e/12925/tourwiz1.avif 700w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/8dca34942874ea546bcd08259d84178e/eac4f/tourwiz1.webp 175w,\n/static/8dca34942874ea546bcd08259d84178e/a4795/tourwiz1.webp 350w,\n/static/8dca34942874ea546bcd08259d84178e/377b6/tourwiz1.webp 700w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":350}}},"tech":["Razorpay","ASP.NET Core","Clean Architecture","React.js","React Hooks"],"github":"","external":"https://www.prafulchauhan.com/blogs/razorpay-payment-gateway-integration-using-asp-net-core-clean-architecture-and-react-js","cta":null},"html":"<p>In the digital age, online payment processing has become a vital component for businesses of all sizes. Integrating a reliable and secure payment gateway is crucial to provide a seamless experience for customers. One such popular payment gateway is Razorpay, known for its simplicity, robustness, and extensive features. In this blog, we will explore...</p>\n<!--\n- Managing frontend development from start to finish.\n- Writing effective APIs.\n- Managing databases in MS SQL Server (2008, 2012, 2017).\n- Testing software to ensure responsiveness and efficiency.\n- Creating security and data protection settings.\n- Daily scrum meetings to discuss the status of allocated tasks with the team.\n-->"}},{"node":{"frontmatter":{"title":"Microservices Communication with Ocelot in ASP.NET Core Web API","date":"Jun 29, 2022","readtime":"12 min read","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4ElEQVQozzWS3U9TBxjG33NOT08/bOnphz0tpayUArbKENCsVpRsrYhzm3wEO0XUjYKdc8qAtq4alw0GQtJliQHdmHNGL7YRr7frbXe72/6f31KIN2/yvsn7y/PkecQdszC8HlQRFNFRlQO4jAR+X47I4RLRmW0yj/6iZ+V3WscaxHrL+H2ncBlJNNVEREcRG6qoaKIgumFgs+0fNcXEZe8iaJ4mkf6YSP4+sdor+n75l56f/iF+Zxdr+B7tXVcIB97B48igKwdRxYXa/G8Cm8pU0VDFjVPvJOQdJmAVufLpY+rfbBEbXSRbfcHAwo+88d59Lt94wNKD54Tj00QDBTx6L7oSRhEHmqhIczQXmxzE5xwgbk0Sz9wmN1rl6bNdavUGS7UGi9VNbn++xs7OSyamvyae+YzO9iLBA6dxqyk08e4Jk33vXlxqNyHPMLHWIt0Dy4SCb1OvPeTPv/9js7HDk51f2f3tD7Yf/UxbtED6aIVkYoaoeQ6f3o9dLFTRm0ANXQL47MdpazlPMj7L4GCdeKjAhxPzTJW/ZGX9Mc+fveLc9buU5yt0hPMM9lU4lJgnGbqIZZzEJW1oYrwGegkqvWQCUwyll/ng1AYnOmc5ni6wur5F4+EPfLfxPRvfPiWfGyfbMcP7Q2sU+u5y1LpKTM/hlig2se9btokTU9pJe0YZ6bhJKbvK1OEq/YECV8dLrK9usvLVGrMXb/BW5F3G0wvMndxkPLNAnzlJWD2CIS1oYmuGouxF7pAW2vQ3OWGOcbnzFuWee8ylKlyKfsTWzW1e1l9wPVGmlFyk1P0F11IL5K0iSecQLUormthRRF4D1b2DRwmTsPWS9eQ575/kmjXHregdlqxlauFlKrEqs9FPmAhNk/OMcMg4RkBrxy4udMOJI2Du97BZnSZUFwduxYdfIhzx9zOSOsuF1AWm00Vm0peY7BrjTOIMxyJZQkoMrxLAEPdeXXSXE0fQ5H+8dWS6Gkx1EwAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/619162723a389cef3493919b1e29d447/bc3b9/wms.png","srcSet":"/static/619162723a389cef3493919b1e29d447/9a130/wms.png 175w,\n/static/619162723a389cef3493919b1e29d447/a3fa1/wms.png 350w,\n/static/619162723a389cef3493919b1e29d447/bc3b9/wms.png 700w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/619162723a389cef3493919b1e29d447/dae43/wms.avif 175w,\n/static/619162723a389cef3493919b1e29d447/d7667/wms.avif 350w,\n/static/619162723a389cef3493919b1e29d447/7ec1a/wms.avif 700w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/619162723a389cef3493919b1e29d447/5d873/wms.webp 175w,\n/static/619162723a389cef3493919b1e29d447/26a00/wms.webp 350w,\n/static/619162723a389cef3493919b1e29d447/f23f0/wms.webp 700w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":394}}},"tech":["Microservices","Ocelots","Aspnet Core Web Api","Api Gateway","Routing"],"github":null,"external":"https://www.prafulchauhan.com/blogs/microservices-communication-with-ocelot-in-asp-net-core-web-api","cta":"https://www.prafulchauhan.com/blogs/microservices-communication-with-ocelot-in-asp-net-core-web-api"},"html":"<p>In a microservices architecture, managing communication between services can become complex. Each service may have its own endpoints and protocols, leading to challenges in routing and maintaining consistency. This is where Ocelot comes in — a middleware framework for ASP.NET Core that simplifies the process of building and maintaining APIs...</p>"}}]}}}