<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ToolBench</title>
    <description>The latest articles on DEV Community by ToolBench (@toolbenchapp).</description>
    <link>https://dev.to/toolbenchapp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4017715%2Fd8719e20-3644-4440-8f65-20f7a4d9d80b.png</url>
      <title>DEV Community: ToolBench</title>
      <link>https://dev.to/toolbenchapp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toolbenchapp"/>
    <language>en</language>
    <item>
      <title>ASP.NET Core Output Caching: How to Make Web APIs Faster in .NET</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Mon, 17 Aug 2026 12:48:43 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/aspnet-core-output-caching-how-to-make-web-apis-faster-in-net-2n8</link>
      <guid>https://dev.to/toolbenchapp/aspnet-core-output-caching-how-to-make-web-apis-faster-in-net-2n8</guid>
      <description>&lt;h1&gt;
  
  
  ASP.NET Core Output Caching: How to Make Web APIs Faster in .NET
&lt;/h1&gt;

&lt;p&gt;When an API receives the same request repeatedly, performing the same database query and rebuilding the same response every time can waste valuable resources.&lt;/p&gt;

&lt;p&gt;For example, imagine this endpoint:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If thousands of users request the same product catalog, your application might repeatedly:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Request
      ↓
Controller
      ↓
Database Query
      ↓
Business Logic
      ↓
JSON Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For data that doesn't change frequently, this can create unnecessary database load.&lt;/p&gt;

&lt;p&gt;ASP.NET Core provides &lt;strong&gt;Output Caching&lt;/strong&gt; to help solve this problem.&lt;/p&gt;

&lt;p&gt;Instead of executing the complete request pipeline every time, the application can temporarily store the generated response and reuse it for subsequent requests.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll look at how Output Caching works, how to configure it, how to invalidate cached responses, and when you should avoid using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Output Caching?
&lt;/h2&gt;

&lt;p&gt;Output caching stores the generated response from an endpoint.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First request
    ↓
GET /api/products
    ↓
Execute controller
    ↓
Query database
    ↓
Generate response
    ↓
Store response in cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Later:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Second request
    ↓
GET /api/products
    ↓
Cached response
    ↓
Return immediately
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The database doesn't need to be queried again while the cached response is valid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Output Caching vs Response Caching
&lt;/h2&gt;

&lt;p&gt;These two concepts are often confused.&lt;/p&gt;

&lt;h3&gt;
  
  
  Response Caching
&lt;/h3&gt;

&lt;p&gt;Response caching mainly relies on HTTP caching semantics and headers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Output Caching
&lt;/h3&gt;

&lt;p&gt;Output caching is controlled by ASP.NET Core and allows your application to decide which responses should be cached and for how long.&lt;/p&gt;

&lt;p&gt;Output caching provides more control over server-side response caching.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Add Output Caching
&lt;/h1&gt;

&lt;p&gt;Start by registering the output-cache services.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

builder.Services.AddOutputCache();

var app = builder.Build();

app.UseOutputCache();

app.MapControllers();

app.Run();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important pieces are:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AddOutputCache()
    ↓
Configure caching
    ↓
UseOutputCache()
    ↓
Apply caching policies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  2. Cache an API Endpoint
&lt;/h1&gt;

