Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
Asp.Net Core

ASP.NET Core: Fix a Minimal API Action That Receives null Because It Expects an Object but the Client Sent a JSON Array

- 03.10.26 - ErcanOPAK

🔧 The Request Body That Bound to null Because It Was the Wrong Shape

Minimal API model binding reads the request body and tries to deserialize it directly into whatever parameter type the endpoint declared. When a client sends a JSON object and the parameter is a record expecting one, this is seamless. When a client instead sends a bare JSON array to an endpoint whose parameter expects an object, binding doesn’t try to be clever about adapting one shape into the other – it simply fails to produce a value, and the parameter comes through as null, with nothing at the HTTP level making that mismatch obvious until a NullReferenceException further inside the handler explains it indirectly.

🔎 The Problem

app.MapPost("/products/bulk-tag", (ProductTagRequest request) =>
{
    // request is null here whenever the client posts a JSON array
    // directly, because the parameter type expects a single JSON
    // OBJECT and minimal API model binding doesn't attempt to adapt
    // an array into one - it just gives up and leaves the parameter
    // at its default.
    return Results.Ok(request.ProductIds.Count);
});

public record ProductTagRequest(List<int> ProductIds, string Tag);

// Client sends: [1, 2, 3]  -> request binds to null, throws
// Client sends: {"productIds":[1,2,3],"tag":"sale"} -> binds fine

✅ Fix: Match the Parameter Type to What’s Actually Being Sent

  • Change the client to send the shape the endpoint actually expects (a JSON object wrapping the array), which is usually the right fix when the endpoint is also meant to accept other fields alongside the array.
  • When the endpoint is genuinely meant to take a bare JSON array, change the parameter type itself to List<int> (or the appropriate element type) directly, rather than wrapping it in a record – minimal API binds a top-level array parameter correctly when the type matches what’s actually being sent.
  • Add explicit null-checking (or a non-nullable parameter combined with a validation filter) immediately inside the handler, so a shape mismatch returns a clear 400 response instead of reaching a NullReferenceException further into the method.

⚠️ Why This Is Easy to Miss

  • The request compiles, the endpoint registers without error, and a request sent with the correct shape works perfectly during manual testing – the mismatch only shows up against a specific client or a specific payload shape nobody happened to test with the wrong shape.
  • Swagger/OpenAPI tooling generated from the endpoint signature describes the object shape minimal API is expecting, but says nothing about what happens when a caller sends something structurally different, which is exactly the gap that lets this ship unnoticed.

Minimal API binding doesn’t fail loudly when the shapes don’t match – it just leaves you holding null and lets the NullReferenceException further down explain the mistake for it.

— Backend Architect

Related posts:

Rate Limiting in .NET — Fix ‘Random 429 Errors’ the Right Way

.NET Core: Use HttpClientFactory for Efficient HTTP

Use IOptionsSnapshot to Fix Config Reload Issues

Post Views: 3

Post navigation

JavaScript: Fix a Promise.race() Call Whose Losing Promises Keep Running in the Background After It Resolves
Windows 11: Fix a Dual-Boot Menu That Vanishes the Next Time Windows Installs a Cumulative Update

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (938)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (836)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (938)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (836)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com