app.Use() vs app.Run()
- Think of ASP.NET Core as a pipeline
- Every request enters a middleware pipeline
- Each middleware decides:
- Real-world analogy (Traffic Police)
app.Use()
- Like a traffic signal
- It checks the request
- Then lets it go to the next signal
app.Run()
- Like a dead-end road
- Request stops here.
- Nothing runs after this
The core difference (remember this line
- Use() β Can pass control to NEXT middleware
- Run() β TERMINATES the pipeline
Code example:
- app.Use() β continues the pipeline
-
app.Use(async (context, next) =>
{
Console.WriteLine("Before next middleware");
await next(); // π passes control forward
Console.WriteLine("After next middleware");
});
Used for:
- Authentication
- Logging
- Authorization
- Exception handling
app.Run() β pipeline ends here :
- app.Run(async context =>
{
await context.Response.WriteAsync("Hello World");
});
Used for:
- Final response
- Short-circuit logic
- Simple endpoints
No middleware runs after Run()
Restaurant analogy (easy recall)
- Use()
- Run()
- βFood served. Kitchen closed."
Interview TRAP (very common)
- app.Run(...);
- app.Use(...); // β NEVER runs
- Why? Because Run() ends the pipeline
IRule of thumb (bookmark this)
- Need next middleware? β app.Use()
- Final stop? β app.Run()
Why this matters in real projects
- Auth middleware not firing
- Logging missing
- APIs behaving weirdly
- βWhy is this code never executed?β bugs