&lt;p&gt;You can apply output caching to an endpoint using the OutputCache attribute.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    [OutputCache(Duration = 60)]
    public IActionResult GetProducts()
    {
        return Ok(new[]
        {
            new { Id = 1, Name = "Laptop" },
            new { Id = 2, Name = "Keyboard" },
            new { Id = 3, Name = "Mouse" }
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The response can now be cached for 60 seconds.&lt;/p&gt;

&lt;p&gt;During that period, subsequent requests can receive the cached response instead of executing the controller again.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Why This Can Improve Performance
&lt;/h1&gt;

&lt;p&gt;Without caching:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1 → Database
Request 2 → Database
Request 3 → Database
Request 4 → Database
Request 5 → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With output caching:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1 → Database → Cache
Request 2 → Cache
Request 3 → Cache
Request 4 → Cache
Request 5 → Cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This can significantly reduce repeated work for suitable endpoints.&lt;/p&gt;

&lt;p&gt;The biggest benefit is often reduced load on downstream dependencies such as databases and external APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Configure a Default Cache Policy
&lt;/h1&gt;

&lt;p&gt;Instead of adding attributes to every endpoint, you can define policies.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder.Services.AddOutputCache(options =&amp;gt;
{
    options.AddPolicy("ProductsPolicy", policy =&amp;gt;
    {
        policy.Expire(TimeSpan.FromMinutes(5));
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then apply the policy:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[OutputCache(PolicyName = "ProductsPolicy")]
[HttpGet]
public IActionResult GetProducts()
{
    return Ok(products);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This makes caching rules easier to manage as your application grows.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Cache by Query String
&lt;/h1&gt;

&lt;p&gt;Consider an endpoint:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products?category=laptop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products?category=mobile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;These requests should not necessarily receive the same cached response.&lt;/p&gt;

&lt;p&gt;You can configure caching based on query-string values.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder.Services.AddOutputCache(options =&amp;gt;
{
    options.AddPolicy("ProductsPolicy", policy =&amp;gt;
    {
        policy
            .Expire(TimeSpan.FromMinutes(5))
            .SetVaryByQuery("category");
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now the cache can maintain separate responses for different category values.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/products?category=laptop
    ↓
Cache A

/products?category=mobile
    ↓
Cache B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  6. Cache by Header
&lt;/h1&gt;

&lt;p&gt;Sometimes the response depends on a request header.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accept-Language
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If your API returns localized content, caching should take the language into account.&lt;/p&gt;

&lt;p&gt;A policy can vary based on request headers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;options.AddPolicy("LocalizedPolicy", policy =&amp;gt;
{
    policy
        .Expire(TimeSpan.FromMinutes(5))
        .SetVaryByHeader("Accept-Language");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now English and Hindi responses, for example, can be cached separately.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Be Careful With User-Specific Data
&lt;/h1&gt;

&lt;p&gt;This is one of the most important Output Caching considerations.&lt;/p&gt;

&lt;p&gt;Suppose you have:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and the response is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "name": "User A",
    "email": "usera@example.com"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If you cache this incorrectly, another user could potentially receive the wrong cached response.&lt;/p&gt;

&lt;p&gt;That's a serious security problem.&lt;/p&gt;

&lt;p&gt;Be very careful when caching endpoints containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User profiles&lt;/li&gt;
&lt;li&gt;Account information&lt;/li&gt;
&lt;li&gt;Payments&lt;/li&gt;
&lt;li&gt;Orders&lt;/li&gt;
&lt;li&gt;Private documents&lt;/li&gt;
&lt;li&gt;Authorization-specific information&lt;/li&gt;
&lt;li&gt;Personalized dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caching should never accidentally share private data between users.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Public vs Personalized Endpoints
&lt;/h1&gt;

&lt;p&gt;A useful rule is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public data
    ↓
Usually good candidate for caching

User-specific data
    ↓
Requires careful cache variation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;might be an excellent caching candidate.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/my-orders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;requires much more careful consideration.&lt;/p&gt;

&lt;p&gt;Before enabling caching, ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can two different users safely receive the same response?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is no, don't use a simple shared output-cache policy.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Cache Expiration
&lt;/h1&gt;

&lt;p&gt;The cache duration should depend on how frequently the data changes.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product categories
    → 30 minutes

Product catalog
    → 5 minutes

Frequently changing stock
    → Very short duration

Real-time account balance
    → Usually don't cache this way
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There is no universal cache duration.&lt;/p&gt;

&lt;p&gt;The correct value depends on your application's consistency requirements.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Cache Invalidation
&lt;/h1&gt;

&lt;p&gt;Caching introduces an important question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens when the underlying data changes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product price = ₹50,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The response is cached.&lt;/p&gt;

&lt;p&gt;Then the database changes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product price = ₹45,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the cache is still valid, users might continue seeing:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;₹50,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;until the cache expires or is invalidated.&lt;/p&gt;

&lt;p&gt;This is why cache invalidation is one of the most important parts of a caching strategy.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Evict Cached Responses
&lt;/h1&gt;

&lt;p&gt;When application data changes, you may need to remove related cached responses.&lt;/p&gt;

&lt;p&gt;For example, after updating a product:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Update product
    ↓
Save database changes
    ↓
Evict relevant cached response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This ensures the next request generates fresh data.&lt;/p&gt;

&lt;p&gt;ASP.NET Core provides output-cache APIs that can be used to control cache eviction.&lt;/p&gt;

&lt;p&gt;The exact strategy depends on how your endpoints and policies are structured.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Cache Only What Actually Benefits From Caching
&lt;/h1&gt;

&lt;p&gt;Caching everything is not a good strategy.&lt;/p&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If this endpoint takes 500 ms because of expensive database work, caching may provide a large benefit.&lt;/p&gt;

&lt;p&gt;But if another endpoint takes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;caching it may add complexity without meaningful performance improvement.&lt;/p&gt;

&lt;p&gt;A good caching strategy focuses on endpoints that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frequently requested&lt;/li&gt;
&lt;li&gt;Relatively expensive&lt;/li&gt;
&lt;li&gt;Safe to cache&lt;/li&gt;
&lt;li&gt;Not changing constantly&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  13. Output Caching and Database Performance
&lt;/h1&gt;

&lt;p&gt;Consider an API receiving:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000 requests/minute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If every request performs the same database query, the database receives:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000 queries/minute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the response can safely be cached for one minute, the application might perform dramatically fewer database queries.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000 API requests
       ↓
   Output Cache
       ↓
Small number of DB queries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This can reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database CPU&lt;/li&gt;
&lt;li&gt;Network traffic&lt;/li&gt;
&lt;li&gt;Query execution&lt;/li&gt;
&lt;li&gt;Application CPU&lt;/li&gt;
&lt;li&gt;API response latency&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  14. Output Caching and External APIs
&lt;/h1&gt;

&lt;p&gt;Caching isn't only useful for databases.&lt;/p&gt;

&lt;p&gt;Suppose your API calls an external service:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your API
   ↓
External API
   ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the same external data is requested repeatedly, output caching can reduce unnecessary calls.&lt;/p&gt;

&lt;p&gt;This can be particularly useful when an external API has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rate limits&lt;/li&gt;
&lt;li&gt;Usage costs&lt;/li&gt;
&lt;li&gt;Slow response times&lt;/li&gt;
&lt;li&gt;Network latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, make sure cached data is still acceptable for your business requirements.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Don't Cache Sensitive Responses
&lt;/h1&gt;

&lt;p&gt;Avoid blindly caching responses containing sensitive information.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment information
Authentication responses
Personal information
Security tokens
Private account data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Caching mistakes can become security vulnerabilities.&lt;/p&gt;

&lt;p&gt;Before caching an endpoint, understand exactly what data the response contains.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Output Caching in a Multi-Instance Application
&lt;/h1&gt;

&lt;p&gt;Consider an application running with multiple instances:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load Balancer
      ↓
┌─────┼─────┐
↓     ↓     ↓
API1  API2  API3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now caching becomes a distributed-system consideration.&lt;/p&gt;

&lt;p&gt;If each instance maintains its own cache, you could have:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API1 → Cache A
API2 → Cache B
API3 → Cache C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The cached data may not be identical between instances.&lt;/p&gt;

&lt;p&gt;For larger systems, you should understand how your deployment architecture handles cache storage and consistency.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Cache-Control Is Not the Same Thing
&lt;/h1&gt;

&lt;p&gt;Don't confuse server-side Output Caching with browser caching.&lt;/p&gt;

&lt;p&gt;Browser caching is controlled through HTTP caching headers and client behavior.&lt;/p&gt;

&lt;p&gt;Output caching is an application-side mechanism for reusing generated responses.&lt;/p&gt;

&lt;p&gt;A complete caching architecture can involve multiple layers:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
CDN
   ↓
Reverse Proxy
   ↓
ASP.NET Core Output Cache
   ↓
Application
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Each layer has different responsibilities.&lt;/p&gt;




&lt;h1&gt;
  
  
  18. Measure Before and After
&lt;/h1&gt;

&lt;p&gt;Don't assume caching automatically makes everything faster.&lt;/p&gt;

&lt;p&gt;Measure your application.&lt;/p&gt;

&lt;p&gt;Look at:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Response time
Database CPU
Database query count
API throughput
Application CPU
Memory usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before caching
Average response: 450 ms

After caching
Average response: 35 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The actual improvement depends on your workload.&lt;/p&gt;




&lt;h1&gt;
  
  
  19. Common Output Caching Mistakes
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Mistake 1: Caching User-Specific Data
&lt;/h3&gt;

&lt;p&gt;This can cause data leakage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 2: Cache Duration Is Too Long
&lt;/h3&gt;

&lt;p&gt;Users may receive stale information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 3: Cache Duration Is Too Short
&lt;/h3&gt;

&lt;p&gt;The application may receive little benefit from caching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 4: Caching Everything
&lt;/h3&gt;

&lt;p&gt;This adds unnecessary complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 5: Ignoring Cache Invalidation
&lt;/h3&gt;

&lt;p&gt;Data updates may not become visible immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 6: Not Measuring Performance
&lt;/h3&gt;

&lt;p&gt;Caching should be driven by actual performance data.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Practical Example
&lt;/h1&gt;

&lt;p&gt;Suppose your application has:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products
GET /api/categories
GET /api/orders
GET /api/profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A sensible starting point could be:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/products
    → Cache for 5 minutes

/categories
    → Cache for 30 minutes

/orders
    → Carefully evaluate

/profile
    → Avoid shared output caching
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The exact values should depend on your application's requirements.&lt;/p&gt;




&lt;h1&gt;
  
  
  Production Checklist
&lt;/h1&gt;

&lt;p&gt;Before enabling Output Caching, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Is this endpoint safe to cache?&lt;/li&gt;
&lt;li&gt;[ ] Is the response public or user-specific?&lt;/li&gt;
&lt;li&gt;[ ] How frequently does the data change?&lt;/li&gt;
&lt;li&gt;[ ] What cache duration makes sense?&lt;/li&gt;
&lt;li&gt;[ ] Does the response vary by query string?&lt;/li&gt;
&lt;li&gt;[ ] Does it vary by headers?&lt;/li&gt;
&lt;li&gt;[ ] What happens when the underlying data changes?&lt;/li&gt;
&lt;li&gt;[ ] Do we need cache invalidation?&lt;/li&gt;
&lt;li&gt;[ ] Are multiple application instances involved?&lt;/li&gt;
&lt;li&gt;[ ] Have we measured performance before and after caching?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Output caching can be one of the simplest ways to reduce repeated work in an ASP.NET Core application.&lt;/p&gt;

&lt;p&gt;But the goal isn't:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Cache everything."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Cache the right responses for the right amount of time."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Start with endpoints that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frequently requested&lt;/li&gt;
&lt;li&gt;Expensive to generate&lt;/li&gt;
&lt;li&gt;Relatively stable&lt;/li&gt;
&lt;li&gt;Safe to share&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then measure the results.&lt;/p&gt;

&lt;p&gt;A good caching strategy can reduce database load, improve API response times, and help your application handle more traffic without simply adding more infrastructure.&lt;/p&gt;

&lt;p&gt;The most important rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Performance should never come at the cost of correctness or security.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Small Developer Tool for Everyday Development
&lt;/h2&gt;

&lt;p&gt;While working with APIs and debugging applications, developers frequently need quick utilities for formatting JSON, decoding JWTs, comparing API responses, converting data formats, and handling other small development tasks.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;ToolBench&lt;/strong&gt; — a collection of free browser-based developer tools designed for everyday development work.&lt;/p&gt;

&lt;p&gt;Explore it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can be a handy companion when you're working with .NET APIs, JSON, authentication tokens, and other common development tasks.&lt;/p&gt;




&lt;p&gt;How are you handling caching in your ASP.NET Core applications?&lt;/p&gt;

&lt;p&gt;Are you using Output Caching, Redis, a CDN, browser caching, or a combination of these?&lt;/p&gt;

&lt;p&gt;Share your approach in the comments.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>aspnetcore</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>ASP.NET Core Background Services: How to Run Reliable Background Tasks in .NET</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Thu, 13 Aug 2026 12:30:08 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/aspnet-core-background-services-how-to-run-reliable-background-tasks-in-net-7p2</link>
      <guid>https://dev.to/toolbenchapp/aspnet-core-background-services-how-to-run-reliable-background-tasks-in-net-7p2</guid>
      <description>&lt;h1&gt;
  
  
  ASP.NET Core Background Services: How to Run Reliable Background Tasks in .NET
&lt;/h1&gt;

&lt;p&gt;Not every task in a web application should run inside an HTTP request.&lt;/p&gt;

&lt;p&gt;Sending emails, processing files, generating reports, consuming messages from a queue, cleaning old records, and synchronizing data are all examples of work that can run in the background.&lt;/p&gt;

&lt;p&gt;If we perform these operations directly inside a controller, we can create slow requests, unnecessary timeouts, and poor user experiences.&lt;/p&gt;

&lt;p&gt;ASP.NET Core provides a clean solution for this through &lt;code&gt;BackgroundService&lt;/code&gt; and &lt;code&gt;IHostedService&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll build a practical background worker, understand how it works, and look at some production considerations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Do We Need Background Services?
&lt;/h2&gt;

&lt;p&gt;Consider an API endpoint that generates a large report.&lt;/p&gt;

&lt;p&gt;A simple implementation might look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HttpPost("generate-report")]
public async Task&amp;lt;IActionResult&amp;gt; GenerateReport()
{
    await GenerateLargeReportAsync();

    return Ok();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The client has to wait until the entire report is generated.&lt;/p&gt;

&lt;p&gt;If the operation takes 30 seconds, the HTTP request remains open for 30 seconds.&lt;/p&gt;

&lt;p&gt;That's not ideal.&lt;/p&gt;

&lt;p&gt;A better architecture is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   ↓
API
   ↓
Queue background work
   ↓
Return response
   ↓
Background Worker
   ↓
Generate Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The API can respond quickly while the background worker handles the long-running operation.&lt;/p&gt;




&lt;h2&gt;
  
  
  BackgroundService vs IHostedService
&lt;/h2&gt;

&lt;p&gt;ASP.NET Core provides two common ways to implement background work.&lt;/p&gt;

&lt;h3&gt;
  
  
  IHostedService
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;IHostedService&lt;/code&gt; is the lower-level interface.&lt;/p&gt;

&lt;p&gt;It provides:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;StartAsync()
StopAsync()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You have more control, but you also need to manage more of the implementation yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  BackgroundService
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;BackgroundService&lt;/code&gt; is an abstract class that implements &lt;code&gt;IHostedService&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is usually easier when your worker needs to continuously run background operations.&lt;/p&gt;

&lt;p&gt;For many applications, &lt;code&gt;BackgroundService&lt;/code&gt; is the simplest choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Create Your First Background Service
&lt;/h2&gt;

&lt;p&gt;Create a class:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyBackgroundService : BackgroundService
{
    private readonly ILogger&amp;lt;MyBackgroundService&amp;gt; _logger;

    public MyBackgroundService(
        ILogger&amp;lt;MyBackgroundService&amp;gt; logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(
        CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation(
                "Background service is running.");

            await Task.Delay(
                TimeSpan.FromSeconds(10),
                stoppingToken);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important method is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExecuteAsync()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This method runs when the hosted service starts.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;CancellationToken&lt;/code&gt; tells your worker when the application is shutting down.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Register the Background Service
&lt;/h2&gt;

&lt;p&gt;Register it in &lt;code&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder.Services.AddHostedService&amp;lt;MyBackgroundService&amp;gt;();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;When your ASP.NET Core application starts, the background service starts with it.&lt;/p&gt;

&lt;p&gt;When the application shuts down, ASP.NET Core signals the cancellation token.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Run a Task on a Schedule
&lt;/h2&gt;

&lt;p&gt;Suppose you need to perform a cleanup operation every hour.&lt;/p&gt;

&lt;p&gt;You could write:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class CleanupService : BackgroundService
{
    private readonly ILogger&amp;lt;CleanupService&amp;gt; _logger;

    public CleanupService(
        ILogger&amp;lt;CleanupService&amp;gt; logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(
        CancellationToken stoppingToken)
    {
        using var timer = new PeriodicTimer(
            TimeSpan.FromHours(1));

        while (await timer.WaitForNextTickAsync(
            stoppingToken))
        {
            try
            {
                _logger.LogInformation(
                    "Starting cleanup.");

                await CleanupAsync(stoppingToken);

                _logger.LogInformation(
                    "Cleanup completed.");
            }
            catch (Exception ex)
            {
                _logger.LogError(
                    ex,
                    "Error occurred during cleanup.");
            }
        }
    }

    private async Task CleanupAsync(
        CancellationToken cancellationToken)
    {
        // Cleanup logic
        await Task.CompletedTask;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;PeriodicTimer&lt;/code&gt; makes scheduled asynchronous work easier to manage.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why CancellationToken Matters
&lt;/h2&gt;

&lt;p&gt;One of the most important things in a background service is graceful shutdown.&lt;/p&gt;

&lt;p&gt;Avoid this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (true)
{
    await DoWorkAsync();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The worker has no way to respond to application shutdown.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (!stoppingToken.IsCancellationRequested)
{
    await DoWorkAsync(stoppingToken);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now ASP.NET Core can tell the worker:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The application is shutting down."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The worker can stop gracefully.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Don't Block the Thread
&lt;/h2&gt;

&lt;p&gt;Avoid blocking calls such as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread.Sleep(5000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;inside asynchronous background work.&lt;/p&gt;

&lt;p&gt;Prefer:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await Task.Delay(
    TimeSpan.FromSeconds(5),
    stoppingToken);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This allows the thread to be used efficiently while waiting.&lt;/p&gt;

&lt;p&gt;The same principle applies to database and HTTP operations.&lt;/p&gt;

&lt;p&gt;Prefer:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await repository.GetDataAsync(
    stoppingToken);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;instead of synchronous operations that block a thread.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Using Dependency Injection in Background Services
&lt;/h2&gt;

&lt;p&gt;A common requirement is to use a service from your dependency-injection container.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class OrderProcessingService : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;

    public OrderProcessingService(
        IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }

    protected override async Task ExecuteAsync(
        CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using var scope =
                _scopeFactory.CreateScope();

            var orderService =
                scope.ServiceProvider
                    .GetRequiredService&amp;lt;IOrderService&amp;gt;();

            await orderService.ProcessOrdersAsync(
                stoppingToken);

            await Task.Delay(
                TimeSpan.FromMinutes(1),
                stoppingToken);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is important because background services are generally registered as singletons.&lt;/p&gt;

&lt;p&gt;If the service you need is scoped, create a scope before resolving it.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. BackgroundService and Entity Framework Core
&lt;/h2&gt;

&lt;p&gt;Suppose your application needs to periodically process database records.&lt;/p&gt;

&lt;p&gt;You might have:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class OrderProcessingWorker
    : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;
    private readonly ILogger&amp;lt;OrderProcessingWorker&amp;gt; _logger;

    public OrderProcessingWorker(
        IServiceScopeFactory scopeFactory,
        ILogger&amp;lt;OrderProcessingWorker&amp;gt; logger)
    {
        _scopeFactory = scopeFactory;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(
        CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                using var scope =
                    _scopeFactory.CreateScope();

                var dbContext =
                    scope.ServiceProvider
                        .GetRequiredService&amp;lt;AppDbContext&amp;gt;();

                var pendingOrders =
                    await dbContext.Orders
                        .Where(x =&amp;gt; x.Status == "Pending")
                        .ToListAsync(stoppingToken);

                foreach (var order in pendingOrders)
                {
                    order.Status = "Processed";
                }

                await dbContext.SaveChangesAsync(
                    stoppingToken);
            }
            catch (Exception ex)
            {
                _logger.LogError(
                    ex,
                    "Error processing orders.");
            }

            await Task.Delay(
                TimeSpan.FromMinutes(1),
                stoppingToken);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important part is that the database context is resolved inside a scope.&lt;/p&gt;

&lt;p&gt;Don't keep a scoped &lt;code&gt;DbContext&lt;/code&gt; alive for the entire lifetime of the background service.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Process Work from a Queue
&lt;/h2&gt;

&lt;p&gt;A more scalable approach is to use a queue.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Request
    ↓
Add work to queue
    ↓
Background Worker
    ↓
Process work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A simple in-memory queue can use:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Channel&amp;lt;T&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface IBackgroundTaskQueue
{
    ValueTask QueueAsync(
        Func&amp;lt;CancellationToken, ValueTask&amp;gt; workItem);

    ValueTask&amp;lt;Func&amp;lt;CancellationToken, ValueTask&amp;gt;&amp;gt;
        DequeueAsync(
            CancellationToken cancellationToken);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can implement the queue using &lt;code&gt;Channel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows the API to add work without performing the expensive operation during the request.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Example: Queue an Email
&lt;/h2&gt;

&lt;p&gt;Imagine an API that needs to send an email after creating an account.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await emailService.SendEmailAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;inside the HTTP request, you can queue the operation.&lt;/p&gt;

&lt;p&gt;The flow becomes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/users
      ↓
Create user
      ↓
Queue email
      ↓
Return 201 Created
      ↓
Background worker
      ↓
Send email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This can make the API response much faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Important: In-Memory Queues Have a Limitation
&lt;/h2&gt;

&lt;p&gt;An in-memory queue is simple, but it has an important limitation.&lt;/p&gt;

&lt;p&gt;If your application restarts:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
    ↓
Memory queue
    ↓
Application crashes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The queued work can be lost.&lt;/p&gt;

&lt;p&gt;That's why in-memory background queues are generally more suitable for simple tasks where losing queued work is acceptable.&lt;/p&gt;

&lt;p&gt;For important business operations, consider a durable messaging system such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Service Bus&lt;/li&gt;
&lt;li&gt;RabbitMQ&lt;/li&gt;
&lt;li&gt;Amazon SQS&lt;/li&gt;
&lt;li&gt;Kafka&lt;/li&gt;
&lt;li&gt;Other persistent queue technologies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice depends on your architecture and reliability requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Background Services Don't Automatically Scale Like API Requests
&lt;/h2&gt;

&lt;p&gt;Suppose you deploy your API with five instances:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instance 1
Instance 2
Instance 3
Instance 4
Instance 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If each instance runs the same &lt;code&gt;BackgroundService&lt;/code&gt;, you now have five workers.&lt;/p&gt;

&lt;p&gt;That may be completely fine for some workloads.&lt;/p&gt;

&lt;p&gt;But it can also create duplicate processing.&lt;/p&gt;

&lt;p&gt;For example, you might accidentally have:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instance 1 → Process order #100
Instance 2 → Process order #100
Instance 3 → Process order #100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now the same order may be processed multiple times.&lt;/p&gt;

&lt;p&gt;For distributed applications, you may need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed locks&lt;/li&gt;
&lt;li&gt;Database coordination&lt;/li&gt;
&lt;li&gt;Queue-based processing&lt;/li&gt;
&lt;li&gt;Idempotent operations&lt;/li&gt;
&lt;li&gt;A dedicated worker service&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. Make Background Operations Idempotent
&lt;/h2&gt;

&lt;p&gt;Idempotency is extremely important for background processing.&lt;/p&gt;

&lt;p&gt;Suppose a payment operation is accidentally executed twice.&lt;/p&gt;

&lt;p&gt;That's a serious problem.&lt;/p&gt;

&lt;p&gt;Instead of assuming:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process once
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;design your operation so repeated execution doesn't create duplicate side effects.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (await IsAlreadyProcessedAsync(orderId))
{
    return;
}

await ProcessOrderAsync(orderId);

await MarkAsProcessedAsync(orderId);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This pattern becomes especially important when working with queues and distributed systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Handle Exceptions Carefully
&lt;/h2&gt;

&lt;p&gt;Don't allow an exception to silently terminate important background processing.&lt;/p&gt;

&lt;p&gt;Use logging:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try
{
    await ProcessAsync(stoppingToken);
}
catch (OperationCanceledException)
    when (stoppingToken.IsCancellationRequested)
{
    // Application is shutting down.
}
catch (Exception ex)
{
    _logger.LogError(
        ex,
        "Background processing failed.");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This allows expected shutdown cancellation to be treated differently from actual failures.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Add Useful Logging
&lt;/h2&gt;

&lt;p&gt;Good background workers should provide enough information to troubleshoot problems.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_logger.LogInformation(
    "Starting order processing.");

_logger.LogInformation(
    "Found {Count} pending orders.",
    orders.Count);

_logger.LogError(
    exception,
    "Failed to process OrderId {OrderId}",
    orderId);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Avoid logging sensitive information such as passwords, tokens, or payment information.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. When Should You Use a BackgroundService?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;BackgroundService&lt;/code&gt; is a good choice for tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Periodic cleanup&lt;/li&gt;
&lt;li&gt;Cache refresh&lt;/li&gt;
&lt;li&gt;Scheduled synchronization&lt;/li&gt;
&lt;li&gt;Processing lightweight background work&lt;/li&gt;
&lt;li&gt;Polling an external system&lt;/li&gt;
&lt;li&gt;Internal application maintenance&lt;/li&gt;
&lt;li&gt;Simple queue processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it may not be the best choice for every workload.&lt;/p&gt;

&lt;p&gt;If your application requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guaranteed delivery&lt;/li&gt;
&lt;li&gt;High-volume processing&lt;/li&gt;
&lt;li&gt;Distributed workers&lt;/li&gt;
&lt;li&gt;Retry policies&lt;/li&gt;
&lt;li&gt;Dead-letter queues&lt;/li&gt;
&lt;li&gt;Persistent messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a dedicated message broker or background-job system may be more appropriate.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Practical Architecture
&lt;/h1&gt;

&lt;p&gt;A production application might look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   ↓
ASP.NET Core API
   ↓
Durable Queue
   ↓
Worker Service
   ↓
Database / External Services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The API handles HTTP requests.&lt;/p&gt;

&lt;p&gt;The queue stores work reliably.&lt;/p&gt;

&lt;p&gt;The worker processes the work.&lt;/p&gt;

&lt;p&gt;This separation makes the system easier to scale.&lt;/p&gt;




&lt;h1&gt;
  
  
  BackgroundService Checklist
&lt;/h1&gt;

&lt;p&gt;Before deploying a background worker, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Does the worker support graceful cancellation?&lt;/li&gt;
&lt;li&gt;[ ] Are async APIs used instead of blocking calls?&lt;/li&gt;
&lt;li&gt;[ ] Are scoped dependencies resolved inside a scope?&lt;/li&gt;
&lt;li&gt;[ ] Are exceptions logged?&lt;/li&gt;
&lt;li&gt;[ ] Can the operation safely be retried?&lt;/li&gt;
&lt;li&gt;[ ] Is the operation idempotent?&lt;/li&gt;
&lt;li&gt;[ ] Can work be lost if the application restarts?&lt;/li&gt;
&lt;li&gt;[ ] Will multiple application instances process the same work?&lt;/li&gt;
&lt;li&gt;[ ] Do you need a durable queue?&lt;/li&gt;
&lt;li&gt;[ ] Do you have monitoring for failed background jobs?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Background processing is an important part of building production-ready ASP.NET Core applications.&lt;/p&gt;

&lt;p&gt;The key is to avoid putting every operation inside an HTTP request.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;BackgroundService&lt;/code&gt; for appropriate application-level background work.&lt;/p&gt;

&lt;p&gt;For critical or distributed workloads, consider moving toward a durable queue and dedicated worker architecture.&lt;/p&gt;

&lt;p&gt;A useful mental model is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fast API request
      +
Reliable background processing
      =
Better application architecture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The goal isn't simply to move code into a background thread.&lt;/p&gt;

&lt;p&gt;The goal is to design background work that is &lt;strong&gt;reliable, observable, cancellable, and safe to retry&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Small Developer Tool for Everyday .NET Work
&lt;/h2&gt;

&lt;p&gt;While working with APIs and background services, developers often need quick utilities for formatting JSON, decoding JWTs, comparing API responses, converting data formats, and handling other small development tasks.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;ToolBench&lt;/strong&gt; — a collection of free browser-based developer tools designed for everyday development work.&lt;/p&gt;

&lt;p&gt;Explore the tools here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can be a handy companion when you're debugging APIs, working with JSON, or troubleshooting development issues.&lt;/p&gt;




&lt;p&gt;What kind of background processing do you use in your .NET applications?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BackgroundService&lt;/code&gt;, Azure Service Bus, Hangfire, RabbitMQ, or something else?&lt;/p&gt;

&lt;p&gt;Share your approach in the comments.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>aspnetcore</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>ASP.NET Core API Performance: 12 Practical Ways to Make Your Web API Faster</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Wed, 12 Aug 2026 12:23:08 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/aspnet-core-api-performance-12-practical-ways-to-make-your-web-api-faster-229n</link>
      <guid>https://dev.to/toolbenchapp/aspnet-core-api-performance-12-practical-ways-to-make-your-web-api-faster-229n</guid>
      <description>&lt;p&gt;A slow API doesn't always mean you need a bigger server.&lt;/p&gt;

&lt;p&gt;In many ASP.NET Core applications, performance problems come from things such as inefficient database queries, unnecessary serialization, excessive network calls, missing caching, or returning much more data than the client actually needs.&lt;/p&gt;

&lt;p&gt;The good news is that many of these problems can be fixed at the application level.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll look at &lt;strong&gt;12 practical techniques for improving ASP.NET Core Web API performance&lt;/strong&gt;, with examples you can apply to real projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Use Async APIs Properly
&lt;/h2&gt;

&lt;p&gt;One of the most important rules in ASP.NET Core is to avoid blocking threads while waiting for I/O operations.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For database calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows ASP.NET Core to handle other requests while the application is waiting for the database or another I/O operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid this
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetUsersAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetUsersAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;GetAwaiter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;GetResult&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocking asynchronous operations defeats many of the benefits of async programming.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Don't Return More Data Than You Need
&lt;/h1&gt;

&lt;p&gt;Imagine your &lt;code&gt;User&lt;/code&gt; table contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id
Name
Email
Phone
Address
DateOfBirth
ProfileImage
CreatedDate
UpdatedDate
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But your API only needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id
Name
Email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't retrieve the entire entity unnecessarily.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use projection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserDto&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database work&lt;/li&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;li&gt;Network traffic&lt;/li&gt;
&lt;li&gt;JSON serialization&lt;/li&gt;
&lt;li&gt;Response size&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  General rule
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Retrieve only the columns you actually need.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Use Pagination
&lt;/h1&gt;

&lt;p&gt;Returning thousands of records from an endpoint is rarely a good idea.&lt;/p&gt;

&lt;p&gt;Avoid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/products
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returning 100,000 records.&lt;/p&gt;

&lt;p&gt;Instead, support pagination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/products?page=1&amp;amp;pageSize=20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ProductDto&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Skip&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProductDto&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pagination prevents a single request from consuming excessive resources.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Use &lt;code&gt;AsNoTracking()&lt;/code&gt; for Read-Only Queries
&lt;/h1&gt;

&lt;p&gt;Entity Framework Core tracks entities by default.&lt;/p&gt;

&lt;p&gt;Tracking is useful when you plan to modify an entity.&lt;/p&gt;

&lt;p&gt;But if you're only reading data, tracking may be unnecessary.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For read-only operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells EF Core that you don't need change tracking for these entities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good use cases
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AsNoTracking()&lt;/code&gt; is particularly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET endpoints&lt;/li&gt;
&lt;li&gt;Reporting&lt;/li&gt;
&lt;li&gt;Dashboards&lt;/li&gt;
&lt;li&gt;Search APIs&lt;/li&gt;
&lt;li&gt;Read-only queries&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  5. Avoid N+1 Queries
&lt;/h1&gt;

&lt;p&gt;One of the most common database performance problems is the &lt;strong&gt;N+1 query problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customers&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have 1,000 orders, this can result in many database queries.&lt;/p&gt;

&lt;p&gt;Instead, fetch the required data as part of one query.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, even better when you only need specific fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;OrderDto&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CustomerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Projection is often preferable when you don't need the complete related entities.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Add Database Indexes
&lt;/h1&gt;

&lt;p&gt;Sometimes the API is slow because the database has to scan a large table.&lt;/p&gt;

&lt;p&gt;Suppose your API frequently searches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An index on &lt;code&gt;Email&lt;/code&gt; can make this query significantly more efficient.&lt;/p&gt;

&lt;p&gt;In EF Core:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should consider indexes for columns frequently used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WHERE conditions&lt;/li&gt;
&lt;li&gt;JOIN conditions&lt;/li&gt;
&lt;li&gt;ORDER BY&lt;/li&gt;
&lt;li&gt;UNIQUE lookups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, don't blindly add indexes to every column.&lt;/p&gt;

&lt;p&gt;Indexes also have storage and write-performance costs.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Use Response Caching Where Appropriate
&lt;/h1&gt;

&lt;p&gt;Some API responses don't change frequently.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/countries
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There may be little reason to query the database for every request.&lt;/p&gt;

&lt;p&gt;Caching can help.&lt;/p&gt;

&lt;p&gt;For example, using ASP.NET Core's output caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOutputCache&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseOutputCache&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And on an endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;OutputCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetCountries&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetCountriesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now repeated requests can be served from the cache instead of repeatedly executing the same application logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good candidates for caching
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Country lists&lt;/li&gt;
&lt;li&gt;Product categories&lt;/li&gt;
&lt;li&gt;Configuration data&lt;/li&gt;
&lt;li&gt;Public reference data&lt;/li&gt;
&lt;li&gt;Frequently requested read-only resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't blindly cache user-specific or highly dynamic responses.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Compress HTTP Responses
&lt;/h1&gt;

&lt;p&gt;If your API returns large JSON responses, compression can reduce network traffic.&lt;/p&gt;

&lt;p&gt;ASP.NET Core supports response compression.&lt;/p&gt;

&lt;p&gt;Register it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddResponseCompression&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseResponseCompression&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, a large JSON response can become significantly smaller when compressed.&lt;/p&gt;

&lt;p&gt;This is particularly useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responses are large&lt;/li&gt;
&lt;li&gt;Clients have slower connections&lt;/li&gt;
&lt;li&gt;APIs are accessed over the internet&lt;/li&gt;
&lt;li&gt;Payloads contain repetitive JSON structures&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  9. Avoid Unnecessary Serialization
&lt;/h1&gt;

&lt;p&gt;Serialization can become expensive when you're returning large object graphs.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hugeObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;hugeObject&lt;/code&gt; contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hundreds of properties&lt;/li&gt;
&lt;li&gt;Nested objects&lt;/li&gt;
&lt;li&gt;Collections&lt;/li&gt;
&lt;li&gt;Related entities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the serializer has to process all of them.&lt;/p&gt;

&lt;p&gt;Instead, create a focused DTO:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you better control over your API contract and usually reduces payload size.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Use &lt;code&gt;HttpClientFactory&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;If your API calls another API, avoid creating a new &lt;code&gt;HttpClient&lt;/code&gt; for every request.&lt;/p&gt;

&lt;p&gt;Avoid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetStringAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, use &lt;code&gt;IHttpClientFactory&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Register:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHttpClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inject:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;HttpClient&lt;/span&gt; &lt;span class="n"&gt;_client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;WeatherService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IHttpClientFactory&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetWeatherAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetStringAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"https://example.com/weather"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows .NET to manage HTTP connections more effectively.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Use Cancellation Tokens
&lt;/h1&gt;

&lt;p&gt;Imagine a user sends an API request and then closes the browser.&lt;/p&gt;

&lt;p&gt;If the server continues performing an expensive database operation unnecessarily, resources are wasted.&lt;/p&gt;

&lt;p&gt;You can propagate cancellation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cancellation token can also be passed through your service layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UserDto&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUsersAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserDto&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially valuable for expensive operations.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Measure Before Optimizing
&lt;/h1&gt;

&lt;p&gt;This might be the most important point.&lt;/p&gt;

&lt;p&gt;Don't optimize code simply because it "looks slow."&lt;/p&gt;

&lt;p&gt;First identify where the actual bottleneck is.&lt;/p&gt;

&lt;p&gt;Measure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API response time
        ↓
Controller
        ↓
Service
        ↓
Database
        ↓
External APIs
        ↓
Serialization
        ↓
Network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful metrics include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average response time&lt;/li&gt;
&lt;li&gt;P95 latency&lt;/li&gt;
&lt;li&gt;P99 latency&lt;/li&gt;
&lt;li&gt;Database query duration&lt;/li&gt;
&lt;li&gt;Error rate&lt;/li&gt;
&lt;li&gt;Request throughput&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, an API might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average: 120 ms
P95:     450 ms
P99:     2.4 sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The average looks reasonable, but the P99 indicates that some requests are significantly slower.&lt;/p&gt;

&lt;p&gt;That's why measuring only the average isn't enough.&lt;/p&gt;




&lt;h1&gt;
  
  
  Putting the Techniques Together
&lt;/h1&gt;

&lt;p&gt;Here's an example of a cleaner, performance-conscious endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Skip&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProductDto&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small example already applies several performance principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Async database access&lt;/li&gt;
&lt;li&gt;Cancellation support&lt;/li&gt;
&lt;li&gt;No unnecessary change tracking&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Projection&lt;/li&gt;
&lt;li&gt;Deterministic ordering&lt;/li&gt;
&lt;li&gt;Smaller response objects&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  A Simple ASP.NET Core Performance Checklist
&lt;/h1&gt;

&lt;p&gt;Before deploying an API, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Are database operations asynchronous?&lt;/li&gt;
&lt;li&gt;[ ] Are read-only queries using &lt;code&gt;AsNoTracking()&lt;/code&gt; where appropriate?&lt;/li&gt;
&lt;li&gt;[ ] Are API responses paginated?&lt;/li&gt;
&lt;li&gt;[ ] Are only required columns selected?&lt;/li&gt;
&lt;li&gt;[ ] Are database indexes appropriate?&lt;/li&gt;
&lt;li&gt;[ ] Have N+1 queries been eliminated?&lt;/li&gt;
&lt;li&gt;[ ] Are large responses compressed?&lt;/li&gt;
&lt;li&gt;[ ] Can frequently requested data be cached?&lt;/li&gt;
&lt;li&gt;[ ] Are external API calls using &lt;code&gt;IHttpClientFactory&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;[ ] Are cancellation tokens propagated?&lt;/li&gt;
&lt;li&gt;[ ] Are response DTOs appropriately sized?&lt;/li&gt;
&lt;li&gt;[ ] Have performance metrics been measured?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;ASP.NET Core already provides excellent performance out of the box, but application-level decisions can still make a huge difference.&lt;/p&gt;

&lt;p&gt;The biggest improvements often don't come from complicated optimization techniques.&lt;/p&gt;

&lt;p&gt;They come from simple decisions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query less data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make fewer database calls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid unnecessary work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache what makes sense.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Return smaller responses.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure real bottlenecks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you build these habits into your development process, your APIs can remain fast and scalable as traffic and data grow.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Small Developer Tool That Can Save Time
&lt;/h2&gt;

&lt;p&gt;While building and debugging APIs, developers frequently need quick utilities for formatting JSON, comparing API responses, decoding JWTs, converting data formats, and handling other everyday development tasks.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;ToolBench&lt;/a&gt;&lt;/strong&gt; as a collection of free browser-based developer tools for exactly these small but frequent tasks. Everything runs directly in the browser, making it convenient when you need a quick utility without installing another application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the biggest performance issue you've encountered in an ASP.NET Core API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Share your experience in the comments — database queries, caching, serialization, external APIs, or something else?&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>aspnetcore</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 Entity Framework Core Performance Tips Every .NET Developer Should Know</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:12:40 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/10-entity-framework-core-performance-tips-every-net-developer-should-know-547i</link>
      <guid>https://dev.to/toolbenchapp/10-entity-framework-core-performance-tips-every-net-developer-should-know-547i</guid>
      <description>&lt;p&gt;Entity Framework Core makes it incredibly easy to work with databases in .NET applications.&lt;/p&gt;

&lt;p&gt;You can write C# instead of SQL, work with strongly typed entities, use LINQ for queries, and let EF Core handle much of the database interaction for you.&lt;/p&gt;

&lt;p&gt;But there's an important catch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing code that works is not the same as writing code that performs well.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A LINQ query can look perfectly clean in C# while generating an inefficient SQL query behind the scenes. As your database grows from thousands to millions of records, small mistakes can turn into serious performance problems.&lt;/p&gt;

&lt;p&gt;In this article, we'll look at &lt;strong&gt;10 practical Entity Framework Core performance techniques&lt;/strong&gt; that can make a real difference in ASP.NET Core applications.&lt;/p&gt;

&lt;p&gt;We'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to avoid unnecessary columns&lt;/li&gt;
&lt;li&gt;Why &lt;code&gt;AsNoTracking()&lt;/code&gt; matters&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Avoiding N+1 queries&lt;/li&gt;
&lt;li&gt;Eager loading&lt;/li&gt;
&lt;li&gt;Projection with &lt;code&gt;Select()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Database indexes&lt;/li&gt;
&lt;li&gt;Avoiding unnecessary &lt;code&gt;ToList()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Query compilation and caching&lt;/li&gt;
&lt;li&gt;How to inspect the SQL generated by EF Core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get started.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Understand What EF Core Is Actually Doing&lt;/li&gt;
&lt;li&gt;Select Only the Columns You Need&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;AsNoTracking()&lt;/code&gt; for Read-Only Queries&lt;/li&gt;
&lt;li&gt;Always Consider Pagination&lt;/li&gt;
&lt;li&gt;Avoid the N+1 Query Problem&lt;/li&gt;
&lt;li&gt;Be Careful With &lt;code&gt;Include()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prefer Projection with &lt;code&gt;Select()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use Database Indexes&lt;/li&gt;
&lt;li&gt;Don't Call &lt;code&gt;ToList()&lt;/code&gt; Too Early&lt;/li&gt;
&lt;li&gt;Inspect the SQL Generated by EF Core&lt;/li&gt;
&lt;li&gt;Combine Techniques for Real Applications&lt;/li&gt;
&lt;li&gt;Common EF Core Performance Mistakes&lt;/li&gt;
&lt;li&gt;Practical Checklist&lt;/li&gt;
&lt;li&gt;EF Core Interview Questions&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  1. Understand What EF Core Is Actually Doing
&lt;/h1&gt;

&lt;p&gt;Before optimizing EF Core, you need to understand one fundamental concept.&lt;/p&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EF Core doesn't simply execute C# code against the database.&lt;/p&gt;

&lt;p&gt;Instead, EF Core translates the LINQ expression into SQL.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C# LINQ
   ↓
EF Core
   ↓
SQL Query
   ↓
Database
   ↓
Results
   ↓
EF Core
   ↓
C# Objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your C# code might look simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the database ultimately needs something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Employees&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'IT'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why understanding the SQL generated by EF Core is so important.&lt;/p&gt;

&lt;p&gt;A query that looks elegant in C# isn't automatically efficient.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Select Only the Columns You Need
&lt;/h1&gt;

&lt;p&gt;One of the easiest ways to improve database performance is to avoid retrieving unnecessary columns.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may retrieve every column from the &lt;code&gt;Employees&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;But suppose your API only needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Id&lt;/li&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Department&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no reason to retrieve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salary&lt;/li&gt;
&lt;li&gt;Address&lt;/li&gt;
&lt;li&gt;DateOfBirth&lt;/li&gt;
&lt;li&gt;ProfileImage&lt;/li&gt;
&lt;li&gt;CreatedDate&lt;/li&gt;
&lt;li&gt;UpdatedDate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, use projection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the database only needs to return the required fields.&lt;/p&gt;

&lt;p&gt;This can significantly reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network traffic&lt;/li&gt;
&lt;li&gt;Database I/O&lt;/li&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;li&gt;Object materialization&lt;/li&gt;
&lt;li&gt;API response processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine an employee table contains 40 columns and 500,000 records.&lt;/p&gt;

&lt;p&gt;If your API only needs three columns, retrieving complete entities unnecessarily can become expensive.&lt;/p&gt;

&lt;p&gt;Projection allows the database to do less work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better API Design
&lt;/h3&gt;

&lt;p&gt;You can also project directly into a DTO:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;EmployeeDto&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is generally preferable for API responses because you're explicitly controlling the data exposed by your application.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Use &lt;code&gt;AsNoTracking()&lt;/code&gt; for Read-Only Queries
&lt;/h1&gt;

&lt;p&gt;EF Core normally keeps track of entities it retrieves.&lt;/p&gt;

&lt;p&gt;This tracking is useful when you're going to modify those entities.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EF Core needs to know that the entity changed.&lt;/p&gt;

&lt;p&gt;But what if you're only reading data?&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AsNoTracking()&lt;/code&gt; tells EF Core:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I only need these entities for reading. Don't track them for changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This can reduce tracking overhead for read-heavy workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Should You Use It?
&lt;/h2&gt;

&lt;p&gt;Good candidates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search endpoints&lt;/li&gt;
&lt;li&gt;Reporting APIs&lt;/li&gt;
&lt;li&gt;Dashboard queries&lt;/li&gt;
&lt;li&gt;Product listings&lt;/li&gt;
&lt;li&gt;Read-only pages&lt;/li&gt;
&lt;li&gt;Lookup data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When Should You Avoid It?
&lt;/h2&gt;

&lt;p&gt;Don't blindly use &lt;code&gt;AsNoTracking()&lt;/code&gt; when you intend to modify the entity and call &lt;code&gt;SaveChanges()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;90000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entity isn't being tracked, so EF Core won't automatically detect that change in the usual way.&lt;/p&gt;

&lt;p&gt;Use tracking when you actually need change tracking.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Always Consider Pagination
&lt;/h1&gt;

&lt;p&gt;One of the most common database performance mistakes is returning every record.&lt;/p&gt;

&lt;p&gt;Imagine an endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your database contains 2 million products.&lt;/p&gt;

&lt;p&gt;This is a terrible idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're asking the application to retrieve potentially millions of rows.&lt;/p&gt;

&lt;p&gt;Instead, use pagination.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Skip&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For page 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Skip = 0
Take = 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For page 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Skip = 20
Take = 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For page 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Skip = 40
Take = 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Pagination Matters
&lt;/h2&gt;

&lt;p&gt;Pagination reduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database result size&lt;/li&gt;
&lt;li&gt;Network traffic&lt;/li&gt;
&lt;li&gt;Application memory usage&lt;/li&gt;
&lt;li&gt;Serialization time&lt;/li&gt;
&lt;li&gt;API response size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For large datasets, pagination should be considered part of API design rather than an afterthought.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Avoid the N+1 Query Problem
&lt;/h1&gt;

&lt;p&gt;The N+1 query problem is one of the most important EF Core performance issues to understand.&lt;/p&gt;

&lt;p&gt;Suppose you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Orders
  ↓
Customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You retrieve 100 orders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inside a loop, you retrieve the customer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customers&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might accidentally execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 query for Orders
+
100 queries for Customers
=
101 database queries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the N+1 problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Approach
&lt;/h2&gt;

&lt;p&gt;Use an appropriate query that retrieves the required information together.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CustomerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now EF Core can translate this relationship into SQL and retrieve the required data more efficiently.&lt;/p&gt;

&lt;p&gt;The important lesson is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be careful when accessing related data inside loops.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  6. Be Careful With &lt;code&gt;Include()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Include()&lt;/code&gt; is useful when you need related entities.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells EF Core to load the related customer.&lt;/p&gt;

&lt;p&gt;That can be appropriate.&lt;/p&gt;

&lt;p&gt;But don't automatically add &lt;code&gt;Include()&lt;/code&gt; everywhere.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Payments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShippingAddress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may end up retrieving a very large amount of related data.&lt;/p&gt;

&lt;p&gt;Instead, ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do I actually need these related entities?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your API only needs the customer name, projection may be better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CustomerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal isn't to avoid &lt;code&gt;Include()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The goal is to use it intentionally.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Prefer Projection with &lt;code&gt;Select()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Projection is one of the most useful techniques in EF Core.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're loading complete entities.&lt;/p&gt;

&lt;p&gt;But perhaps your UI only needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Id
Name
Email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserDto&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach has several benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Less Data
&lt;/h3&gt;

&lt;p&gt;Only required columns are retrieved.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Better API Contracts
&lt;/h3&gt;

&lt;p&gt;The API explicitly defines what it returns.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Less Memory
&lt;/h3&gt;

&lt;p&gt;The application doesn't need to materialize unnecessary entity properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Better Security
&lt;/h3&gt;

&lt;p&gt;You're less likely to accidentally expose fields that shouldn't be returned.&lt;/p&gt;

&lt;p&gt;For example, don't return an entire user entity if it contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordHash
SecurityStamp
InternalNotes
ResetToken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, explicitly select what the API needs.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Use Database Indexes
&lt;/h1&gt;

&lt;p&gt;EF Core query optimization isn't only about C#.&lt;/p&gt;

&lt;p&gt;Your database design matters enormously.&lt;/p&gt;

&lt;p&gt;Suppose you frequently execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;Email&lt;/code&gt; isn't indexed, the database may need to scan a large number of rows.&lt;/p&gt;

&lt;p&gt;A database index can make lookups much faster.&lt;/p&gt;

&lt;p&gt;For example, using EF Core configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsUnique&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates an index on the email column.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composite Indexes
&lt;/h2&gt;

&lt;p&gt;Sometimes queries filter on multiple columns.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerId&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Completed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A composite index may be useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't create indexes for every column.&lt;/p&gt;

&lt;p&gt;Indexes have costs too.&lt;/p&gt;

&lt;p&gt;They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consume storage&lt;/li&gt;
&lt;li&gt;Increase insert/update overhead&lt;/li&gt;
&lt;li&gt;Increase maintenance cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexes should be based on actual query patterns.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Don't Call &lt;code&gt;ToList()&lt;/code&gt; Too Early
&lt;/h1&gt;

&lt;p&gt;This is another common LINQ and EF Core mistake.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first &lt;code&gt;ToListAsync()&lt;/code&gt; executes the database query immediately.&lt;/p&gt;

&lt;p&gt;That means the application retrieves all employees before filtering them.&lt;/p&gt;

&lt;p&gt;A better approach is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the filtering happens at the database level.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;h3&gt;
  
  
  Less Efficient
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
   ↓
All Employees
   ↓
Application
   ↓
Filter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Better
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
   ↓
Filter
   ↓
Only IT Employees
   ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the most important concepts when working with &lt;code&gt;IQueryable&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Inspect the SQL Generated by EF Core
&lt;/h1&gt;

&lt;p&gt;Never assume your LINQ query produces the SQL you expect.&lt;/p&gt;

&lt;p&gt;EF Core provides ways to inspect generated SQL.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToQueryString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can show the SQL generated for the query.&lt;/p&gt;

&lt;p&gt;This is incredibly useful when diagnosing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow queries&lt;/li&gt;
&lt;li&gt;Unexpected joins&lt;/li&gt;
&lt;li&gt;Missing filters&lt;/li&gt;
&lt;li&gt;Excessive columns&lt;/li&gt;
&lt;li&gt;Unexpected SQL generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;You may write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;80000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of guessing what happens, inspect the generated SQL.&lt;/p&gt;

&lt;p&gt;Then you can take the SQL to your database tools and analyze the execution plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remember
&lt;/h3&gt;

&lt;p&gt;EF Core is an abstraction over the database.&lt;/p&gt;

&lt;p&gt;When performance matters, you should understand both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C# / LINQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL / Database Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Being comfortable with both makes you a much stronger .NET developer.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Combine Techniques for Real Applications
&lt;/h1&gt;

&lt;p&gt;The biggest performance improvements usually come from combining multiple techniques.&lt;/p&gt;

&lt;p&gt;Suppose you're building an employee search API.&lt;/p&gt;

&lt;p&gt;A good query might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employees&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;EmployeeDto&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Skip&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single query demonstrates several useful techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AsNoTracking()&lt;/code&gt; for read-only data&lt;/li&gt;
&lt;li&gt;Filtering at the database&lt;/li&gt;
&lt;li&gt;Ordering&lt;/li&gt;
&lt;li&gt;Projection&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Async database access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's much better than retrieving thousands of complete entities and processing them inside application code.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Common EF Core Performance Mistakes
&lt;/h1&gt;

&lt;p&gt;Here are some mistakes worth checking in your own projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Loading Everything
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when the application only needs 20 records.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Selecting Complete Entities
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when the API only needs three properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Filtering After &lt;code&gt;ToList()&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ Unnecessary Tracking
&lt;/h3&gt;

&lt;p&gt;Using tracked entities for large read-only reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ N+1 Queries
&lt;/h3&gt;

&lt;p&gt;Executing database queries inside loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Too Many Includes
&lt;/h3&gt;

&lt;p&gt;Loading a huge object graph when only a few fields are required.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Ignoring Database Indexes
&lt;/h3&gt;

&lt;p&gt;Filtering and sorting frequently on columns that aren't appropriately indexed.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Ignoring Generated SQL
&lt;/h3&gt;

&lt;p&gt;Assuming that clean LINQ automatically means efficient SQL.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Practical EF Core Performance Checklist
&lt;/h1&gt;

&lt;p&gt;Before releasing an API that uses EF Core, ask yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;☐ Am I selecting only the columns I need?

☐ Is this query read-only?

☐ Should I use AsNoTracking()?

☐ Does this endpoint need pagination?

☐ Am I accidentally creating N+1 queries?

☐ Do I really need every Include()?

☐ Can I use projection with Select()?

☐ Are frequently filtered columns indexed?

☐ Am I calling ToList() too early?

☐ Have I inspected the generated SQL?

☐ Have I tested the query with realistic data volumes?

☐ Have I checked the database execution plan?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last two are especially important.&lt;/p&gt;

&lt;p&gt;A query that performs well with 1,000 records may behave very differently with 10 million records.&lt;/p&gt;

&lt;p&gt;Always test performance using data volumes that resemble production.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. EF Core Interview Questions
&lt;/h1&gt;

&lt;h3&gt;
  
  
  What is &lt;code&gt;AsNoTracking()&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AsNoTracking()&lt;/code&gt; tells EF Core not to track returned entities for changes. It is commonly useful for read-only queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is &lt;code&gt;Select()&lt;/code&gt; useful for performance?
&lt;/h3&gt;

&lt;p&gt;It allows you to retrieve only the fields required by the application instead of loading complete entities.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the N+1 query problem?
&lt;/h3&gt;

&lt;p&gt;It occurs when an application executes one query to retrieve a collection and then executes additional queries for each item in that collection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is &lt;code&gt;ToList()&lt;/code&gt; important?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ToList()&lt;/code&gt; materializes the query and generally causes the database query to execute immediately.&lt;/p&gt;

&lt;p&gt;Calling it too early can cause unnecessary data to be retrieved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does EF Core automatically create indexes?
&lt;/h3&gt;

&lt;p&gt;EF Core creates indexes for certain conventions, such as primary keys, but application-specific indexes often need to be configured intentionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is projection?
&lt;/h3&gt;

&lt;p&gt;Projection means selecting only the data required from an entity, often using &lt;code&gt;Select()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should generated SQL be inspected?
&lt;/h3&gt;

&lt;p&gt;Because the LINQ expression you write doesn't always make the resulting SQL obvious. Inspecting SQL helps identify inefficient queries, joins, missing filters, and other database performance issues.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Frequently Asked Questions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Is EF Core slower than writing SQL manually?
&lt;/h2&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;EF Core can generate efficient SQL for many common scenarios, but developers still need to understand how their queries translate to SQL.&lt;/p&gt;

&lt;p&gt;For highly specialized queries, raw SQL or other database-specific approaches can sometimes be appropriate.&lt;/p&gt;

&lt;p&gt;The important thing is to measure rather than assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should I always use &lt;code&gt;AsNoTracking()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Use it when you don't need change tracking.&lt;/p&gt;

&lt;p&gt;If you're retrieving an entity specifically to modify and save it, normal tracking may be appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should I avoid &lt;code&gt;Include()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Include()&lt;/code&gt; is useful when you genuinely need related entities.&lt;/p&gt;

&lt;p&gt;The problem is using it without considering how much data you're loading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is &lt;code&gt;Select()&lt;/code&gt; always faster?
&lt;/h2&gt;

&lt;p&gt;Not automatically.&lt;/p&gt;

&lt;p&gt;Projection can reduce the amount of data retrieved, but the actual performance depends on the query, database, indexes, relationships, and data size.&lt;/p&gt;

&lt;p&gt;Measure important queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I find slow EF Core queries?
&lt;/h2&gt;

&lt;p&gt;Start by logging SQL generated by EF Core and inspecting the queries using your database's execution-plan tools.&lt;/p&gt;

&lt;p&gt;Application performance monitoring and database monitoring can also help identify slow queries in production.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Entity Framework Core allows .NET developers to work with databases using familiar C# and LINQ.&lt;/p&gt;

&lt;p&gt;But abstraction doesn't eliminate the need to understand what's happening underneath.&lt;/p&gt;

&lt;p&gt;The most important performance lessons from this article are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Retrieve only the data you need.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;AsNoTracking()&lt;/code&gt; for appropriate read-only queries.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paginate large datasets.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch out for N+1 queries.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;Include()&lt;/code&gt; intentionally.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer projection when you only need specific fields.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design appropriate database indexes.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don't materialize queries too early.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inspect the SQL generated by EF Core.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test with realistic production-sized data.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest mistake is optimizing based on assumptions.&lt;/p&gt;

&lt;p&gt;Instead of thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This LINQ query looks simple, so it must be fast."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What SQL will this generate, how will the database execute it, and how will it behave when the data grows?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That mindset will help you write significantly better ASP.NET Core applications.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h1&gt;

&lt;p&gt;As developers, we spend a surprising amount of time working with API responses, configuration files, tokens, test data, and different data formats while building applications.&lt;/p&gt;

&lt;p&gt;That's one of the reasons I built &lt;strong&gt;ToolBenchApp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ToolBenchApp&lt;/strong&gt; is a growing collection of free, browser-based developer tools designed to simplify everyday development tasks.&lt;/p&gt;

&lt;p&gt;For .NET and API developers, some particularly useful tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON Formatter &amp;amp; Validator&lt;/li&gt;
&lt;li&gt;JSON ↔ XML Converter&lt;/li&gt;
&lt;li&gt;JSON ↔ CSV Converter&lt;/li&gt;
&lt;li&gt;JWT Decoder&lt;/li&gt;
&lt;li&gt;Base64 Encoder/Decoder&lt;/li&gt;
&lt;li&gt;UUID Generator&lt;/li&gt;
&lt;li&gt;URL Encoder/Decoder&lt;/li&gt;
&lt;li&gt;SQL Formatter&lt;/li&gt;
&lt;li&gt;YAML Formatter&lt;/li&gt;
&lt;li&gt;Text Difference Checker&lt;/li&gt;
&lt;li&gt;HTML Formatter&lt;/li&gt;
&lt;li&gt;Regex Tester&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, when debugging an ASP.NET Core API, you can quickly format a JSON response, inspect a JWT, compare two API payloads, or format SQL without installing another application.&lt;/p&gt;

&lt;p&gt;I'm continuously adding new utilities to ToolBenchApp based on practical developer needs. If there's a small developer task you repeatedly perform and would like to turn into a free browser-based tool, I'd love to hear your suggestion.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>entityframework</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 ASP.NET Core Middleware Concepts Every .NET Developer Should Know</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Mon, 10 Aug 2026 12:47:30 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/10-aspnet-core-middleware-concepts-every-net-developer-should-know-5e9n</link>
      <guid>https://dev.to/toolbenchapp/10-aspnet-core-middleware-concepts-every-net-developer-should-know-5e9n</guid>
      <description>&lt;p&gt;ASP.NET Core middleware is one of those concepts that every .NET developer uses, but many developers don't fully understand what happens behind the scenes.&lt;/p&gt;

&lt;p&gt;Authentication, authorization, exception handling, logging, CORS, HTTPS redirection, rate limiting, and even your own custom logic can all be implemented through middleware.&lt;/p&gt;

&lt;p&gt;Once you understand how middleware works, ASP.NET Core applications become much easier to design, debug, and maintain.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll go beyond the basic definition and explore &lt;strong&gt;10 important ASP.NET Core middleware concepts with practical examples&lt;/strong&gt;, including how middleware executes, how to create custom middleware, how &lt;code&gt;Use&lt;/code&gt;, &lt;code&gt;Run&lt;/code&gt;, and &lt;code&gt;Map&lt;/code&gt; differ, how ordering affects your application, and how to avoid common mistakes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What Is Middleware?&lt;/li&gt;
&lt;li&gt;How the Middleware Pipeline Works&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Use()&lt;/code&gt; vs &lt;code&gt;Run()&lt;/code&gt; vs &lt;code&gt;Map()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Creating Custom Middleware&lt;/li&gt;
&lt;li&gt;Middleware Ordering&lt;/li&gt;
&lt;li&gt;Exception Handling Middleware&lt;/li&gt;
&lt;li&gt;Request Logging Middleware&lt;/li&gt;
&lt;li&gt;Authentication and Authorization Middleware&lt;/li&gt;
&lt;li&gt;Conditional Middleware&lt;/li&gt;
&lt;li&gt;Short-Circuiting the Pipeline&lt;/li&gt;
&lt;li&gt;Middleware with Dependency Injection&lt;/li&gt;
&lt;li&gt;Common Middleware Mistakes&lt;/li&gt;
&lt;li&gt;Performance Best Practices&lt;/li&gt;
&lt;li&gt;Middleware Interview Questions&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. What Is Middleware?
&lt;/h2&gt;

&lt;p&gt;Middleware is a component that participates in handling an HTTP request and response.&lt;/p&gt;

&lt;p&gt;You can think of middleware as a series of checkpoints through which every request passes.&lt;/p&gt;

&lt;p&gt;For example, a request might travel through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  ↓
Exception Handling
  ↓
HTTPS Redirection
  ↓
Logging
  ↓
Authentication
  ↓
Authorization
  ↓
Routing
  ↓
Controller
  ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each middleware component can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inspect the request&lt;/li&gt;
&lt;li&gt;Modify the request&lt;/li&gt;
&lt;li&gt;Perform some operation&lt;/li&gt;
&lt;li&gt;Call the next middleware&lt;/li&gt;
&lt;li&gt;Modify the response&lt;/li&gt;
&lt;li&gt;Stop the request from continuing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes middleware extremely powerful.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. How the Middleware Pipeline Works
&lt;/h1&gt;

&lt;p&gt;Let's start with a simple example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Before next middleware"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"After next middleware"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Endpoint"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a request arrives, the output is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before next middleware
Endpoint
After next middleware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;The middleware doesn't simply execute from top to bottom.&lt;/p&gt;

&lt;p&gt;The call to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;passes execution to the next middleware.&lt;/p&gt;

&lt;p&gt;When that middleware finishes, execution returns to the previous middleware.&lt;/p&gt;

&lt;p&gt;You can visualize it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Middleware A
    ↓
Middleware B
    ↓
Endpoint
    ↑
Middleware B
    ↑
Middleware A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is sometimes called the &lt;strong&gt;middleware pipeline&lt;/strong&gt; or &lt;strong&gt;onion model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Understanding this behavior is essential when working with logging, authentication, exception handling, and response manipulation.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. &lt;code&gt;Use()&lt;/code&gt; vs &lt;code&gt;Run()&lt;/code&gt; vs &lt;code&gt;Map()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;One of the most common ASP.NET Core interview questions is the difference between &lt;code&gt;Use()&lt;/code&gt;, &lt;code&gt;Run()&lt;/code&gt;, and &lt;code&gt;Map()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Use()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Use()&lt;/code&gt; adds middleware that can call the next component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Before"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"After"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it receives &lt;code&gt;next&lt;/code&gt;, it can continue the pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;Run()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Run()&lt;/code&gt; adds terminal middleware.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no &lt;code&gt;next&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;Once this middleware executes, the pipeline ends.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Middleware 1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Terminal middleware"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything registered after &lt;code&gt;Run()&lt;/code&gt; won't execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;Map()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Map()&lt;/code&gt; allows you to create a separate pipeline based on the request path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adminApp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;adminApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Admin Area"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will enter the mapped pipeline.&lt;/p&gt;

&lt;p&gt;This is useful when different URL paths require completely different processing.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Creating Custom Middleware
&lt;/h1&gt;

&lt;p&gt;One of the most useful skills for an ASP.NET Core developer is creating custom middleware.&lt;/p&gt;

&lt;p&gt;Suppose you want to measure how long every request takes.&lt;/p&gt;

&lt;p&gt;You could create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RequestTimingMiddleware&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RequestTimingMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_next&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InvokeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; took &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ElapsedMilliseconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; ms"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can register it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RequestTimingMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every request passes through your middleware.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Use Custom Middleware?
&lt;/h2&gt;

&lt;p&gt;Custom middleware is useful for cross-cutting concerns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request logging&lt;/li&gt;
&lt;li&gt;Correlation IDs&lt;/li&gt;
&lt;li&gt;Exception handling&lt;/li&gt;
&lt;li&gt;Performance measurement&lt;/li&gt;
&lt;li&gt;Security headers&lt;/li&gt;
&lt;li&gt;Request validation&lt;/li&gt;
&lt;li&gt;Custom authentication&lt;/li&gt;
&lt;li&gt;Tenant identification&lt;/li&gt;
&lt;li&gt;Audit logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important principle is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Middleware is best suited for logic that applies across many requests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't put business-specific logic into middleware when it belongs inside a service or controller.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Middleware Ordering Matters
&lt;/h1&gt;

&lt;p&gt;This is one of the most important concepts to understand.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthentication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapControllers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The order is intentional.&lt;/p&gt;

&lt;p&gt;Authentication establishes who the user is.&lt;/p&gt;

&lt;p&gt;Authorization then determines whether that user is allowed to access the resource.&lt;/p&gt;

&lt;p&gt;Finally, the request reaches the endpoint.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
  ↓
Authentication
  ↓
Authorization
  ↓
Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you change the order incorrectly, your application may behave unexpectedly.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthentication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is generally incorrect because authorization may execute before the user has been authenticated.&lt;/p&gt;

&lt;h3&gt;
  
  
  General rule
&lt;/h3&gt;

&lt;p&gt;When working with middleware, always ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Does this middleware depend on something that runs before it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question helps prevent many pipeline-related bugs.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Exception Handling Middleware
&lt;/h1&gt;

&lt;p&gt;Production applications should not expose raw exception details to users.&lt;/p&gt;

&lt;p&gt;Instead of allowing an exception to travel directly to the client, use exception-handling middleware.&lt;/p&gt;

&lt;p&gt;ASP.NET Core provides built-in support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsDevelopment&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/error"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also implement your own middleware.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InvokeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsJsonAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"An unexpected error occurred."&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a central place to handle unexpected failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Important
&lt;/h3&gt;

&lt;p&gt;Don't return sensitive exception details in production.&lt;/p&gt;

&lt;p&gt;Avoid responses such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SqlException: Login failed for user..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, return a safe message and log the detailed exception internally.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Request Logging Middleware
&lt;/h1&gt;

&lt;p&gt;Logging every request can be extremely useful when troubleshooting production applications.&lt;/p&gt;

&lt;p&gt;A simple middleware might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RequestLoggingMiddleware&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RequestLoggingMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RequestLoggingMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RequestLoggingMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_next&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_logger&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InvokeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"HTTP {Method} {Path} returned {StatusCode} in {Elapsed}ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ElapsedMilliseconds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can produce logs such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP GET /api/products returned 200 in 42ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more useful than randomly placing &lt;code&gt;Console.WriteLine()&lt;/code&gt; statements throughout your application.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Authentication and Authorization Middleware
&lt;/h1&gt;

&lt;p&gt;Authentication and authorization are related but different concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;Authentication answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who are you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → JWT Token → Authentication → User Identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;p&gt;Authorization answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you allowed to access this resource?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authenticated User
       ↓
Required Role = Admin
       ↓
Allowed / Forbidden
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In ASP.NET Core, you'll commonly see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthentication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then protect endpoints with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;GetOrders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with roles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Roles&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Admin"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;DeleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation is fundamental when designing secure APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Conditional Middleware
&lt;/h1&gt;

&lt;p&gt;Sometimes you don't want middleware to execute for every request.&lt;/p&gt;

&lt;p&gt;ASP.NET Core provides ways to conditionally add middleware.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseWhen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartsWithSegments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;branch&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RequestTimingMiddleware&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the middleware only runs for requests beginning with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use &lt;code&gt;MapWhen()&lt;/code&gt; when you want to create a completely separate pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapWhen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;branch&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Debug pipeline"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conditional middleware can be useful when different parts of your application require different processing.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Short-Circuiting the Pipeline
&lt;/h1&gt;

&lt;p&gt;Middleware doesn't always have to call &lt;code&gt;next()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It can stop the pipeline completely.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X-API-KEY"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;401&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"API key required."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the API key doesn't exist, the request ends immediately.&lt;/p&gt;

&lt;p&gt;The controller will never execute.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;short-circuiting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Short-circuiting is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication checks&lt;/li&gt;
&lt;li&gt;API key validation&lt;/li&gt;
&lt;li&gt;IP restrictions&lt;/li&gt;
&lt;li&gt;Maintenance mode&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Request validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, don't overuse it.&lt;/p&gt;

&lt;p&gt;If the logic belongs to authorization, validation, or business logic, use the appropriate ASP.NET Core mechanism instead of creating unnecessary custom middleware.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Middleware with Dependency Injection
&lt;/h1&gt;

&lt;p&gt;Middleware can also use services registered with ASP.NET Core's dependency injection container.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuditMiddleware&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;AuditMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestDelegate&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_next&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InvokeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;HttpContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IAuditService&lt;/span&gt; &lt;span class="n"&gt;auditService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;auditService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RecordAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that &lt;code&gt;IAuditService&lt;/code&gt; is injected into &lt;code&gt;InvokeAsync()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is useful when middleware needs application services.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IAuditService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AuditService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the middleware can use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Important Lifetime Consideration
&lt;/h3&gt;

&lt;p&gt;Be careful when injecting scoped services into middleware.&lt;/p&gt;

&lt;p&gt;Conventional middleware instances can live longer than a single request, so injecting scoped services into the middleware constructor can create lifetime problems.&lt;/p&gt;

&lt;p&gt;Prefer injecting request-scoped services into &lt;code&gt;InvokeAsync()&lt;/code&gt; when appropriate.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Common Middleware Mistakes
&lt;/h1&gt;

&lt;p&gt;Let's look at mistakes that frequently appear in real applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Forgetting &lt;code&gt;await next()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Logging"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// next() is never called&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline stops here.&lt;/p&gt;

&lt;p&gt;Unless the middleware intentionally short-circuits the request, this is a bug.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 2: Incorrect Middleware Order
&lt;/h2&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthentication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication should normally happen before authorization.&lt;/p&gt;

&lt;p&gt;Always understand the dependencies between middleware components.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 3: Putting Business Logic in Middleware
&lt;/h2&gt;

&lt;p&gt;Avoid doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// complex business rules&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Middleware should generally handle cross-cutting concerns.&lt;/p&gt;

&lt;p&gt;Business rules belong in appropriate application/domain services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 4: Logging Sensitive Information
&lt;/h2&gt;

&lt;p&gt;Don't blindly log:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;li&gt;Access tokens&lt;/li&gt;
&lt;li&gt;Refresh tokens&lt;/li&gt;
&lt;li&gt;Credit card information&lt;/li&gt;
&lt;li&gt;Sensitive personal information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logging should help diagnose problems without creating a security problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 5: Doing Expensive Work on Every Request
&lt;/h2&gt;

&lt;p&gt;Middleware runs frequently.&lt;/p&gt;

&lt;p&gt;If your application receives 10,000 requests, middleware may execute 10,000 times.&lt;/p&gt;

&lt;p&gt;Avoid unnecessary database calls, network calls, or expensive calculations in globally registered middleware.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Middleware Performance Best Practices
&lt;/h1&gt;

&lt;p&gt;Performance matters because middleware can affect every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Middleware Lightweight
&lt;/h3&gt;

&lt;p&gt;Good middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
 ↓
Small operation
 ↓
next()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid unnecessarily expensive processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid Blocking Calls
&lt;/h3&gt;

&lt;p&gt;Prefer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProcessAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of synchronous blocking operations.&lt;/p&gt;

&lt;p&gt;Avoid patterns such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProcessAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProcessAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Wait&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These can cause thread-pool starvation and performance problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Structured Logging
&lt;/h3&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;$"Request &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; took &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;ms"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer structured logging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"Request {Path} took {Elapsed}ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Structured logs are easier to search and analyze in logging platforms.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Middleware vs Filters
&lt;/h1&gt;

&lt;p&gt;A common interview question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What's the difference between middleware and MVC filters?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Middleware operates at the HTTP pipeline level.&lt;/p&gt;

&lt;p&gt;Filters are more closely associated with MVC/controller or endpoint execution.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Request
     ↓
Middleware
     ↓
Routing
     ↓
Endpoint
     ↓
MVC Filters
     ↓
Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use middleware for application-wide concerns.&lt;/p&gt;

&lt;p&gt;Use filters when the behavior is specifically related to MVC/controller or action execution.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Middleware Interview Questions
&lt;/h1&gt;

&lt;p&gt;Here are some questions worth knowing for .NET interviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What is middleware in ASP.NET Core?
&lt;/h3&gt;

&lt;p&gt;Middleware is software that participates in processing HTTP requests and responses within the ASP.NET Core pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What is &lt;code&gt;next()&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;next()&lt;/code&gt; passes control to the next middleware component.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What happens if &lt;code&gt;next()&lt;/code&gt; isn't called?
&lt;/h3&gt;

&lt;p&gt;The pipeline is short-circuited unless the middleware intentionally handles the response itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What is the difference between &lt;code&gt;Use()&lt;/code&gt; and &lt;code&gt;Run()&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Use()&lt;/code&gt; can call the next middleware.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Run()&lt;/code&gt; is terminal middleware and doesn't continue the pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Why does middleware order matter?
&lt;/h3&gt;

&lt;p&gt;Because middleware executes in the order it is registered, and some components depend on others running first.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. How do you create custom middleware?
&lt;/h3&gt;

&lt;p&gt;Create a class that accepts &lt;code&gt;RequestDelegate&lt;/code&gt; and exposes an &lt;code&gt;Invoke&lt;/code&gt; or &lt;code&gt;InvokeAsync&lt;/code&gt; method.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. What is short-circuiting?
&lt;/h3&gt;

&lt;p&gt;Stopping the request pipeline before subsequent middleware executes.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. When should middleware be used?
&lt;/h3&gt;

&lt;p&gt;For cross-cutting concerns such as logging, exception handling, authentication, security headers, and request processing.&lt;/p&gt;




&lt;h1&gt;
  
  
  Frequently Asked Questions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Is middleware executed for every request?
&lt;/h2&gt;

&lt;p&gt;Middleware registered globally generally participates in every request unless the pipeline is branched or the middleware itself chooses to short-circuit or skip processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can middleware modify the response?
&lt;/h2&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;Middleware can inspect or modify the response before or after calling the next component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can middleware access services?
&lt;/h2&gt;

&lt;p&gt;Yes. Middleware can use ASP.NET Core dependency injection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should business logic be placed in middleware?
&lt;/h2&gt;

&lt;p&gt;Generally, no. Middleware should focus on cross-cutting concerns rather than application-specific business rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can middleware stop a request?
&lt;/h2&gt;

&lt;p&gt;Yes. Middleware can short-circuit the pipeline by not calling &lt;code&gt;next()&lt;/code&gt; and returning a response directly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Middleware is one of the foundations of ASP.NET Core.&lt;/p&gt;

&lt;p&gt;Once you understand how the pipeline works, many ASP.NET Core features become easier to understand.&lt;/p&gt;

&lt;p&gt;The most important concepts to remember are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Middleware forms a request-processing pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Use()&lt;/code&gt; can continue the pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Run()&lt;/code&gt; is terminal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Map()&lt;/code&gt; can create branches.&lt;/li&gt;
&lt;li&gt;Middleware order matters.&lt;/li&gt;
&lt;li&gt;Middleware can short-circuit requests.&lt;/li&gt;
&lt;li&gt;Custom middleware is useful for cross-cutting concerns.&lt;/li&gt;
&lt;li&gt;Authentication should generally run before authorization.&lt;/li&gt;
&lt;li&gt;Middleware should remain lightweight.&lt;/li&gt;
&lt;li&gt;Business logic should live in appropriate services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're preparing for a .NET interview, don't just memorize these definitions. Build a small ASP.NET Core API and implement your own logging, exception handling, API-key validation, and request-timing middleware.&lt;/p&gt;

&lt;p&gt;That's when the pipeline really starts to make sense.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h1&gt;

&lt;p&gt;As developers, we often switch between different tools while building and debugging applications. Formatting API responses, decoding JWTs, comparing configuration files, generating UUIDs, or converting data shouldn't require opening several different websites.&lt;/p&gt;

&lt;p&gt;That's one reason I built &lt;strong&gt;ToolBenchApp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free, browser-based developer tools designed to make everyday development tasks faster and simpler.&lt;/p&gt;

&lt;p&gt;Some of the available tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON Formatter &amp;amp; Validator&lt;/li&gt;
&lt;li&gt;JWT Decoder&lt;/li&gt;
&lt;li&gt;JSON ↔ XML Converter&lt;/li&gt;
&lt;li&gt;JSON ↔ CSV Converter&lt;/li&gt;
&lt;li&gt;Base64 Encoder/Decoder&lt;/li&gt;
&lt;li&gt;UUID Generator&lt;/li&gt;
&lt;li&gt;URL Encoder/Decoder&lt;/li&gt;
&lt;li&gt;SQL Formatter&lt;/li&gt;
&lt;li&gt;YAML Formatter&lt;/li&gt;
&lt;li&gt;Text Difference Checker&lt;/li&gt;
&lt;li&gt;HTML Formatter&lt;/li&gt;
&lt;li&gt;Regex Tester&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with ASP.NET Core APIs, tools like the JSON Formatter, JWT Decoder, and Text Diff Checker can be particularly useful during development and debugging.&lt;/p&gt;

&lt;p&gt;I'm continuously adding new utilities based on what developers actually need, so if there's a tool you'd like to see on ToolBenchApp, feel free to share your idea.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>aspnetcore</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mastering LINQ in C#: 12 Practical Examples Every .NET Developer Should Know</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:03:00 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/mastering-linq-in-c-12-practical-examples-every-net-developer-should-know-id5</link>
      <guid>https://dev.to/toolbenchapp/mastering-linq-in-c-12-practical-examples-every-net-developer-should-know-id5</guid>
      <description>&lt;p&gt;If you're a .NET developer, you've probably written countless &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;foreach&lt;/code&gt; loops to filter, search, sort, and transform collections.&lt;/p&gt;

&lt;p&gt;Before LINQ (Language Integrated Query) was introduced in .NET 3.5, developers had to write repetitive looping logic for almost every data operation. While those approaches still work, they often make the code longer, harder to read, and more difficult to maintain.&lt;/p&gt;

&lt;p&gt;LINQ changed that by introducing a clean, expressive, and powerful way to query data directly within C#.&lt;/p&gt;

&lt;p&gt;Whether you're working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Arrays&lt;/li&gt;
&lt;li&gt;Dictionaries&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;li&gt;Entity Framework Core&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LINQ is one of the most valuable features you can master.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore &lt;strong&gt;12 practical LINQ examples&lt;/strong&gt; that every .NET developer should know, along with real-world use cases, best practices, performance tips, and common pitfalls.&lt;/p&gt;




&lt;h1&gt;
  
  
  📖 Table of Contents
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;What is LINQ?&lt;/li&gt;
&lt;li&gt;Why Use LINQ?&lt;/li&gt;
&lt;li&gt;LINQ Query Syntax vs Method Syntax&lt;/li&gt;
&lt;li&gt;Sample Project&lt;/li&gt;
&lt;li&gt;Example 1 – Where()&lt;/li&gt;
&lt;li&gt;Example 2 – Select()&lt;/li&gt;
&lt;li&gt;Example 3 – OrderBy()&lt;/li&gt;
&lt;li&gt;Example 4 – FirstOrDefault()&lt;/li&gt;
&lt;li&gt;More LINQ Methods (Part 2)&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Interview Questions&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  What is LINQ?
&lt;/h1&gt;

&lt;p&gt;LINQ stands for &lt;strong&gt;Language Integrated Query&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It allows developers to query collections using a consistent syntax directly within C#.&lt;/p&gt;

&lt;p&gt;Instead of manually looping through data, you simply describe &lt;strong&gt;what&lt;/strong&gt; you want.&lt;/p&gt;

&lt;p&gt;Traditional approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LINQ approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second example is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier to read&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;li&gt;Less error-prone&lt;/li&gt;
&lt;li&gt;More expressive&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Why Use LINQ?
&lt;/h1&gt;

&lt;p&gt;Here are a few reasons why LINQ has become an essential part of modern .NET development.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Less Code
&lt;/h2&gt;

&lt;p&gt;Tasks that once required several lines of loops and conditionals can often be written in a single, readable statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Better Readability
&lt;/h2&gt;

&lt;p&gt;LINQ reads almost like English.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even someone new to the project can quickly understand the intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Consistent API
&lt;/h2&gt;

&lt;p&gt;The same LINQ methods work across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arrays&lt;/li&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Dictionaries&lt;/li&gt;
&lt;li&gt;Entity Framework&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;li&gt;In-memory collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you learn LINQ, you can use it almost everywhere in .NET.&lt;/p&gt;




&lt;h1&gt;
  
  
  Query Syntax vs Method Syntax
&lt;/h1&gt;

&lt;p&gt;LINQ provides two styles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query Syntax
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;
&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Method Syntax
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Which one should you use?
&lt;/h3&gt;

&lt;p&gt;Microsoft supports both, but &lt;strong&gt;method syntax&lt;/strong&gt; is generally preferred because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's more concise.&lt;/li&gt;
&lt;li&gt;It supports all LINQ operations.&lt;/li&gt;
&lt;li&gt;Most production codebases use it.&lt;/li&gt;
&lt;li&gt;Entity Framework examples are primarily written using method syntax.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Throughout this article, we'll use &lt;strong&gt;method syntax&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sample Data
&lt;/h1&gt;

&lt;p&gt;We'll use the following &lt;code&gt;Employee&lt;/code&gt; class throughout the examples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"HR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;85000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;34&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Charlie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Finance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;72000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"David"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;95000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;38&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Emma"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"HR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;61000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's explore practical examples.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Filter Data Using &lt;code&gt;Where()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;Where()&lt;/code&gt; method filters a collection based on a condition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;itEmployees&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bob
David
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real-world use case
&lt;/h3&gt;

&lt;p&gt;Imagine you're building an employee management portal.&lt;/p&gt;

&lt;p&gt;Instead of loading every employee, you only want to display developers from the IT department.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Where()&lt;/code&gt; makes this incredibly simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practice
&lt;/h3&gt;

&lt;p&gt;Avoid writing multiple nested &lt;code&gt;Where()&lt;/code&gt; calls when a single condition is enough.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;80000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"IT"&lt;/span&gt;
&lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;80000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's easier to read and avoids unnecessary method chaining.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Project Data Using &lt;code&gt;Select()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Sometimes you don't need the entire object.&lt;/p&gt;

&lt;p&gt;Suppose you're creating a dropdown list that only needs employee names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alice
Bob
Charlie
David
Emma
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why is this important?
&lt;/h3&gt;

&lt;p&gt;Returning only the required fields reduces memory usage and improves performance.&lt;/p&gt;

&lt;p&gt;This becomes even more important when using Entity Framework because SQL queries retrieve only the selected columns.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Sort Data Using &lt;code&gt;OrderBy()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Need employees sorted by salary?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Highest salary?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;highest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OrderByDescending&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sorting is commonly used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;li&gt;Product listings&lt;/li&gt;
&lt;li&gt;Dashboards&lt;/li&gt;
&lt;li&gt;Search results&lt;/li&gt;
&lt;li&gt;Admin portals&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  4. Find the First Matching Record
&lt;/h1&gt;

&lt;p&gt;Suppose you're searching for an employee by ID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If no employee exists, the result is &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use &lt;code&gt;FirstOrDefault()&lt;/code&gt; instead of &lt;code&gt;First()&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;First()&lt;/code&gt; throws an exception if no record exists.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FirstOrDefault()&lt;/code&gt; safely returns &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In most applications, &lt;code&gt;FirstOrDefault()&lt;/code&gt; is the safer choice because it allows you to handle missing data gracefully.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;➡️ In Part 2&lt;/strong&gt;, we'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Any()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;All()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Count()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GroupBy()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Distinct()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Max()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Min()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Average()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sum()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Join()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Performance tips and deferred execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h1&gt;

&lt;p&gt;As developers, we often switch between multiple websites to format JSON, decode JWTs, compare text, generate UUIDs, or convert data between formats. I wanted a faster, privacy-friendly alternative, so I built &lt;strong&gt;ToolBenchApp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of &lt;strong&gt;free browser-based developer tools&lt;/strong&gt; designed to simplify everyday development tasks. Everything runs directly in your browser, helping you work faster without unnecessary downloads or uploads.&lt;/p&gt;

&lt;p&gt;Some of the tools currently available include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON Formatter &amp;amp; Validator&lt;/li&gt;
&lt;li&gt;JSON ↔ XML Converter&lt;/li&gt;
&lt;li&gt;JSON ↔ CSV Converter&lt;/li&gt;
&lt;li&gt;JWT Decoder&lt;/li&gt;
&lt;li&gt;Base64 Encoder/Decoder&lt;/li&gt;
&lt;li&gt;UUID Generator&lt;/li&gt;
&lt;li&gt;URL Encoder/Decoder&lt;/li&gt;
&lt;li&gt;SQL Formatter&lt;/li&gt;
&lt;li&gt;YAML Formatter&lt;/li&gt;
&lt;li&gt;Text Difference Checker&lt;/li&gt;
&lt;li&gt;HTML Formatter&lt;/li&gt;
&lt;li&gt;Regex Tester&lt;/li&gt;
&lt;li&gt;And many more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm continuously adding new tools based on feedback from the developer community. If there's a utility you'd like to see, let me know—I’d love to build it.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>10 Modern C# Features Every .NET Developer Should Know in 2026</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Wed, 05 Aug 2026 12:45:25 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/10-c-features-every-net-developer-should-be-using-1jc9</link>
      <guid>https://dev.to/toolbenchapp/10-c-features-every-net-developer-should-be-using-1jc9</guid>
      <description>&lt;p&gt;C# has evolved tremendously over the past few years. With every new release, Microsoft introduces features that make code cleaner, safer, and easier to maintain. Yet many developers still rely on patterns that were common years ago, missing out on language improvements that can significantly boost productivity.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore &lt;strong&gt;10 modern C# features&lt;/strong&gt; that every .NET developer should know in 2026. Whether you're building ASP.NET Core APIs, desktop applications, cloud services, or microservices, these features can help you write more expressive and maintainable code.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;String Interpolation&lt;/li&gt;
&lt;li&gt;Null-Coalescing Operator (&lt;code&gt;??&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Null-Conditional Operator (&lt;code&gt;?.&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Pattern Matching&lt;/li&gt;
&lt;li&gt;Switch Expressions&lt;/li&gt;
&lt;li&gt;Expression-Bodied Members&lt;/li&gt;
&lt;li&gt;Using Declarations&lt;/li&gt;
&lt;li&gt;Records&lt;/li&gt;
&lt;li&gt;Global Using Directives&lt;/li&gt;
&lt;li&gt;File-Scoped Namespaces&lt;/li&gt;
&lt;li&gt;Bonus Features&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. String Interpolation
&lt;/h2&gt;

&lt;p&gt;Instead of concatenating strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Welcome "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use string interpolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Welcome &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner and easier to read&lt;/li&gt;
&lt;li&gt;Less error-prone&lt;/li&gt;
&lt;li&gt;Great for logging and debugging&lt;/li&gt;
&lt;li&gt;Preferred in modern C# codebases&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Null-Coalescing Operator (&lt;code&gt;??&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Guest"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="s"&gt;"Guest"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces boilerplate while making your intent obvious.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Null-Conditional Operator (&lt;code&gt;?.&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Without it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;City&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;City&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps prevent &lt;code&gt;NullReferenceException&lt;/code&gt; and keeps your code concise.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Pattern Matching
&lt;/h2&gt;

&lt;p&gt;Instead of checking and casting separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pattern matching improves readability and reduces repetitive casting.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Switch Expressions
&lt;/h2&gt;

&lt;p&gt;Traditional switch statements are often verbose.&lt;/p&gt;

&lt;p&gt;Modern C# allows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userType&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Manager"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Employee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Guest"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's concise, expressive, and easier to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Expression-Bodied Members
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetFullName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;FirstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetFullName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;FirstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for simple methods and properties.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Using Declarations
&lt;/h2&gt;

&lt;p&gt;Old approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces unnecessary indentation while ensuring proper resource disposal.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Records
&lt;/h2&gt;

&lt;p&gt;For immutable models and DTOs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Value-based equality&lt;/li&gt;
&lt;li&gt;Less boilerplate&lt;/li&gt;
&lt;li&gt;Immutability by default&lt;/li&gt;
&lt;li&gt;Excellent for API request and response models&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Global Using Directives
&lt;/h2&gt;

&lt;p&gt;Instead of repeating the same &lt;code&gt;using&lt;/code&gt; statements in every file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps files cleaner and reduces repetition across your project.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. File-Scoped Namespaces
&lt;/h2&gt;

&lt;p&gt;Traditional syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;DemoProject&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;DemoProject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Less indentation means cleaner, easier-to-read source files.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Features Worth Exploring
&lt;/h1&gt;

&lt;p&gt;Modern C# continues to evolve. Here are a few more features worth adding to your toolkit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;required&lt;/code&gt; members&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;init&lt;/code&gt; properties&lt;/li&gt;
&lt;li&gt;Target-typed &lt;code&gt;new&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nameof&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Raw string literals&lt;/li&gt;
&lt;li&gt;Collection expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IAsyncEnumerable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Primary constructors (C# 12)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why These Features Matter
&lt;/h2&gt;

&lt;p&gt;Adopting modern C# features isn't about writing fewer lines of code—it's about writing &lt;strong&gt;better&lt;/strong&gt; code.&lt;/p&gt;

&lt;p&gt;These features help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve readability&lt;/li&gt;
&lt;li&gt;Reduce boilerplate&lt;/li&gt;
&lt;li&gt;Prevent common bugs&lt;/li&gt;
&lt;li&gt;Simplify refactoring&lt;/li&gt;
&lt;li&gt;Improve maintainability&lt;/li&gt;
&lt;li&gt;Write cleaner APIs and services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even introducing one or two of these features into your daily workflow can make a noticeable difference over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;One of the biggest strengths of C# is its continuous evolution. Each new version introduces features that make development more enjoyable without breaking existing applications.&lt;/p&gt;

&lt;p&gt;You don't need to adopt everything overnight. Start by using one or two of these features in your next project, then gradually expand your toolkit as they become second nature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which modern C# feature has had the biggest impact on your codebase?&lt;/strong&gt; I'd love to hear your thoughts—and if there's a feature you think deserves a spot on this list, share it in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h2&gt;

&lt;p&gt;If you regularly work with .NET, APIs, JSON, JWTs, formatting, encoding, or debugging, you might find &lt;strong&gt;ToolBenchApp&lt;/strong&gt; useful.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free browser-based developer tools designed to simplify everyday development tasks. Whether you need to format JSON, decode JWTs, compare text, generate UUIDs, or convert data between common formats, the goal is to help developers stay productive without switching between multiple tools.&lt;/p&gt;

&lt;p&gt;I'm continuously improving ToolBenchApp based on feedback from the developer community, so if there's a tool you'd like to see added, I'd love to hear your suggestions.&lt;/p&gt;




&lt;p&gt;⭐ &lt;strong&gt;If you found this article helpful, consider leaving a ❤️ and sharing it with other .NET developers. Happy coding!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>15 VS Code Shortcuts That Save Me Hours Every Month</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Tue, 04 Aug 2026 13:40:53 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/15-vs-code-shortcuts-that-save-me-hours-every-month-1k9d</link>
      <guid>https://dev.to/toolbenchapp/15-vs-code-shortcuts-that-save-me-hours-every-month-1k9d</guid>
      <description>&lt;p&gt;Visual Studio Code has become the go-to editor for millions of developers. Whether you're building web applications, backend services, mobile apps, or cloud solutions, chances are VS Code is part of your daily workflow.&lt;/p&gt;

&lt;p&gt;When I first started using VS Code, I relied almost entirely on the mouse. Over time, I discovered that learning a handful of keyboard shortcuts dramatically improved my productivity.&lt;/p&gt;

&lt;p&gt;Here are 15 shortcuts I use almost every day, along with examples of when they come in handy.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Quick Open Files
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Windows/Linux&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cmd + P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instantly search and open any file in your project.&lt;/p&gt;

&lt;p&gt;Instead of navigating through folders, simply type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Command Palette
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + Shift + P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of this as VS Code's control center.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rename symbols&lt;/li&gt;
&lt;li&gt;Change themes&lt;/li&gt;
&lt;li&gt;Run extensions&lt;/li&gt;
&lt;li&gt;Format documents&lt;/li&gt;
&lt;li&gt;Open settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can't remember where an option lives, chances are it's available here.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Multi-Cursor Editing
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alt + Click
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need to edit several lines at once?&lt;/p&gt;

&lt;p&gt;Place multiple cursors and type simultaneously.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updating repeated variable names&lt;/li&gt;
&lt;li&gt;Editing JSON&lt;/li&gt;
&lt;li&gt;Modifying configuration files&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  4. Rename Symbol
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of manually replacing every occurrence of a variable or method, press &lt;strong&gt;F2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;VS Code intelligently updates references across your project.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Format Document
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shift + Alt + F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One shortcut instantly formats your code.&lt;/p&gt;

&lt;p&gt;Works especially well with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6. Find Across the Project
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + Shift + F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search every file in your workspace.&lt;/p&gt;

&lt;p&gt;Extremely useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactoring code&lt;/li&gt;
&lt;li&gt;Finding API endpoints&lt;/li&gt;
&lt;li&gt;Locating configuration values&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7. Replace Across Files
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + Shift + H
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for large-scale refactoring.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Replace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OldApiService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UserApiService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;across hundreds of files in seconds.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Duplicate a Line
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shift + Alt + Down Arrow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This duplicates the current line.&lt;/p&gt;

&lt;p&gt;Great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating similar objects&lt;/li&gt;
&lt;li&gt;Repeating configuration blocks&lt;/li&gt;
&lt;li&gt;Experimenting with code&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  9. Move a Line Up or Down
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alt + Up Arrow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alt + Down Arrow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rearrange code without cutting and pasting.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Toggle Terminal
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + `
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quickly open or close the integrated terminal.&lt;/p&gt;

&lt;p&gt;Ideal for running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm install&lt;/li&gt;
&lt;li&gt;dotnet run&lt;/li&gt;
&lt;li&gt;git commands&lt;/li&gt;
&lt;li&gt;Angular CLI&lt;/li&gt;
&lt;li&gt;Docker commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without leaving VS Code.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Go to Definition
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jump directly to the implementation of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;Interfaces&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is invaluable when navigating large codebases.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Peek Definition
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alt + F12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of opening another file, peek at the definition in a small popup.&lt;/p&gt;

&lt;p&gt;Perfect for quick inspections.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Comment or Uncomment Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple but frequently used shortcut.&lt;/p&gt;

&lt;p&gt;Ideal when debugging or temporarily disabling code.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Toggle Sidebar
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need more screen space?&lt;/p&gt;

&lt;p&gt;Hide the Explorer and focus on your code.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Open Recently Used Files
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + Tab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quickly switch between recently opened files.&lt;/p&gt;

&lt;p&gt;Especially useful when working across multiple services or components.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Productivity Tips
&lt;/h1&gt;

&lt;p&gt;Here are a few habits that complement these shortcuts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;Auto Save&lt;/strong&gt; for fewer interruptions.&lt;/li&gt;
&lt;li&gt;Install &lt;strong&gt;GitLens&lt;/strong&gt; to view Git history inline.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Error Lens&lt;/strong&gt; to surface errors directly in your code.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Prettier&lt;/strong&gt; for automatic formatting.&lt;/li&gt;
&lt;li&gt;Learn your debugger shortcuts—they're just as valuable as editing shortcuts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small workflow improvements compound over time.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;You don't need to memorize every VS Code shortcut overnight. Start with three or four that solve your biggest daily pain points, and gradually add more as they become second nature.&lt;/p&gt;

&lt;p&gt;Even saving a few seconds on repetitive tasks adds up over weeks and months, letting you focus more on solving problems and writing great code.&lt;/p&gt;

&lt;p&gt;Which VS Code shortcut has had the biggest impact on your workflow? Or is there a hidden gem that more developers should know? Share it in the comments—I’m always looking to improve my own workflow too.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h2&gt;

&lt;p&gt;If you frequently work with JSON, APIs, formatting, encoding, validation, or debugging, you might enjoy &lt;strong&gt;ToolBenchApp&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free browser-based developer tools built to simplify everyday development tasks. Whether you're formatting JSON, validating data, decoding JWTs, generating UUIDs, comparing text, or converting between common formats, the goal is to help developers work faster without leaving the browser.&lt;/p&gt;

&lt;p&gt;I'm continuously expanding the platform based on real developer needs, so if there's a tool you'd like to see, I'd love to hear your ideas.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>12 Git Commands Every Developer Should Know (With Practical Examples)</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Mon, 03 Aug 2026 11:30:12 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/12-git-commands-every-developer-should-know-with-practical-examples-3bgc</link>
      <guid>https://dev.to/toolbenchapp/12-git-commands-every-developer-should-know-with-practical-examples-3bgc</guid>
      <description>&lt;h1&gt;
  
  
  12 Git Commands Every Developer Should Know (With Practical Examples)
&lt;/h1&gt;

&lt;p&gt;Whether you're working on a solo side project or collaborating with a large engineering team, Git is one of the most important tools in a developer's toolkit.&lt;/p&gt;

&lt;p&gt;Many developers know just enough Git to get by—&lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and &lt;code&gt;git push&lt;/code&gt;. But learning a few additional commands can save hours of debugging, prevent mistakes, and make collaboration much smoother.&lt;/p&gt;

&lt;p&gt;In this article, we'll walk through 12 Git commands that every developer should understand, complete with practical examples and common use cases.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Check the Status of Your Repository
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modified files&lt;/li&gt;
&lt;li&gt;New files&lt;/li&gt;
&lt;li&gt;Deleted files&lt;/li&gt;
&lt;li&gt;Files staged for commit&lt;/li&gt;
&lt;li&gt;Current branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On branch feature/login

Changes not staged for commit:
modified: src/app.ts

Untracked files:
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is often the first command you should run before committing changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Stage Files
&lt;/h1&gt;

&lt;p&gt;Stage a single file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stage everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only staged files become part of your next commit.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Commit Changes
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add user authentication"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good commit message explains &lt;strong&gt;what changed&lt;/strong&gt;, not just &lt;em&gt;that&lt;/em&gt; something changed.&lt;/p&gt;

&lt;p&gt;Good examples:&lt;/p&gt;

&lt;p&gt;✅ Fix login validation&lt;/p&gt;

&lt;p&gt;✅ Add pagination to Products API&lt;/p&gt;

&lt;p&gt;❌ Changes&lt;/p&gt;

&lt;p&gt;❌ Update&lt;/p&gt;




&lt;h1&gt;
  
  
  4. View Commit History
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a cleaner view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d91a31c Fix JWT validation
94ab621 Add user profile endpoint
c2f70f1 Initial project setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  5. Create a New Branch
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or using the newer command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating feature branches keeps your main branch stable.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Switch Between Branches
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always verify you're on the correct branch before making changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Pull Latest Changes
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This downloads and merges the latest commits from the remote repository.&lt;/p&gt;

&lt;p&gt;Pull regularly to reduce merge conflicts.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Push Your Changes
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin feature/payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your teammates can't review your work until it's pushed.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. See What Changed
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare staged changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--staged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is extremely useful before committing.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Undo the Last Commit (Without Losing Changes)
&lt;/h1&gt;

&lt;p&gt;If you committed too early:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your changes remain staged, allowing you to edit and recommit.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Stash Temporary Work
&lt;/h1&gt;

&lt;p&gt;Need to switch branches without committing unfinished work?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restore it later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git Stash is perfect when an urgent production issue interrupts your current task.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. View Remote Repositories
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin https://github.com/company/project.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful when working with multiple remotes or verifying repository URLs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Tips
&lt;/h1&gt;

&lt;p&gt;Here are a few habits that can improve your Git workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit small, focused changes.&lt;/li&gt;
&lt;li&gt;Pull before pushing.&lt;/li&gt;
&lt;li&gt;Write meaningful commit messages.&lt;/li&gt;
&lt;li&gt;Avoid committing generated files unless necessary.&lt;/li&gt;
&lt;li&gt;Review changes with &lt;code&gt;git diff&lt;/code&gt; before every commit.&lt;/li&gt;
&lt;li&gt;Use feature branches instead of committing directly to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Resolve merge conflicts carefully instead of rushing through them.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  A Typical Git Workflow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/profile
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add profile page"&lt;/span&gt;
git push origin feature/profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create a Pull Request for code review.&lt;/p&gt;

&lt;p&gt;This workflow keeps collaboration organized and makes changes easier to review.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Git is much more than a version control system—it's a collaboration tool that helps teams build software safely and efficiently.&lt;/p&gt;

&lt;p&gt;You don't need to memorize every Git command, but mastering the essentials can make your daily development workflow faster, reduce mistakes, and give you more confidence when working on real-world projects.&lt;/p&gt;

&lt;p&gt;Which Git command do you use the most? Are there any lesser-known Git tricks that have saved you time? Share them in the comments—I’m always looking to learn new workflows from the community.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Explore More Free Developer Tools
&lt;/h2&gt;

&lt;p&gt;If you regularly work with JSON, APIs, encoding, formatting, validation, or debugging, you might find &lt;strong&gt;ToolBenchApp&lt;/strong&gt; useful:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free browser-based developer tools designed to simplify everyday development tasks. Whether you need to format JSON, decode JWTs, compare text, generate UUIDs, or convert data between formats, the goal is to help developers stay productive without leaving the browser.&lt;/p&gt;

&lt;p&gt;I'm continuously improving the platform based on developer feedback, so if there's a tool you'd like to see added, I'd love to hear your suggestions.&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 REST API Best Practices Every Backend Developer Should Follow</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:33:01 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/7-rest-api-best-practices-every-backend-developer-should-follow-33ch</link>
      <guid>https://dev.to/toolbenchapp/7-rest-api-best-practices-every-backend-developer-should-follow-33ch</guid>
      <description>&lt;h1&gt;
  
  
  7 REST API Best Practices Every Backend Developer Should Follow
&lt;/h1&gt;

&lt;p&gt;Designing a REST API isn't just about making endpoints work—it's about creating an interface that's intuitive, reliable, secure, and easy for other developers to integrate with.&lt;/p&gt;

&lt;p&gt;Whether you're building a personal project or a production-grade application, following REST API best practices can save countless hours of debugging and future maintenance.&lt;/p&gt;

&lt;p&gt;Here are seven practices that have consistently helped me build better APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Use Meaningful Resource Names
&lt;/h1&gt;

&lt;p&gt;Your endpoints should represent &lt;strong&gt;resources&lt;/strong&gt;, not actions.&lt;/p&gt;

&lt;p&gt;✅ Good&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users
GET /api/users/15
POST /api/users
PUT /api/users/15
DELETE /api/users/15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ Avoid&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/getUsers
POST /api/createUser
POST /api/deleteUser
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using nouns instead of verbs makes your API more predictable and aligns with REST principles.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Return the Right HTTP Status Codes
&lt;/h1&gt;

&lt;p&gt;HTTP status codes tell clients exactly what happened.&lt;/p&gt;

&lt;p&gt;Some common examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Request succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;Resource created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;204&lt;/td&gt;
&lt;td&gt;Success with no response body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Invalid request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Authentication required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Permission denied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Resource not found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;409&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Internal server error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Returning &lt;code&gt;200 OK&lt;/code&gt; for every response—even errors—makes debugging much harder.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Keep Your Responses Consistent
&lt;/h1&gt;

&lt;p&gt;Imagine one endpoint returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While another returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fullName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both represent the same resource but use different naming conventions.&lt;/p&gt;

&lt;p&gt;Instead, choose one style and use it consistently across your API.&lt;/p&gt;

&lt;p&gt;Consistency makes client-side development much easier.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Return Useful Error Messages
&lt;/h1&gt;

&lt;p&gt;Instead of returning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid request"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Provide something developers can actually act on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Email address is required."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good error messages reduce debugging time and improve the developer experience.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Validate Input Early
&lt;/h1&gt;

&lt;p&gt;Never assume incoming data is valid.&lt;/p&gt;

&lt;p&gt;Always validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required fields&lt;/li&gt;
&lt;li&gt;Email formats&lt;/li&gt;
&lt;li&gt;Number ranges&lt;/li&gt;
&lt;li&gt;Date formats&lt;/li&gt;
&lt;li&gt;String lengths&lt;/li&gt;
&lt;li&gt;Business rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fail fast with a clear response instead of allowing invalid data to reach your database.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Version Your API
&lt;/h1&gt;

&lt;p&gt;As your application evolves, your API will change too.&lt;/p&gt;

&lt;p&gt;Versioning prevents breaking existing clients.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;/api/v1/users
/api/v2/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows older applications to continue working while newer clients adopt the latest version.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Document Your API
&lt;/h1&gt;

&lt;p&gt;A well-designed API still needs good documentation.&lt;/p&gt;

&lt;p&gt;Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint URLs&lt;/li&gt;
&lt;li&gt;Request methods&lt;/li&gt;
&lt;li&gt;Authentication requirements&lt;/li&gt;
&lt;li&gt;Sample requests&lt;/li&gt;
&lt;li&gt;Sample responses&lt;/li&gt;
&lt;li&gt;Error codes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools like Swagger (OpenAPI) make it much easier for developers to understand and test your API.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Tips
&lt;/h1&gt;

&lt;p&gt;Here are a few additional practices that can make your APIs even better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use pagination for large datasets.&lt;/li&gt;
&lt;li&gt;Support filtering and sorting where appropriate.&lt;/li&gt;
&lt;li&gt;Avoid exposing internal database IDs if they shouldn't be public.&lt;/li&gt;
&lt;li&gt;Implement rate limiting for public APIs.&lt;/li&gt;
&lt;li&gt;Use HTTPS for all production endpoints.&lt;/li&gt;
&lt;li&gt;Log errors without exposing sensitive information to clients.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Example: A Well-Designed Endpoint
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/products?category=laptops&amp;amp;page=2&amp;amp;pageSize=10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pageSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalPages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Laptop Pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;999.99&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure provides useful metadata and makes pagination straightforward for frontend developers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;A great REST API is more than just a collection of endpoints—it's a contract between your application and its consumers.&lt;/p&gt;

&lt;p&gt;By using meaningful resource names, returning the correct status codes, validating input, maintaining consistent response structures, versioning your API, and providing clear documentation, you'll create APIs that are easier to use, easier to maintain, and more enjoyable for other developers to integrate with.&lt;/p&gt;

&lt;p&gt;What REST API best practice has made the biggest difference in your projects? I'd love to hear your thoughts and experiences in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Explore More Free Developer Tools
&lt;/h2&gt;

&lt;p&gt;If you frequently work with APIs, JSON, encoding, formatting, or debugging, you might find &lt;strong&gt;ToolBenchApp&lt;/strong&gt; useful:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free browser-based developer tools built to simplify everyday development tasks. From JSON formatting and validation to JWT decoding, text comparison, UUID generation, and other handy utilities, the goal is to help developers spend less time on repetitive tasks and more time building great software.&lt;/p&gt;

&lt;p&gt;I'm continuously adding new tools based on community feedback, so if there's something you'd like to see, feel free to share your ideas!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 JSON Mistakes That Break APIs (And How to Avoid Them)</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Tue, 28 Jul 2026 12:26:20 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/10-json-mistakes-that-break-apis-and-how-to-avoid-them-3p8l</link>
      <guid>https://dev.to/toolbenchapp/10-json-mistakes-that-break-apis-and-how-to-avoid-them-3p8l</guid>
      <description>&lt;p&gt;JSON has become the standard format for exchanging data between applications. Whether you're building REST APIs, integrating third-party services, or working with frontend frameworks like React, Angular, or Vue, you'll interact with JSON almost every day.&lt;/p&gt;

&lt;p&gt;Despite its simple syntax, even small mistakes in JSON can cause API requests to fail, configuration files to break, or applications to crash.&lt;/p&gt;

&lt;p&gt;In this article, we'll go through 10 common JSON mistakes developers make and how to avoid them.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Forgetting Double Quotes Around Property Names
&lt;/h1&gt;

&lt;p&gt;JSON requires every property name to be enclosed in double quotes.&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;name:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;age:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correct&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many developers accidentally write JavaScript object syntax instead of valid JSON.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Using Single Quotes
&lt;/h1&gt;

&lt;p&gt;JSON only supports double quotes.&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;'name':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'John'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correct&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  3. Leaving a Trailing Comma
&lt;/h1&gt;

&lt;p&gt;Trailing commas are common in JavaScript but are invalid in JSON.&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correct&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Missing Commas Between Properties
&lt;/h1&gt;

&lt;p&gt;A missing comma is one of the most common reasons JSON validation fails.&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correct&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  5. Invalid Data Types
&lt;/h1&gt;

&lt;p&gt;JSON supports only these data types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Number&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trying to include unsupported values like functions or &lt;code&gt;undefined&lt;/code&gt; makes the JSON invalid.&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  6. Sending Numbers as Strings
&lt;/h1&gt;

&lt;p&gt;Sometimes APIs expect a number, but developers accidentally send a string.&lt;/p&gt;

&lt;p&gt;❌&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small mistake can cause validation errors on the server.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Invalid Nested Objects
&lt;/h1&gt;

&lt;p&gt;Complex JSON often becomes difficult to read.&lt;/p&gt;

&lt;p&gt;Instead of writing everything on one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"London"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"zip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format it properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"London"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"zip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Readable JSON is much easier to debug.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Mixing Arrays and Objects
&lt;/h1&gt;

&lt;p&gt;Arrays use square brackets.&lt;/p&gt;

&lt;p&gt;Objects use curly braces.&lt;/p&gt;

&lt;p&gt;Incorrect structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Java"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"C#"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Java"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"C#"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  9. Not Validating JSON Before Sending It
&lt;/h1&gt;

&lt;p&gt;Many API errors happen because invalid JSON is sent to the server.&lt;/p&gt;

&lt;p&gt;Before calling an API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate your JSON.&lt;/li&gt;
&lt;li&gt;Format it for readability.&lt;/li&gt;
&lt;li&gt;Check the data types.&lt;/li&gt;
&lt;li&gt;Ensure all required fields exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This simple habit can save a lot of debugging time.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Ignoring API Documentation
&lt;/h1&gt;

&lt;p&gt;Even if your JSON is valid, it may still fail if it doesn't match the API's expected structure.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON is valid, but the API doesn't recognize the property.&lt;/p&gt;

&lt;p&gt;Always compare your request with the API documentation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Quick Checklist Before Sending JSON
&lt;/h1&gt;

&lt;p&gt;✅ Property names use double quotes&lt;/p&gt;

&lt;p&gt;✅ No trailing commas&lt;/p&gt;

&lt;p&gt;✅ Valid data types&lt;/p&gt;

&lt;p&gt;✅ Arrays use &lt;code&gt;[]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ Objects use &lt;code&gt;{}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ Required properties are included&lt;/p&gt;

&lt;p&gt;✅ Numbers are not sent as strings&lt;/p&gt;

&lt;p&gt;✅ JSON is validated&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Most JSON-related issues aren't caused by complex bugs—they're caused by tiny syntax mistakes that are easy to overlook.&lt;/p&gt;

&lt;p&gt;By validating your JSON, formatting it for readability, and following API documentation carefully, you can avoid hours of unnecessary debugging.&lt;/p&gt;

&lt;p&gt;What JSON mistake has cost you the most time? Share your experience in the comments—your story might help another developer avoid the same issue.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## Explore More Developer Tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you regularly work with JSON, APIs, formatting, encoding, decoding, or data conversion, check out &lt;strong&gt;ToolBenchApp&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ToolBenchApp is a growing collection of free browser-based developer tools designed to simplify everyday development tasks. Whether you need to format JSON, decode JWTs, compare text, generate UUIDs, or convert data between formats, the goal is simple: help developers save time and stay focused on building great software.&lt;/p&gt;

&lt;p&gt;If there's a tool you'd like to see added, I'd love to hear your suggestions!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>json</category>
      <category>api</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding HTTP Status Codes Every Developer Should Know (With Real API Examples)</title>
      <dc:creator>ToolBench</dc:creator>
      <pubDate>Mon, 13 Jul 2026 12:46:28 +0000</pubDate>
      <link>https://dev.to/toolbenchapp/understanding-http-status-codes-every-developer-should-know-with-real-api-examples-56an</link>
      <guid>https://dev.to/toolbenchapp/understanding-http-status-codes-every-developer-should-know-with-real-api-examples-56an</guid>
      <description>&lt;h1&gt;
  
  
  Understanding HTTP Status Codes Every Developer Should Know (With Real API Examples)
&lt;/h1&gt;

&lt;p&gt;If you've ever integrated an API, you've almost certainly encountered responses like &lt;strong&gt;200 OK&lt;/strong&gt;, &lt;strong&gt;404 Not Found&lt;/strong&gt;, or &lt;strong&gt;500 Internal Server Error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first, these numbers can seem confusing. But once you understand what each status code means, debugging becomes much easier.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore the most common HTTP status codes, when they're returned, and how to respond to them as a developer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are HTTP Status Codes?
&lt;/h2&gt;

&lt;p&gt;HTTP status codes are standardized responses sent by a server after it receives a request from a client (such as a web browser, mobile app, or frontend application).&lt;/p&gt;

&lt;p&gt;Every response contains two important pieces of information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;status code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;response body&lt;/strong&gt; (if any)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User retrieved successfully"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The status code immediately tells you whether the request succeeded or failed.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Five Categories of Status Codes
&lt;/h1&gt;

&lt;p&gt;HTTP status codes are grouped into five categories.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Range&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1xx&lt;/td&gt;
&lt;td&gt;Informational&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2xx&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3xx&lt;/td&gt;
&lt;td&gt;Redirection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4xx&lt;/td&gt;
&lt;td&gt;Client Errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5xx&lt;/td&gt;
&lt;td&gt;Server Errors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's look at the ones you'll encounter most often.&lt;/p&gt;




&lt;h1&gt;
  
  
  200 OK
&lt;/h1&gt;

&lt;p&gt;This is the response every developer wants to see.&lt;/p&gt;

&lt;p&gt;It means the request was successful and the server returned the expected data.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users/15

Response

200 OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response body&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetching users&lt;/li&gt;
&lt;li&gt;Loading products&lt;/li&gt;
&lt;li&gt;Retrieving reports&lt;/li&gt;
&lt;li&gt;Reading configuration data&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  201 Created
&lt;/h1&gt;

&lt;p&gt;Returned after successfully creating a new resource.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;201 Created
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User registration&lt;/li&gt;
&lt;li&gt;Creating blog posts&lt;/li&gt;
&lt;li&gt;Adding products&lt;/li&gt;
&lt;li&gt;Creating orders&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  204 No Content
&lt;/h1&gt;

&lt;p&gt;Sometimes an operation succeeds but doesn't need to return any data.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /api/users/15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;204 No Content
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is commonly used after successful delete operations.&lt;/p&gt;




&lt;h1&gt;
  
  
  400 Bad Request
&lt;/h1&gt;

&lt;p&gt;The server couldn't process the request because it was invalid.&lt;/p&gt;

&lt;p&gt;Common reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing required fields&lt;/li&gt;
&lt;li&gt;Invalid JSON&lt;/li&gt;
&lt;li&gt;Incorrect data types&lt;/li&gt;
&lt;li&gt;Validation failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"not-an-email"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Invalid email address"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always validate user input before sending requests.&lt;/p&gt;




&lt;h1&gt;
  
  
  401 Unauthorized
&lt;/h1&gt;

&lt;p&gt;Authentication is required.&lt;/p&gt;

&lt;p&gt;Typical causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing JWT token&lt;/li&gt;
&lt;li&gt;Expired access token&lt;/li&gt;
&lt;li&gt;Invalid credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization header missing
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;401 Unauthorized
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  403 Forbidden
&lt;/h1&gt;

&lt;p&gt;The user is authenticated but doesn't have permission.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;A normal user tries to access an admin endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;403 Forbidden
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401&lt;/strong&gt; = "Who are you?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403&lt;/strong&gt; = "I know who you are, but you're not allowed."&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  404 Not Found
&lt;/h1&gt;

&lt;p&gt;Probably the most recognized status code.&lt;/p&gt;

&lt;p&gt;It means the requested resource doesn't exist.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/products/99999
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;404 Not Found
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrong URL&lt;/li&gt;
&lt;li&gt;Deleted resource&lt;/li&gt;
&lt;li&gt;Incorrect API version&lt;/li&gt;
&lt;li&gt;Typo in endpoint&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  409 Conflict
&lt;/h1&gt;

&lt;p&gt;Returned when a request conflicts with existing data.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Creating a user with an email address that's already registered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;409 Conflict
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  422 Unprocessable Entity
&lt;/h1&gt;

&lt;p&gt;The request is syntactically correct, but the provided data doesn't satisfy business rules.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Age must be greater than zero."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many modern REST APIs use this status code for validation errors.&lt;/p&gt;




&lt;h1&gt;
  
  
  500 Internal Server Error
&lt;/h1&gt;

&lt;p&gt;This indicates something went wrong on the server.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Null reference exceptions&lt;/li&gt;
&lt;li&gt;Database connection failures&lt;/li&gt;
&lt;li&gt;Unexpected exceptions&lt;/li&gt;
&lt;li&gt;Configuration issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;500 Internal Server Error
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're building APIs, avoid exposing stack traces to clients. Instead, log the error internally and return a meaningful message.&lt;/p&gt;




&lt;h1&gt;
  
  
  503 Service Unavailable
&lt;/h1&gt;

&lt;p&gt;The server is temporarily unavailable.&lt;/p&gt;

&lt;p&gt;Possible reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduled maintenance&lt;/li&gt;
&lt;li&gt;High traffic&lt;/li&gt;
&lt;li&gt;Database outage&lt;/li&gt;
&lt;li&gt;Dependency failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike a 500 error, a 503 often indicates the service may recover shortly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Quick Reference
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;Resource created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;204&lt;/td&gt;
&lt;td&gt;Success, no response body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Bad request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Authentication required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Permission denied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Resource not found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;409&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;Validation/business rule failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Internal server error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;Service temporarily unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Best Practices
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Use the correct status code instead of always returning &lt;code&gt;200&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Return clear, consistent error messages.&lt;/li&gt;
&lt;li&gt;Validate input before processing requests.&lt;/li&gt;
&lt;li&gt;Log server-side exceptions for troubleshooting.&lt;/li&gt;
&lt;li&gt;Avoid exposing sensitive implementation details in error responses.&lt;/li&gt;
&lt;li&gt;Document expected status codes in your API documentation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Understanding HTTP status codes is one of the simplest ways to become more effective at debugging APIs and building reliable applications. Choosing the right response code also makes your APIs easier for other developers to integrate with and troubleshoot.&lt;/p&gt;

&lt;p&gt;Which HTTP status code do you encounter most often in your day-to-day development? Share your experience in the comments—I’d love to hear your stories and debugging tips.&lt;/p&gt;




&lt;h3&gt;
  
  
  Explore More Developer Tools
&lt;/h3&gt;

&lt;p&gt;If you regularly work with APIs, JSON, encoding, formatting, or debugging, check out &lt;strong&gt;ToolBenchApp&lt;/strong&gt;: &lt;strong&gt;&lt;a href="https://toolbenchapp.com/" rel="noopener noreferrer"&gt;https://toolbenchapp.com/&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's a growing collection of free browser-based developer tools designed to simplify everyday development tasks—whether you're formatting JSON, validating data, decoding JWTs, comparing text, or converting common formats. If you have ideas for a tool that would make your workflow easier, I'd love to hear your suggestions.&lt;/p&gt;

</description>
      <category>api</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
