Introduction
Action Results — Complete Guide is essential for .NET developers building ShopNest Enterprise Commerce Platform — Toolliyo's 215-article ASP.NET Core master path covering MVC, EF Core, security, SignalR, microservices, Docker, Kubernetes, and enterprise projects. Every article includes minimum 2 ultra-detailed real-world examples, internal pipeline explanation, security, and cloud-native deployment (banking, e-commerce, ERP, SaaS, healthcare).
In Indian delivery projects (TCS, Infosys, Wipro), interviewers expect action results with real HDFC-style banking SRP fixes, Flipkart OCP payment strategies, TCS ERP LSP, Freshworks ISP, or Apollo hospital refactoring examples — not toy animal demos. This article delivers two mandatory enterprise examples on ACTIONS.
After this article you will
- Explain Action Results in plain English and in ASP.NET Core pipeline and enterprise web terms
- Implement action results in ShopNest Enterprise Commerce Platform (ACTIONS)
- Compare the wrong approach vs the production-ready enterprise approach
- Answer fresher, mid-level, and senior ASP.NET Core and system design interview questions confidently
- Connect this lesson to Article 62 and the 215-article ASP.NET Core roadmap
Prerequisites
- Software: .NET 8 SDK, VS 2022 or VS Code, SQL Server Express / LocalDB
- Knowledge: C# basics
- Previous: Article 60 — Navigation Components — Complete Guide
- Time: 24 min reading + 30–45 min hands-on
Concept deep-dive
Level 1 — Analogy
Actions are specific services the reception desk offers — "show catalog", "process checkout", "print receipt".
Level 2 — Technical
Action Results integrates with the LINQ query layer: write queries against IEnumerable or IQueryable, understand deferred execution, project to DTOs for ShopNest reports. On ShopNest this powers ACTIONS without coupling UI to database internals.
Level 3 — Architecture
[Browser] → [HTTPS/Kestrel] → [Middleware Pipeline]
→ [Routing] → [Controller Action] → [Service Layer]
→ [EF Core / Identity] → [Razor View Engine] → [HTML Response]
Common misconceptions
❌ MYTH: ASP.NET Core is just renamed ASP.NET Framework.
✅ TRUTH: Core is cross-platform, modular middleware pipeline, unified Program.cs — different hosting and performance model.
❌ MYTH: You must use MVC for every app.
✅ TRUTH: Minimal APIs and Razor Pages fit microservices and simple UIs; ShopNest uses MVC for admin and APIs for mobile.
❌ MYTH: EF Core replaces knowing SQL.
✅ TRUTH: Production teams still tune indexes, read execution plans, and use raw SQL for reports.
Project structure
ShopNest/
├── ShopNest/
├── src/
│ ├── ShopNest.Api/ ← ASP.NET Core Web API
│ ├── ShopNest.Core/ ← Repository interfaces
│ ├── ShopNest.AdoNet/ ← SqlConnection, SPs, transactions
│ ├── ShopNest.Reports/ ← Streaming readers, GL reports
│ └── ShopNest.Tests/ ← Integration tests (Testcontainers SQL)
├── sql/
│ ├── migrations/
│ └── stored-procedures/
└── docker-compose.yml ← SQL Server 2022 + Redis
Step-by-Step Implementation — ShopNest (ACTIONS)
Follow the prompt template: create project → core classes → interfaces → pattern implementation → client code → run → enterprise refactor.
Step 1 — The wrong way
// ❌ BAD — wrong middleware order, fat controller, no DI
public class OrderController : Controller {
public IActionResult Create() {
var db = new ShopDbContext(); // new per request
db.Orders.Add(new Order());
db.SaveChanges();
return View();
}
}
Step 2 — The right way
// ✅ PRODUCTION — Action Results on ShopNest (ACTIONS)
builder.Services.AddDbContext(o =>
o.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
Step 3 — Apply Action Results
public class AuditActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext ctx) => _logger.LogInformation("Action {Name}", ctx.ActionDescriptor.DisplayName);
public void OnActionExecuted(ActionExecutedContext ctx) { }
}
dotnet run --project ShopNest.Api
# Verify Action Results — check Swagger UI and unit test pass rate and integration tests pass
Problem before Action Results
Legacy ASP.NET Framework apps mixed Web.config, HttpModules, and tight IIS coupling. Without Action Results, ShopNest-style apps face wrong middleware order, weak auth, and unscalable monoliths.
ASP.NET Core request pipeline
Action Results — category ACTIONS
Kestrel → Middleware chain → Routing → Auth → Endpoint (MVC / Minimal API)
ShopNest: Serilog → ExceptionHandler → HTTPS → StaticFiles → Routing → Auth → Controllers
Internal pipeline & hosting
- Kestrel — cross-platform web server
- In-process vs out-of-process — IIS reverse proxy vs direct Kestrel
- Configuration — appsettings + env vars + Azure Key Vault
- DI lifetimes — Singleton / Scoped / Transient on ShopNest services
Security & cloud-native scaling
- JWT + Identity for ShopNest customer and admin portals
- Redis distributed cache for catalog and session
- Docker + AKS + Azure App Service deployment paths
- OpenTelemetry + Serilog + Prometheus for production
Real-world example 1 — HDFC Admin Portal
Domain: Banking. Cookie auth without antiforgery on transfers. Added Identity + ValidateAntiForgeryToken + policy-based auth.
Before
[HttpPost] public IActionResult Transfer(decimal amt) { /* no token */ }After (ShopNest)
[Authorize(Policy = "Transfer")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Transfer(TransferVm m) { }Outcome: CSRF findings closed in security review.
Real-world example 2 — Swiggy Order Tracking
Domain: Logistics. Polling order status every 3s. SignalR hub groups per orderId push rider location.
Before
setInterval(() => fetch('/api/status'), 3000);After (ShopNest)
await hubConnection.invoke('JoinOrder', orderId);
hubConnection.on('LocationUpdated', updateMap);Outcome: Server load down 70%; live map UX.
When not to use / tradeoffs
Minimal APIs for 200-endpoint ERP may hurt discoverability — use Clean Architecture + controllers. SignalR for simple CRUD is overkill — use SSE or polling first.
Testing ASP.NET Core
public class ProductsControllerTests {
[Fact]
public async Task Get_ReturnsOk() {
var factory = new WebApplicationFactory<Program>();
var client = factory.CreateClient();
var res = await client.GetAsync("/api/products");
res.EnsureSuccessStatusCode();
}
}Common errors & fixes
🔴 Mistake 1: Wrong middleware order (auth before routing)
✅ Fix: UseRouting → UseAuthentication → UseAuthorization → MapControllers.
🔴 Mistake 2: Scoped DbContext in Singleton service
✅ Fix: Never capture DbContext in singleton — inject scoped services correctly.
🔴 Mistake 3: Missing ValidateAntiForgeryToken on POST forms
✅ Fix: Add token to forms and validate on state-changing actions.
🔴 Mistake 4: Secrets in appsettings committed to Git
✅ Fix: User secrets locally; Azure Key Vault or env vars in production.
Best practices
- 🟢 Use async/await end-to-end for database and I/O calls
- 🟢 Register DbContext as Scoped; avoid capturing it in singletons
- 🟡 Use IQueryable until the last moment; avoid multiple enumeration; project with Select before ToList
- 🟡 Prefer method syntax for complex chains; use query syntax for joins when readability wins
- 🔴 Log structured data with Serilog — include OrderId, UserId, not passwords
- 🔴 Use HTTPS, secure cookies, and authorization policies in production
Interview questions
Fresher level
Q1: Explain Action Results in ASP.NET Core.
A: Action Results on ShopNest — describe pipeline placement, DI registration, and one production pitfall.
Q2: Middleware vs filters?
A: Middleware is global HTTP pipeline; filters are MVC-specific around actions — use both appropriately.
Q3: Singleton vs Scoped vs Transient?
A: Singleton one instance; Scoped per request (DbContext); Transient every injection — match lifetime to usage.
Mid / senior level
Q4: How do you secure a Web API?
A: JWT bearer, HTTPS, authorization policies, rate limiting, CORS whitelist.
Q5: Deploy ASP.NET Core to production?
A: Docker → AKS or Azure App Service; health checks; Serilog + OpenTelemetry.
Q6: EF Core N+1 problem?
A: Use Include/ThenInclude, AsNoTracking for reads, projection with Select, split queries when needed.
Coding round
Implement Action Results for ShopNest ACTIONS: show interface, concrete class, DI registration, and xUnit test with mock.
public class ActionResultsPatternTests
{
[Fact]
public async Task ExecuteAsync_ReturnsSuccess()
{
var mock = new Mock();
mock.Setup(s => s.ExecuteAsync(It.IsAny(), default))
.ReturnsAsync(Result.Success("test-id"));
var result = await mock.Object.ExecuteAsync(new Request("test-id"));
Assert.True(result.IsSuccess);
}
}
Summary & next steps
- Article 61: Action Results — Complete Guide
- Module: Module 6: Action Results & Helpers · Level: INTERMEDIATE
- Applied to ShopNest — ACTIONS
Previous: Navigation Components — Complete Guide
Next: ViewResult — Complete Guide
Practice: Add one small feature using today's pattern — commit with feat(aspnet-core): article-61.
FAQ
Q1: What is Action Results?
Action Results is covered in Toolliyo's 215-article ASP.NET Core path on ShopNest Enterprise Commerce Platform.
Q2: Do I need Visual Studio?
.NET 10 SDK works with VS Code; VS 2022 recommended for debugging and profiling.
Q3: Is this asked in interviews?
Yes � TCS/Infosys ask MVC and DI; product companies ask EF Core, auth, and scaling.
Q4: Which .NET version?
Examples target ASP.NET Core 8/9/10 on .NET 8/9/10.
Q5: How does this fit ShopNest?
Article 61 adds action results to ACTIONS. By Article 215 you build multi-tenant SaaS on ShopNest.