Showing posts with label Interview Question. Show all posts
Showing posts with label Interview Question. Show all posts

Wednesday, March 25, 2026

Top 35 ASP.NET Core Interview Questions and Answers (2026) – Beginner to Advanced

Top 35 ASP.NET Core Interview Questions and Answers (2026) – Beginner to Advanced

📅 Published: March 2026  |  ⏱ Reading Time: ~18 minutes  |  🏷️ ASP.NET CoreC#Interview.NET 8Web Development

📌 TL;DR: This article covers the 35 most asked ASP.NET Core interview questions for 2026, ranging from beginner concepts like middleware and routing to advanced topics like minimal APIs, gRPC, and performance optimization. Each answer includes code examples and practical explanations. Bookmark this page before your next interview.

Introduction

ASP.NET Core is one of the most in-demand backend frameworks in 2026, consistently ranking among the top technologies in Stack Overflow Developer Surveys. Whether you are preparing for your first .NET developer role or interviewing for a senior architect position, having a solid grasp of ASP.NET Core concepts is non-negotiable.

This guide covers 35 carefully selected interview questions with detailed answers, real code examples, and difficulty labels so you know exactly what level each question targets. Questions are grouped by topic so you can jump straight to the area you need to review most.

💡 Pro Tip: Interviewers don't just want definitions — they want to see that you understand why something works the way it does. For every answer here, make sure you understand the reasoning, not just the words.

Section 1 – ASP.NET Core Fundamentals

These questions are almost always asked in every .NET interview, regardless of seniority. Master these before anything else.

Q1. What is ASP.NET Core and how is it different from ASP.NET Framework? Beginner

ASP.NET Core is a cross-platform, high-performance, open-source framework for building modern web applications and APIs. It is a complete rewrite of the original ASP.NET Framework, designed from the ground up to run on Windows, Linux, and macOS.

FeatureASP.NET FrameworkASP.NET Core
PlatformWindows onlyCross-platform
PerformanceModerateVery high (one of the fastest frameworks)
HostingIIS onlyIIS, Kestrel, Docker, Nginx
Open SourcePartialFully open source
Dependency InjectionNot built-inBuilt-in from the start
Latest Version.NET Framework 4.8 (no new major versions).NET 8 / .NET 9 (active development)

Q2. What is the Program.cs file in ASP.NET Core and what is its role? Beginner

Program.cs is the entry point of an ASP.NET Core application. In .NET 6 and later, it uses a minimal hosting model that combines the old Startup.cs and Program.cs into a single file. It is responsible for:

  • Creating and configuring the WebApplication builder
  • Registering services into the dependency injection container
  • Configuring the middleware pipeline
  • Running the application
var builder = WebApplication.CreateBuilder(args);

// Register services
builder.Services.AddControllers();
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

var app = builder.Build();

// Configure middleware pipeline
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

app.Run();

Q3. What is Kestrel in ASP.NET Core? Beginner

Kestrel is the default, cross-platform web server built into ASP.NET Core. It is a lightweight, high-performance HTTP server based on libuv (and later on .NET's own async I/O). Kestrel can be used:

  • Alone — directly facing the internet in production for simple scenarios
  • Behind a reverse proxy — behind Nginx, Apache, or IIS (recommended for production)

Kestrel is what makes ASP.NET Core one of the fastest web frameworks in the world in TechEmpower benchmarks.

Q4. What is the difference between IApplicationBuilder and IServiceCollection? Beginner

These two interfaces serve fundamentally different purposes:

  • IServiceCollection — used to register services into the dependency injection container. This happens at application startup before the app runs. Example: builder.Services.AddControllers()
  • IApplicationBuilder — used to configure the HTTP request pipeline by adding middleware. Example: app.UseAuthentication()

A simple way to remember: IServiceCollection is about what your app needs, IApplicationBuilder is about how requests are handled.

Q5. What is the difference between AddSingleton, AddScoped, and AddTransient? Beginner

These three methods define the lifetime of a service registered in the DI container:

LifetimeCreatedShared?Best For
SingletonOnce per applicationAcross all requests and usersConfiguration, caching, logging
ScopedOnce per HTTP requestWithin the same requestDatabase contexts (EF Core DbContext)
TransientEvery time requestedNever sharedLightweight, stateless services
builder.Services.AddSingleton<IConfigService, ConfigService>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddTransient<IEmailSender, EmailSender>();
⚠️ Common Mistake: Never inject a Scoped service into a Singleton. The Scoped service will behave like a Singleton and can cause data leaks between requests.

Q6. What is Routing in ASP.NET Core? Beginner

Routing is the mechanism that maps incoming HTTP requests to the correct controller action or endpoint. ASP.NET Core supports two main routing approaches:

1. Conventional Routing — defined globally using a URL pattern template:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

2. Attribute Routing — defined directly on controllers and actions using attributes:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult GetById(int id) { ... }

    [HttpPost]
    public IActionResult Create([FromBody] ProductDto dto) { ... }
}

Attribute routing is preferred for Web APIs because it gives you precise control over URL structure.

Q7. What is the difference between IActionResult and ActionResult<T>? Intermediate

IActionResult is a non-generic interface that can return any HTTP response. ActionResult<T> is a generic version introduced in ASP.NET Core 2.1 that additionally allows returning a strongly-typed object directly, which Swagger/OpenAPI can inspect for documentation.

// IActionResult - no type info for swagger
public IActionResult GetProduct(int id)
{
    var product = _repo.GetById(id);
    if (product == null) return NotFound();
    return Ok(product);
}

// ActionResult<T> - swagger knows the return type is Product
public ActionResult<Product> GetProduct(int id)
{
    var product = _repo.GetById(id);
    if (product == null) return NotFound();
    return product; // implicit conversion to Ok(product)
}

Use ActionResult<T> for API controllers whenever possible.

Q8. What are Model Binding and Model Validation in ASP.NET Core? Beginner

Model Binding automatically maps incoming request data (route values, query strings, form data, JSON body) to action method parameters or model properties.

Model Validation checks that the bound data meets the defined rules using Data Annotation attributes or Fluent Validation.

public class CreateUserDto
{
    [Required]
    [StringLength(100, MinimumLength = 2)]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Range(18, 120)]
    public int Age { get; set; }
}

[HttpPost]
public IActionResult Create([FromBody] CreateUserDto dto)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    // proceed with valid data
}

When using [ApiController] attribute, model validation errors automatically return a 400 Bad Request — you don't need the ModelState.IsValid check manually.

Q9. What is the [ApiController] attribute and what does it do? Beginner

The [ApiController] attribute enables several API-specific behaviors automatically:

  • Automatic model validation — returns 400 if ModelState is invalid
  • Binding source inference — complex types are automatically bound from the request body ([FromBody] assumed)
  • Problem details responses — error responses follow RFC 7807 format
  • Attribute routing requirement — forces use of attribute routing

Q10. What is Configuration in ASP.NET Core and how does it work? Beginner

ASP.NET Core has a flexible configuration system that can read settings from multiple sources in a defined priority order:

  1. appsettings.json
  2. appsettings.{Environment}.json (e.g. appsettings.Development.json)
  3. Environment variables
  4. Command line arguments
  5. User Secrets (development only)
  6. Azure Key Vault (production)

Each source overrides the previous one, so environment variables override appsettings.json.

// appsettings.json
{
  "ConnectionStrings": {
    "Default": "Server=.;Database=MyDb;Trusted_Connection=True"
  },
  "AppSettings": {
    "PageSize": 20
  }
}

// Accessing configuration
var connStr = builder.Configuration.GetConnectionString("Default");
var pageSize = builder.Configuration.GetValue<int>("AppSettings:PageSize");

Q11. What is the Options Pattern in ASP.NET Core? Intermediate

The Options Pattern is a strongly-typed way to bind configuration sections to C# classes, making configuration easier to work with and testable.

// appsettings.json
{
  "EmailSettings": {
    "SmtpHost": "smtp.gmail.com",
    "Port": 587,
    "SenderEmail": "no-reply@triksbuddy.com"
  }
}

// Options class
public class EmailSettings
{
    public string SmtpHost { get; set; }
    public int Port { get; set; }
    public string SenderEmail { get; set; }
}

// Register in Program.cs
builder.Services.Configure<EmailSettings>(
    builder.Configuration.GetSection("EmailSettings"));

// Inject and use
public class EmailService
{
    private readonly EmailSettings _settings;

    public EmailService(IOptions<EmailSettings> options)
    {
        _settings = options.Value;
    }
}

Q12. What is Minimal API in ASP.NET Core? Intermediate

Minimal APIs, introduced in .NET 6, allow building HTTP APIs with minimal code and ceremony — no controllers, no Startup class. They are ideal for microservices and simple APIs.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();

app.MapGet("/products", async (AppDbContext db) =>
    await db.Products.ToListAsync());

app.MapGet("/products/{id}", async (int id, AppDbContext db) =>
    await db.Products.FindAsync(id) is Product p
        ? Results.Ok(p)
        : Results.NotFound());

app.MapPost("/products", async (Product product, AppDbContext db) =>
{
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Results.Created($"/products/{product.Id}", product);
});

app.Run();
 

Section 2 – Middleware & Request Pipeline

Middleware is one of the most important ASP.NET Core concepts. Almost every interview will include at least 2-3 questions on this topic.
 

Q13. What is Middleware in ASP.NET Core? Beginner

Middleware is software that is assembled into an application pipeline to handle HTTP requests and responses. Each middleware component can:

  • Choose whether to pass the request to the next component
  • Perform work before and after the next component in the pipeline

The pipeline is built as a chain of delegates — this is often called the "Russian dolls" model. Common built-in middleware includes: UseHttpsRedirection, UseAuthentication, UseAuthorization, UseStaticFiles, UseRouting.

Q14. How do you create custom middleware in ASP.NET Core? Intermediate

You can create middleware using a class with an InvokeAsync method and a constructor that takes RequestDelegate:

public class RequestLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggingMiddleware> _logger;

    public RequestLoggingMiddleware(RequestDelegate next,
        ILogger<RequestLoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        _logger.LogInformation(
            "Request: {Method} {Path}",
            context.Request.Method,
            context.Request.Path);

        var stopwatch = Stopwatch.StartNew();
        await _next(context); // call next middleware
        stopwatch.Stop();

        _logger.LogInformation(
            "Response: {StatusCode} in {ElapsedMs}ms",
            context.Response.StatusCode,
            stopwatch.ElapsedMilliseconds);
    }
}

// Register in Program.cs
app.UseMiddleware<RequestLoggingMiddleware>();

Q15. What is the order of middleware execution and why does it matter? Intermediate

Middleware executes in the exact order it is registered in Program.cs. The order matters because each middleware wraps the next one. A request flows in through middleware top-to-bottom, and the response flows out bottom-to-top.

The recommended order for a typical ASP.NET Core app is:

app.UseExceptionHandler();     // 1. Catch all unhandled exceptions
app.UseHsts();                 // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();     // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();          // 4. Serve static files early
app.UseRouting();              // 5. Match routes
app.UseCors();                 // 6. CORS before auth
app.UseAuthentication();       // 7. Who are you?
app.UseAuthorization();        // 8. What can you do?
app.UseResponseCaching();      // 9. Cache after auth
app.MapControllers();          // 10. Execute the endpoint
⚠️ Common Mistake: Putting UseAuthorization() before UseAuthentication() means authorization runs without knowing who the user is. Always authenticate before authorizing.
 

Q16. What is the difference between Use, Run, and Map in middleware? Intermediate

  • Use — adds middleware that can call the next middleware in the pipeline
  • Run — adds terminal middleware (short-circuits the pipeline, nothing after it runs)
  • Map — branches the pipeline based on the request path
app.Use(async (context, next) =>
{
    // runs before next middleware
    await next(context);
    // runs after next middleware
});

app.Map("/health", healthApp =>
{
    healthApp.Run(async context =>
    {
        await context.Response.WriteAsync("Healthy");
    });
});

app.Run(async context =>
{
    await context.Response.WriteAsync("Final middleware - nothing after this runs");
});

Q17. What is Exception Handling Middleware in ASP.NET Core? Intermediate

ASP.NET Core provides several ways to handle exceptions globally:

1. UseExceptionHandler — redirects to an error page or endpoint:

app.UseExceptionHandler("/error");
// or using a lambda:
app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        context.Response.StatusCode = 500;
        context.Response.ContentType = "application/json";
        var error = context.Features.Get<IExceptionHandlerFeature>();
        await context.Response.WriteAsJsonAsync(new {
            message = "An error occurred",
            detail = error?.Error.Message
        });
    });
});

2. Custom Global Exception Middleware — gives you full control over error responses across the entire API.

Q18. What is Response Caching in ASP.NET Core? Intermediate

Response Caching reduces server load by storing HTTP responses and serving them for subsequent identical requests without re-executing the action.

// Register
builder.Services.AddResponseCaching();

// Use in pipeline
app.UseResponseCaching();

// Apply to action
[HttpGet]
[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Any)]
public IActionResult GetProducts()
{
    return Ok(_productService.GetAll());
}

For distributed caching (Redis, SQL Server), use IDistributedCache or libraries like EasyCaching or FusionCache.

Q19. What is CORS and how do you configure it in ASP.NET Core? Beginner

CORS (Cross-Origin Resource Sharing) is a browser security feature that blocks web pages from making requests to a different domain than the one that served the page. ASP.NET Core has built-in CORS support:

// Define a named policy
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowMyApp", policy =>
    {
        policy.WithOrigins("https://triksbuddy.com", "https://localhost:3000")
              .AllowAnyMethod()
              .AllowAnyHeader()
              .AllowCredentials();
    });
});

// Apply globally
app.UseCors("AllowMyApp");

// Or apply to specific controller/action
[EnableCors("AllowMyApp")]
public class ProductsController : ControllerBase { ... }

Q20. What is Rate Limiting in ASP.NET Core? Advanced

Rate limiting, built into ASP.NET Core 7+, restricts the number of requests a client can make in a given time window — protecting your API from abuse and DDoS attacks.

builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("fixed", limiterOptions =>
    {
        limiterOptions.PermitLimit = 100;
        limiterOptions.Window = TimeSpan.FromMinutes(1);
        limiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        limiterOptions.QueueLimit = 10;
    });
    options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
});

app.UseRateLimiter();

// Apply to endpoint
app.MapGet("/api/data", () => "data").RequireRateLimiting("fixed");

Section 3 – Dependency Injection

Q21. What is Dependency Injection and why is it important? Beginner

Dependency Injection (DI) is a design pattern where an object's dependencies are provided externally rather than created by the object itself. ASP.NET Core has DI built in from the ground up.

Benefits:

  • Loose coupling between components
  • Easier unit testing (you can inject mocks)
  • Better code organization and single responsibility
  • Centralized service lifetime management
// Without DI (tightly coupled - bad)
public class OrderService
{
    private readonly EmailService _emailService = new EmailService(); // hard dependency
}

// With DI (loosely coupled - good)
public class OrderService
{
    private readonly IEmailService _emailService;

    public OrderService(IEmailService emailService)
    {
        _emailService = emailService; // injected from outside
    }
}

Q22. What is the difference between constructor injection and property injection? Intermediate

Constructor Injection (preferred in ASP.NET Core) — dependencies are passed through the constructor. The object cannot be created without its dependencies, making them required and explicit.

Property Injection — dependencies are set through public properties after object creation. This makes dependencies optional, which can lead to null reference errors if not carefully managed. ASP.NET Core's built-in DI does not support property injection natively — you need a third-party container like Autofac.

Q23. What is IServiceProvider and when would you use it? Intermediate

IServiceProvider is the interface for the DI container itself. You can use it to resolve services manually (Service Locator pattern) — though this should be avoided in application code as it hides dependencies.

// Avoid this in application code (Service Locator anti-pattern)
public class MyClass
{
    private readonly IServiceProvider _provider;
    public MyClass(IServiceProvider provider) { _provider = provider; }

    public void DoWork()
    {
        var service = _provider.GetRequiredService<IMyService>();
    }
}

// Acceptable use: resolving scoped services from a singleton background service
public class MyBackgroundService : BackgroundService
{
    private readonly IServiceProvider _provider;
    public MyBackgroundService(IServiceProvider provider) { _provider = provider; }

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        using var scope = _provider.CreateScope();
        var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
        // use dbContext safely within this scope
    }
}

Q24. What is a Keyed Service in ASP.NET Core 8? Advanced

Keyed Services, introduced in .NET 8, allow registering multiple implementations of the same interface with a unique key, and resolving a specific implementation by key.

// Register multiple implementations with keys
builder.Services.AddKeyedSingleton<IPaymentProcessor, StripeProcessor>("stripe");
builder.Services.AddKeyedSingleton<IPaymentProcessor, PayPalProcessor>("paypal");

// Resolve by key
public class CheckoutService
{
    private readonly IPaymentProcessor _processor;

    public CheckoutService([FromKeyedServices("stripe")] IPaymentProcessor processor)
    {
        _processor = processor;
    }
}
 

Section 4 – Authentication & Authorization

Q25. What is the difference between Authentication and Authorization? Beginner

  • Authentication — verifies who you are (identity). "Are you really John?"
  • Authorization — verifies what you can do (permissions). "Can John access this admin page?"

In ASP.NET Core, UseAuthentication() must always come before UseAuthorization() in the pipeline.

Q26. What is JWT and how is it used in ASP.NET Core? Intermediate

JWT (JSON Web Token) is a compact, self-contained token format used for stateless authentication. A JWT contains three Base64-encoded parts: Header, Payload (claims), and Signature.

// Configure JWT Authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// Generate a token
var claims = new[]
{
    new Claim(ClaimTypes.Name, user.Username),
    new Claim(ClaimTypes.Role, user.Role)
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var token = new JwtSecurityToken(
    issuer: _config["Jwt:Issuer"],
    audience: _config["Jwt:Audience"],
    claims: claims,
    expires: DateTime.UtcNow.AddHours(1),
    signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
);

Q27. What is Policy-Based Authorization in ASP.NET Core? Intermediate

Policy-based authorization provides more flexibility than simple role checks. You define named policies with requirements, then apply them to controllers or actions.

// Define policies
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy =>
        policy.RequireRole("Admin"));

    options.AddPolicy("MinimumAge", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(18)));

    options.AddPolicy("PremiumUser", policy =>
        policy.RequireClaim("subscription", "premium"));
});

// Apply to controller
[Authorize(Policy = "AdminOnly")]
public class AdminController : ControllerBase { ... }

[Authorize(Policy = "MinimumAge")]
public IActionResult GetAdultContent() { ... }

 

Section 5 – Entity Framework Core

Q28. What is Entity Framework Core? Beginner

Entity Framework Core (EF Core) is the official ORM (Object-Relational Mapper) for .NET. It lets you work with a database using .NET objects, eliminating most of the data-access code you would otherwise write. EF Core supports SQL Server, MySQL, PostgreSQL, SQLite, and more.

EF Core supports three development approaches:

  • Code First — define your model in C# classes, EF generates the database
  • Database First — scaffold C# models from an existing database
  • Model First — less common, design through a visual designer

Q29. What is the difference between DbContext and DbSet<T>? Beginner

  • DbContext — represents a session with the database. It manages connections, change tracking, and saving data. You inherit from it to create your application context.
  • DbSet<T> — represents a table in the database. Each DbSet property on your DbContext corresponds to a database table.
public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Order> Orders { get; set; }
}

Q30. What is Lazy Loading vs Eager Loading vs Explicit Loading in EF Core? Intermediate

StrategyWhen Data is LoadedHow
Eager LoadingWith the main query.Include()
Lazy LoadingWhen navigation property is accessedProxy or UseLazyLoadingProxies()
Explicit LoadingManually triggered after initial load.Entry().Collection().LoadAsync()
// Eager Loading (recommended for most cases)
var orders = await db.Orders
    .Include(o => o.Customer)
    .Include(o => o.Items)
        .ThenInclude(i => i.Product)
    .ToListAsync();

// Explicit Loading
var order = await db.Orders.FindAsync(1);
await db.Entry(order).Collection(o => o.Items).LoadAsync();
⚠️ N+1 Problem: Lazy Loading can cause the N+1 query problem — 1 query for the list, then N queries for each related entity. Prefer Eager Loading in performance-sensitive code.

 

Section 6 – Advanced Topics

Q31. What is gRPC in ASP.NET Core and when would you use it? Advanced

gRPC is a high-performance, open-source RPC (Remote Procedure Call) framework that uses HTTP/2 and Protocol Buffers (protobuf) for serialization. It is significantly faster than REST for inter-service communication in microservices.

Use gRPC when:

  • Building microservices that communicate internally
  • You need real-time bidirectional streaming
  • Performance and bandwidth efficiency are critical

Use REST when:

  • Building public APIs consumed by browsers or third parties
  • You need broad compatibility without special client libraries

Q32. What is SignalR and what is it used for? Intermediate

SignalR is an ASP.NET Core library that enables real-time, bidirectional communication between server and clients. It automatically chooses the best transport (WebSockets, Server-Sent Events, or Long Polling) based on what the client supports.

Common use cases: chat applications, live notifications, real-time dashboards, collaborative editing, live sports scores.

// Hub definition
public class NotificationHub : Hub
{
    public async Task SendNotification(string userId, string message)
    {
        await Clients.User(userId).SendAsync("ReceiveNotification", message);
    }
}

// Register
builder.Services.AddSignalR();
app.MapHub<NotificationHub>("/notifications");

Q33. What are Background Services in ASP.NET Core? Intermediate

Background Services are long-running tasks that run in the background of your ASP.NET Core application. You implement IHostedService or extend BackgroundService.

public class EmailQueueProcessor : BackgroundService
{
    private readonly ILogger<EmailQueueProcessor> _logger;

    public EmailQueueProcessor(ILogger<EmailQueueProcessor> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Processing email queue...");
            // do work here
            await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
        }
    }
}

// Register
builder.Services.AddHostedService<EmailQueueProcessor>();

Q34. What is Health Checks in ASP.NET Core? Intermediate

Health Checks provide an endpoint that reports the health status of your application and its dependencies (database, external APIs, etc.). They are essential for container orchestration systems like Kubernetes.

builder.Services.AddHealthChecks()
    .AddSqlServer(connectionString: builder.Configuration.GetConnectionString("Default"))
    .AddUrlGroup(new Uri("https://api.thirdparty.com/health"), name: "third-party-api")
    .AddCheck<CustomHealthCheck>("custom");

app.MapHealthChecks("/health", new HealthCheckOptions
{
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
 

Q35. How do you optimize performance in ASP.NET Core APIs? Advanced

Performance optimization in ASP.NET Core covers multiple layers:

  • Use async/await everywhere — never block threads with .Result or .Wait()
  • Response compression — enable Brotli/GZip compression
  • Output caching — use AddOutputCache() in .NET 7+
  • EF Core optimization — use AsNoTracking() for read-only queries, select only needed columns with Select()
  • Use IAsyncEnumerable — stream large result sets instead of loading all into memory
  • Connection pooling — EF Core and ADO.NET handle this automatically with properly configured connection strings
  • Avoid N+1 queries — use eager loading or projections
  • Use Span<T> and Memory<T> for high-performance string and buffer processing
// Read-only query optimization
var products = await db.Products
    .AsNoTracking()
    .Where(p => p.IsActive)
    .Select(p => new ProductDto { Id = p.Id, Name = p.Name })
    .ToListAsync();

💼 Interview Tips for ASP.NET Core Roles

  • Know the pipeline order cold. Drawing the middleware pipeline on a whiteboard is a very common interview exercise.
  • Understand DI lifetimes deeply. Scoped vs Singleton mistakes are a common source of bugs — interviewers love this topic.
  • Be ready for "how would you secure your API?" — cover JWT, HTTPS, rate limiting, input validation, and CORS.
  • Know at least one real performance optimization you've done or studied — AsNoTracking, caching, async queries.
  • Mention .NET 8 features if possible — Keyed Services, Native AOT, Frozen Collections — these signal you stay current.

❓ Frequently Asked Questions

What .NET version should I study for interviews in 2026?

Focus on .NET 8 (LTS) as your primary reference. Most companies that are actively hiring are on .NET 6, 7, or 8. Understanding the concepts matters more than version-specific syntax, but being aware of .NET 8 features signals that you stay current.

Is knowing Entity Framework Core enough for database questions?

EF Core covers most interview questions, but also be familiar with raw ADO.NET and Dapper (a lightweight ORM). Senior roles may ask when you'd choose Dapper over EF Core — the answer is performance-critical, high-volume read scenarios.

Do I need to know Blazor for ASP.NET Core interviews?

Only if the job description mentions it. For backend/API roles, Blazor knowledge is a bonus, not a requirement. For full-stack .NET roles, knowing Blazor Server vs Blazor WebAssembly is increasingly valuable.

What is the difference between REST and gRPC — when is each asked?

This question appears in senior and microservices-focused interviews. REST is for external APIs, gRPC is for internal service-to-service communication where performance is critical.

✅ Key Takeaways

  • ASP.NET Core is cross-platform, high-performance, and fully open source — fundamentally different from the old ASP.NET Framework
  • The middleware pipeline order matters — always authenticate before authorizing
  • DI service lifetimes (Singleton, Scoped, Transient) are one of the most tested topics — know them deeply
  • JWT is the standard for stateless API authentication — understand how to generate and validate tokens
  • EF Core's AsNoTracking() and eager loading are key performance tools
  • Minimal APIs, Keyed Services, and Rate Limiting are .NET 6-8 features worth knowing for modern interviews


Found this helpful? Share it with a friend preparing for their .NET interview. Drop your questions in the comments below — we read and reply to every one.

Tuesday, October 22, 2024

Dotnet framework interview questions and answers

 


1. What is the .NET Framework?

  • The .NET Framework is a software development platform developed by Microsoft.
  • It provides a consistent programming model and a comprehensive set of libraries to build various applications such as web, desktop, and mobile apps.
  • It consists of two major components:
    • Common Language Runtime (CLR): Handles memory management, exception handling, and garbage collection.
    • .NET Framework Class Library (FCL): Provides reusable classes and APIs for development.

Example:

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, .NET Framework!");
    }
}

2. What is the Common Language Runtime (CLR)?

  • CLR is the heart of the .NET Framework, responsible for executing .NET programs.
  • It provides key services:
    • Memory management (using garbage collection).
    • Exception handling.
    • Thread management.
    • Security management.

Key Features of CLR:

  • Just-In-Time (JIT) Compilation: Converts Intermediate Language (IL) code to machine code.
  • Garbage Collection (GC): Automatically frees memory by removing objects that are no longer in use.

Example:

public class Example
{
    public void ShowMessage()
    {
        Console.WriteLine("CLR manages this execution.");
    }
}

3. What is the difference between .NET Framework and .NET Core?

  • .NET Framework:
    • Runs only on Windows.
    • Used for building Windows-specific applications like desktop apps.
    • Larger runtime and library support.
  • .NET Core:
    • Cross-platform (supports Windows, Linux, macOS).
    • Lightweight and modular.
    • Primarily used for web, cloud, and cross-platform apps.

4. What are Assemblies in .NET?

  • Assemblies are the building blocks of a .NET application.
  • An assembly is a compiled code that CLR can execute. It can be either an EXE (for applications) or a DLL (for reusable components).

Types of Assemblies:

  • Private Assembly: Used by a single application.
  • Shared Assembly: Can be shared across multiple applications (e.g., libraries stored in GAC).

Example:

// Compiling this code will create an assembly (DLL or EXE)
public class SampleAssembly
{
    public void DisplayMessage()
    {
        Console.WriteLine("This is an assembly example.");
    }
}

5. What is the Global Assembly Cache (GAC)?

  • GAC is a machine-wide code cache that stores assemblies specifically designated to be shared by several applications on the computer.
  • Assemblies in GAC are strongly named and allow multiple versions of the same assembly to be maintained side by side.

Example:

// To add an assembly to the GAC (in command prompt)
gacutil -i MyAssembly.dll

6. What are Namespaces in .NET?

  • Namespaces are used to organize classes and other types in .NET.
  • They prevent naming conflicts by logically grouping related classes.

Example:

namespace MyNamespace
{
    public class MyClass
    {
        public void Greet()
        {
            Console.WriteLine("Hello from MyNamespace!");
        }
    }
}

7. What is Managed Code?

  • Managed Code is the code that runs under the control of the CLR.
  • CLR manages execution, garbage collection, and other system services for the code.

Example:

// This is managed code because it's executed by CLR
public class ManagedCodeExample
{
    public void Print()
    {
        Console.WriteLine("Managed Code Example.");
    }
}

8. What is Unmanaged Code?

  • Unmanaged Code is code executed directly by the operating system, not under the control of CLR.
  • Examples include applications written in C or C++ that are compiled directly into machine code.

Example:

// Calling unmanaged code from C#
[DllImport("User32.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, int options);

9. What is the difference between Value Types and Reference Types in .NET?

  • Value Types:
    • Stored directly in memory.
    • Examples: int, float, bool.
  • Reference Types:
    • Store a reference (pointer) to the actual data in memory.
    • Examples: class, object, string.

Example:

// Value type
int x = 10;

// Reference type
string name = "John";

10. What is Boxing and Unboxing in .NET?

  • Boxing: Converting a value type to an object (reference type).
  • Unboxing: Extracting the value type from an object.

Example:

// Boxing
int num = 123;
object obj = num;  // Boxing

// Unboxing
int unboxedNum = (int)obj;  // Unboxing

 

11. What is the Common Type System (CTS)?

  • CTS defines all data types in the .NET Framework and how they are represented in memory.
  • It ensures that data types used across different .NET languages (C#, VB.NET, F#) are compatible with each other.
  • Value Types (stored in the stack) and Reference Types (stored in the heap) are both part of CTS.

Example:

// Value type
int valueType = 100;

// Reference type
string referenceType = "Hello";



12. What is the Common Language Specification (CLS)?

  • CLS defines a subset of the Common Type System (CTS) that all .NET languages must follow to ensure cross-language compatibility.
  • It provides a set of rules for data types and programming constructs that are guaranteed to work across different languages.

Example:

 // CLS-compliant code: using standard types
public class SampleClass
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

 

13. What is Just-In-Time (JIT) Compilation?

  • JIT Compilation is a process where the Intermediate Language (IL) code is converted to machine code at runtime.
  • It helps optimize execution by compiling code only when it is needed, thus saving memory and resources.

Types of JIT Compilers:

  • Pre-JIT: Compiles the entire code during deployment.
  • Econo-JIT: Compiles only required methods, reclaims memory afterward.
  • Normal JIT: Compiles methods when called for the first time.

 

 

14. What is the difference between Early Binding and Late Binding in .NET?

  • Early Binding:

    • Happens at compile time.
    • Compiler knows the method signatures and types in advance.
    • Safer and faster.
  • Late Binding:

    • Happens at runtime.
    • Uses reflection to dynamically invoke methods and access types.
    • Flexible but slower and prone to errors.

Example:

 // Early binding
SampleClass obj = new SampleClass();
obj.PrintMessage();

// Late binding using reflection
Type type = Type.GetType("SampleClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("PrintMessage");
method.Invoke(instance, null);

 

15. What is Garbage Collection (GC) in .NET?

  • Garbage Collection is the process in the .NET Framework that automatically frees memory by reclaiming objects that are no longer in use.
  • GC improves memory management by cleaning up unreferenced objects.

Generations in Garbage Collection:

  1. Generation 0: Short-lived objects.
  2. Generation 1: Medium-lived objects.
  3. Generation 2: Long-lived objects.

Example:

 class Program
{
    static void Main()
    {
        // Force garbage collection
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

 

16. What is the difference between Dispose() and Finalize()?

  • Dispose():
    • Part of the IDisposable interface.
    • Must be called explicitly to release unmanaged resources.
  • Finalize():
    • Called by the Garbage Collector before an object is destroyed.
    • Cannot be called explicitly; handled by the system.

Example:

 class MyClass : IDisposable
{
    public void Dispose()
    {
        // Clean up unmanaged resources
    }
    
    ~MyClass()
    {
        // Finalizer (destructor) called by GC
    }
}

 

17. What is Reflection in .NET?

  • Reflection allows programs to inspect and interact with object metadata at runtime.
  • It can be used to dynamically create instances, invoke methods, and access fields and properties.

Example:

 Type type = typeof(SampleClass);
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("PrintMessage");
method.Invoke(instance, null);

 

18. What is ADO.NET?

  • ADO.NET is a data access technology used to interact with databases (SQL, Oracle, etc.) in the .NET Framework.
  • It provides data connectivity between .NET applications and data sources, allowing you to execute SQL queries, stored procedures, and manage transactions.

Components of ADO.NET:

  • Connection: Establishes a connection to the database.
  • Command: Executes SQL statements.
  • DataReader: Reads data from a data source in a forward-only manner.
  • DataAdapter: Fills DataSet/DataTable with data.
  • DataSet/DataTable: In-memory representation of data.

Example:

 using (SqlConnection connection = new SqlConnection("connectionString"))
{
    SqlCommand command = new SqlCommand("SELECT * FROM Students", connection);
    connection.Open();
    
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(reader["Name"]);
    }
}


19. What is the difference between DataReader and DataSet in ADO.NET?

  • DataReader:
    • Provides forward-only, read-only access to data from a database.
    • Faster and more memory-efficient.
  • DataSet:
    • In-memory representation of data that can be manipulated without being connected to the database.
    • Slower, but supports multiple tables and relationships.

 

 

20. What is ASP.NET?

  • ASP.NET is a web application framework developed by Microsoft for building dynamic web pages, websites, and web services.
  • It provides tools and libraries for building web applications with features like state management, server controls, and web forms.

Types of ASP.NET Applications:

  • Web Forms: Event-driven development model with server-side controls.
  • MVC (Model-View-Controller): A design pattern separating data, UI, and logic.
  • Web API: Used for building RESTful web services.
  • Blazor: Allows building interactive web UIs using C# instead of JavaScript.

Example (Web Forms):

 protected void Button_Click(object sender, EventArgs e)
{
    Label.Text = "Hello, ASP.NET!";
}

 

21. What are HTTP Handlers and HTTP Modules in ASP.NET?

  • HTTP Handlers:

    • Low-level components that process incoming HTTP requests directly.
    • Typically used to handle requests for specific file types (e.g., .aspx, .ashx).
  • HTTP Modules:

    • Intercepts and modifies requests/responses at various stages in the pipeline.
    • Used for authentication, logging, or custom headers.

Example (Handler):

 public class MyHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Handled by MyHandler.");
    }
    
    public bool IsReusable => false;
}

 

22. What is the difference between Session and ViewState in ASP.NET?

  • Session:
    • Stores user-specific data on the server.
    • Persists across multiple pages and requests within a session.
    • Consumes more server resources (memory).
  • ViewState:
    • Stores data in a hidden field on the client (browser) side.
    • Retains data only for a single page during postbacks.
    • Increases page size but doesn’t use server memory.

Example of ViewState:

 // Storing value in ViewState
ViewState["UserName"] = "John";

// Retrieving value from ViewState
string userName = ViewState["UserName"].ToString();

 

23. What is ASP.NET MVC?

  • ASP.NET MVC is a web development framework that follows the Model-View-Controller design pattern.
    • Model: Represents the application data and business logic.
    • View: Displays the data and the user interface.
    • Controller: Handles user input, updates the model, and selects a view to render.

Advantages:

  • Separation of concerns.
  • Easier unit testing.
  • Greater control over HTML, CSS, and JavaScript.

Example:

 public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

 

24. What are Action Filters in ASP.NET MVC?

  • Action Filters allow you to execute code before or after an action method is executed.
  • Common use cases include logging, authorization, and caching.

Types of Action Filters:

  • Authorization Filters (e.g., Authorize).
  • Action Filters (e.g., OnActionExecuting, OnActionExecuted).
  • Result Filters (e.g., OnResultExecuting, OnResultExecuted).
  • Exception Filters (e.g., HandleError).

Example:

 public class LogActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Log before action executes
    }
}

 

25. What is Entity Framework (EF)?

  • Entity Framework is an Object-Relational Mapping (ORM) framework for .NET that allows developers to work with databases using .NET objects (classes) instead of writing SQL queries.
  • Advantages:
    • Automatic generation of database schema.
    • Enables LINQ to query the database.
    • Database migration support for schema changes.

Example:

 // Defining a model
public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}

// Using Entity Framework to interact with the database
using (var context = new SchoolContext())
{
    var students = context.Students.ToList();
}

26. What is the difference between LINQ to SQL and Entity Framework?

  • LINQ to SQL:
    • Designed for direct database access with SQL Server.
    • Supports a one-to-one mapping between database tables and .NET classes.
    • Simpler but less feature-rich than Entity Framework.
  • Entity Framework (EF):
    • Provides more features such as inheritance, complex types, and multi-table mapping.
    • Works with multiple database providers (SQL Server, MySQL, Oracle).
    • Supports Code First, Database First, and Model First approaches.

 

 

27. What is Web API in ASP.NET?

  • ASP.NET Web API is a framework for building HTTP-based services that can be consumed by a wide variety of clients (e.g., browsers, mobile devices).
  • Web API is primarily used to create RESTful services, where HTTP verbs (GET, POST, PUT, DELETE) map to CRUD operations.

 public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProducts()
    {
        return productList;
    }
}

 

28. What is Dependency Injection (DI) in ASP.NET?

  • Dependency Injection is a design pattern that allows injecting objects into a class, rather than creating objects inside the class.
  • It decouples the creation of objects from the business logic, making the code more modular and testable.

Example (using ASP.NET Core DI):

 public class HomeController : Controller
{
    private readonly IProductService _productService;
    
    public HomeController(IProductService productService)
    {
        _productService = productService;
    }
    
    public IActionResult Index()
    {
        var products = _productService.GetProducts();
        return View(products);
    }
}

 

29. What are REST and SOAP?

  • REST (Representational State Transfer):

    • Uses HTTP methods (GET, POST, PUT, DELETE).
    • Stateless communication.
    • JSON or XML as data format.
    • Simpler and more scalable for web APIs.
  • SOAP (Simple Object Access Protocol):

    • Uses XML for request and response messages.
    • Requires more overhead due to its strict structure and protocols.
    • Supports security features like WS-Security.

 

 

30. What is OAuth in ASP.NET?

  • OAuth is an open standard for token-based authentication, used to grant third-party applications limited access to user resources without exposing credentials.
  • OAuth is commonly used in social logins (e.g., login with Google or Facebook).


31. What is SignalR in ASP.NET?

  • SignalR is a library that allows real-time web functionality in ASP.NET applications.
  • It enables the server to send updates to clients instantly via WebSockets, long-polling, or Server-Sent Events.

Use cases:

  • Chat applications.
  • Real-time notifications.
  • Live data feeds.

Example:

 public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

 

32. What is NuGet in .NET?

  • NuGet is a package manager for .NET, allowing developers to share and consume reusable code libraries.
  • It simplifies the process of including third-party libraries into your project.

Example:

 Install-Package Newtonsoft.Json

 

33. What are Generics in C#?

  • Generics allow defining classes, interfaces, and methods with placeholders for data types.
  • They promote code reusability and type safety by allowing you to create type-agnostic data structures.

Example:

 public class GenericClass<T>
{
    public T Data { get; set; }
}

 

34. What is a delegate in C#?

  • Delegates are type-safe function pointers that allow methods to be passed as parameters.
  • Useful in implementing callback functions, events, and asynchronous programming.

Example:

 public delegate void DisplayMessage(string message);

public void ShowMessage(string message)
{
    Console.WriteLine(message);
}

DisplayMessage display = new DisplayMessage(ShowMessage);
display("Hello, World!");

 

35. What are events in C#?

  • Events provide a mechanism for a class to notify other classes or objects when something of interest occurs.
  • Events are built on top of delegates and are typically used in UI programming and handling user interactions.

Example:

 public event EventHandler ButtonClicked;

 

36. What are Extension Methods in C#?

  • Extension Methods allow you to add new methods to existing types without modifying their source code or creating a derived type.
  • Extension methods are static methods, but they are called as if they were instance methods on the extended type.

Syntax:

 public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

// Usage
string sentence = "Hello World";
int count = sentence.WordCount();  // Output: 2

Key Points:

  • Defined in static classes.
  • The first parameter specifies the type being extended, and the keyword this is used before the type.

 

37. What is the difference between finalize and dispose methods?

  • Finalize:

    • Called by the garbage collector before an object is destroyed.
    • Used to release unmanaged resources.
    • Cannot be called explicitly in code.
    • Defined using a destructor in C#.
  • Dispose:

    • Explicitly called by the developer to release unmanaged resources.
    • Part of the IDisposable interface.
    • Should be used when working with resources like file handles or database connections.

Example using Dispose:

 public class ResourceHolder : IDisposable
{
    private bool disposed = false;
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Free managed resources
            }
            // Free unmanaged resources
            disposed = true;
        }
    }
    
    ~ResourceHolder()
    {
        Dispose(false);
    }
}

 

38. What is the using statement in C#?

  • The using statement is used to automatically manage the disposal of unmanaged resources.
  • It ensures that Dispose() is called on objects that implement IDisposable, even if an exception occurs.

Example:

 using (var reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
}
// `Dispose()` is automatically called on `StreamReader`.

 

39. What is a sealed class in C#?

  • A sealed class cannot be inherited by other classes. It restricts the class hierarchy by preventing inheritance.
  • Sealing a class can be useful for security, performance, or if you want to ensure the class’s implementation stays unchanged.

Example:

 public sealed class SealedClass
{
    public void Display()
    {
        Console.WriteLine("This is a sealed class.");
    }
}

 

40. What is the lock statement in C#?

  • The lock statement is used to ensure that a block of code is executed by only one thread at a time. It provides thread-safety by preventing race conditions.
  • Typically used when working with shared resources in multi-threaded applications.

Example:

 private static object _lock = new object();

public void CriticalSection()
{
    lock (_lock)
    {
        // Code that must be synchronized
    }
}

 

41. What are Indexers in C#?

  • Indexers allow objects to be indexed like arrays. They enable a class to be accessed using square brackets [], similar to array elements.

Example:

 public class SampleCollection
{
    private string[] elements = new string[100];
    
    public string this[int index]
    {
        get { return elements[index]; }
        set { elements[index] = value; }
    }
}

// Usage
SampleCollection collection = new SampleCollection();
collection[0] = "First Element";
Console.WriteLine(collection[0]); // Output: First Element

 

42. What is the difference between Array and ArrayList in C#?

  • Array:

    • Fixed size, strongly-typed (can only hold one data type).
    • Faster performance due to strong typing.
  • ArrayList:

    • Dynamic size, but not strongly-typed (can hold different data types).
    • Uses more memory and is slower compared to arrays due to boxing and unboxing of value types.

Example:

 // Array
int[] numbers = new int[5];

// ArrayList
ArrayList list = new ArrayList();
list.Add(1);
list.Add("String"); // Mixed types

 

43. What is a Multicast Delegate in C#?

  • A Multicast Delegate can hold references to multiple methods. When invoked, it calls all the methods in its invocation list.

Example:

 public delegate void Notify();

public class DelegateExample
{
    public static void Method1() { Console.WriteLine("Method1"); }
    public static void Method2() { Console.WriteLine("Method2"); }

    public static void Main()
    {
        Notify notifyDelegate = Method1;
        notifyDelegate += Method2; // Multicast
        notifyDelegate.Invoke();
    }
}

// Output:
// Method1
// Method2

 

44. What is the difference between IEnumerable and IQueryable in C#?

  • IEnumerable:

    • Suitable for in-memory data collection.
    • Queries are executed in memory.
    • Supports LINQ to Objects and LINQ to XML.
  • IQueryable:

    • Suitable for out-of-memory data (e.g., databases).
    • Queries are executed on the data source (e.g., SQL database).
    • Supports deferred execution and LINQ to SQL.

Example:

 // Using IQueryable for deferred execution
IQueryable<Product> query = dbContext.Products.Where(p => p.Price > 50);

// Using IEnumerable
IEnumerable<Product> products = query.ToList();

 

45. What are anonymous methods in C#?

  • Anonymous methods allow you to define inline, unnamed methods using the delegate keyword.
  • They are used for shorter, simpler delegate expressions, and can capture variables from their surrounding scope.

Example:

 Func<int, int> square = delegate (int x)
{
    return x * x;
};

int result = square(5);  // Output: 25

 

46. What are Lambda Expressions in C#?

  • Lambda expressions are concise ways to write anonymous methods. They are used extensively in LINQ queries.

Example:

 Func<int, int> square = x => x * x;

int result = square(5);  // Output: 25

 

47. What is the role of yield in C#?

  • yield allows methods to return elements of a collection one at a time, without storing them all in memory. It's useful for creating custom iterator methods.

Example:

 public IEnumerable<int> GetNumbers()
{
    for (int i = 1; i <= 5; i++)
    {
        yield return i;
    }
}

// Usage
foreach (int number in GetNumbers())
{
    Console.WriteLine(number);
}

 

48. What is Reflection in C#?

  • Reflection allows inspecting and interacting with the metadata of types, methods, and properties at runtime.

Use cases:

  • Creating objects dynamically.
  • Invoking methods at runtime.
  • Accessing private fields and methods.

Example:

 Type type = typeof(MyClass);
MethodInfo method = type.GetMethod("MyMethod");
method.Invoke(Activator.CreateInstance(type), null);

 

49. What is the purpose of is and as operators in C#?

  • is: Checks if an object is of a specific type.
  • as: Attempts to cast an object to a specific type, returning null if the cast fails.

Example:

 object obj = "Hello";

if (obj is string)
{
    string str = obj as string;
    Console.WriteLine(str);
}

 

50. What is the out keyword in C#?

  • The out keyword allows a method to return multiple values by passing arguments by reference.
  • Parameters marked with out must be assigned a value before the method returns.

Example:

 public void GetValues(out int a, out int b)
{
    a = 10;
    b = 20;
}

// Usage
int x, y;
GetValues(out x, out y);
Console.WriteLine($"x = {x}, y = {y}");

 

51. What is a Strong Name in .NET?

  • A Strong Name uniquely identifies an assembly using its name, version, culture, and public key token.
  • Strongly named assemblies are stored in the GAC and help in avoiding conflicts between versions.

Example:

 sn -k MyKey.snk

 

52. What is the difference between const and readonly in C#?

  • const:
    • Compile-time constant.
    • Value cannot change.
    • Must be assigned at declaration.
  • readonly:
    • Runtime constant.
    • Can be assigned at runtime in the constructor.

Example:

 const int maxItems = 100;
readonly int maxLimit;

 

53. What is the purpose of sealed methods in C#?

  • A sealed method is a method that prevents overriding in derived classes.
  • Only applies to methods in base classes marked virtual or override.

Example:

 public override sealed void Method()
{
    // This method cannot be overridden further.
}

 

54. What is the difference between throw and throw ex in exception handling?

  • throw: Re-throws the original exception while preserving the stack trace.
  • throw ex: Resets the stack trace, making it harder to trace the original error.

Example:

 try
{
    // Some code
}
catch(Exception ex)
{
    throw; // Preserves original exception
}

 

55. What is the difference between Task and Thread in C#?

  • Task: Higher-level abstraction for managing asynchronous operations. It supports continuations and better integrates with async/await.
  • Thread: Lower-level, represents a unit of execution in the system.

 

 

56. What is Lazy<T> in C#?

  • Lazy<T> provides a way to delay the initialization of an object until it is needed (lazy loading).

Example:

 Lazy<MyClass> lazyObj = new Lazy<MyClass>(() => new MyClass());

 

57. What is the difference between Abstract Class and Interface in C#?

  • Abstract Class:
    • Can have method implementations.
    • Supports access modifiers.
    • Can contain constructors.
  • Interface:
    • Only method declarations (before C# 8.0).
    • Cannot have access modifiers.
    • No constructors.

 

58. What is the difference between synchronous and asynchronous programming?

  • Synchronous:
    • Blocking, one operation must complete before another can start.
  • Asynchronous:
    • Non-blocking, allows operations to run in parallel or independently.

Example:

 await Task.Delay(1000); // Asynchronous call

 

59. What is the Func delegate in C#?

  • Func is a built-in delegate type that returns a value. It can take up to 16 input parameters.

Example:

 Func<int, int, int> add = (x, y) => x + y;

 

60. What is the difference between String and StringBuilder?

  • String: Immutable, every change creates a new string object.
  • StringBuilder: Mutable, optimized for multiple manipulations on strings.

 

 

61. What is the Singleton Design Pattern?

  • The Singleton Pattern ensures that a class has only one instance and provides a global point of access to it.

Example:

 public class Singleton
{
    private static Singleton _instance;
    private Singleton() { }

    public static Singleton Instance => _instance ??= new Singleton();
}

 

62. What is Memory Leak in .NET and how to prevent it?

  • A Memory Leak occurs when objects are no longer used but not freed, causing memory exhaustion.
  • To prevent it:
    • Dispose unmanaged resources properly.
    • Use weak references where applicable.
    • Implement the IDisposable interface.

 

63. What is the difference between Task.Run() and TaskFactory.StartNew()?

  • Task.Run(): Suitable for CPU-bound operations and preferred for new code.
  • TaskFactory.StartNew(): Offers more configuration options and is more flexible.

 

64. What is the volatile keyword in C#?

  • The volatile keyword ensures that a variable's value is always read from memory, preventing optimizations that might cache its value in CPU registers.

 

65. What is the difference between Task.Wait() and Task.Result?

  • Task.Wait(): Blocks the calling thread until the task completes.
  • Task.Result: Blocks the thread and retrieves the task’s result.

 

66. What is the difference between a Shallow Copy and a Deep Copy?

  • Shallow Copy: Copies the reference types as references (pointers).
  • Deep Copy: Copies the actual objects, creating new instances.

 

67. What is the difference between a List<T> and an Array in C#?

  • List<T>: Dynamic size, resizable, part of System.Collections.Generic.
  • Array: Fixed size, cannot resize after creation.

 

68. What are Nullable Types in C#?

  • Nullable types allow value types to have null values, using the ? syntax.

Example:

 int? num = null;

 

69. What is the difference between First() and FirstOrDefault() in LINQ?

  • First(): Throws an exception if no element is found.
  • FirstOrDefault(): Returns a default value (like null or 0) if no element is found.

 

70. What is yield in C#?

  • yield is used to create an iterator block, returning each element of a collection one at a time without creating the entire collection in memory.

 

71. What are the differences between Task and ThreadPool?

  • Task: Used for managing parallel code.
  • ThreadPool: Manages a pool of worker threads to perform tasks.

 

72. What is the lock keyword in C#?

  • lock is used to ensure that a block of code runs exclusively in a multi-threaded environment, preventing race conditions.

 

73. What is IEnumerable<T> in C#?

  • IEnumerable<T> represents a forward-only, read-only collection of a sequence of elements.

 

 

74. What is Covariance and Contravariance in C#?

  • Covariance allows a method to return a more derived type than the specified type.
  • Contravariance allows a method to accept arguments of a more general type than the specified type.

 

75. What is a Mutex in .NET?

  • A Mutex is used for synchronizing access to a resource across multiple threads and processes.

 

76. What are Tuples in C#?

  • A Tuple is a data structure that can hold multiple values of different types.

Example:

 var tuple = Tuple.Create(1, "Hello", true);

 

77. What is the difference between ToString() and Convert.ToString()?

  • ToString(): Can throw an exception if the object is null.
  • Convert.ToString(): Returns an empty string if the object is null.

 

78. What is the ThreadLocal<T> class in C#?

  • ThreadLocal<T> provides thread-local storage, meaning each thread has its own separate instance of a variable.

 

79. What is the ICloneable interface in C#?

  • The ICloneable interface provides a mechanism for creating a copy of an object.

 

80. What is the WeakReference class in C#?

  • A WeakReference allows an object to be garbage collected while still allowing a reference to the object.

 

 

 


Wednesday, April 19, 2023

How do you implement microservices architecture in a .NET Core Web API?

Implementing a microservices architecture in a .NET Core Web API involves breaking down the monolithic application into smaller, independent services that can be developed, deployed, and scaled independently. Here are some steps to follow:
  1. Identify the bounded contexts: Identify the different business domains or functionalities that can be encapsulated as independent microservices.
  2. Define the APIs: Define the APIs for each microservice that will expose the functionality of that service.
  3. Use a service registry: Use a service registry such as Consul or Eureka to register and discover the services.
  4. Implement inter-service communication: Implement inter-service communication using REST APIs or message queues such as RabbitMQ or Apache Kafka.
  5. Use containerization: Use containerization tools such as Docker to package and deploy the microservices.
  6. Use an orchestrator: Use an orchestrator such as Kubernetes or Docker Swarm to manage and scale the containers.
  7. Implement fault tolerance: Implement fault tolerance mechanisms such as circuit breakers and retries to handle failures in the microservices architecture.
  8. Implement distributed tracing: Implement distributed tracing to monitor and debug the microservices architecture.
  9. Use a centralized logging system: Use a centralized logging system such as ELK stack or Graylog to collect and analyze the logs generated by the microservices.
  10. Use a monitoring system: Use a monitoring system such as Prometheus or Grafana to monitor the health and performance of the microservices architecture.

By following these steps, you can implement a microservices architecture in a .NET Core Web API that is scalable, fault-tolerant, and easy to maintain.

How do you implement background processing and message queues in a .NET Core Web API?

Background processing and message queues are important aspects of a .NET Core Web API that allow for asynchronous and distributed processing. Here are some steps to implement them:
  1. Choose a message queue system: There are several message queue systems available, such as RabbitMQ, Azure Service Bus, and AWS SQS. Choose the one that best suits your needs.
  2. Install the required packages: Depending on the message queue system you choose, install the necessary packages, such as RabbitMQ.Client or Microsoft.Azure.ServiceBus.
  3. Implement message producers and consumers: Create classes that implement message producers and consumers. A message producer is responsible for sending messages to the queue, while a message consumer receives messages from the queue and processes them.
  4. Configure the message queue system: Configure the message queue system, such as setting up queues, topics, and subscriptions, and configuring access policies and security.
  5. Implement background processing: Use a message queue system to implement background processing. For example, you can use a message producer to send a message to a queue, which is then processed by a message consumer in the background.
  6. Handle message retries and failures: Implement logic to handle message retries and failures, such as implementing an exponential backoff algorithm to retry failed messages.
  7. Monitor message queue metrics: Monitor message queue metrics, such as queue length, message processing time, and message failure rate, to ensure optimal performance and reliability.

By following these steps, you can implement background processing and message queues in your .NET Core Web API to improve its performance and scalability.

What are some best practices for logging and monitoring a .NET Core Web API?

Here are some best practices for logging and monitoring a .NET Core Web API:
  1. Use a centralized logging system: Instead of relying on individual log files on each server, use a centralized logging system to aggregate logs from all servers. This makes it easier to search and analyze logs.
  2. Use structured logging: Structured logging involves logging data in a structured format such as JSON or XML. This makes it easier to search and analyze logs.
  3. Log all errors and exceptions: Log all errors and exceptions, including the stack trace, to help with debugging and troubleshooting.
  4. Implement logging at different levels: Implement logging at different levels, such as debug, info, warning, and error, to help with troubleshooting and monitoring.
  5. Use log correlation: Use a unique identifier in each log message to track the flow of requests through your system. This makes it easier to diagnose problems that span multiple services.
  6. Monitor performance metrics: Monitor performance metrics such as response time, throughput, and error rates to identify and troubleshoot performance issues.
  7. Set up alerts: Set up alerts to notify you when errors or performance issues occur. This enables you to respond quickly and minimize downtime.
  8. Use application performance monitoring (APM) tools: APM tools provide real-time visibility into the performance of your application and its dependencies. They can help you identify and troubleshoot performance issues more quickly.
  9. Implement security monitoring: Implement security monitoring to detect and respond to potential security threats. This includes monitoring for unusual login attempts, unauthorized access attempts, and other suspicious activity.
  10. Regularly review logs and metrics: Regularly review logs and metrics to identify trends and areas for improvement. This can help you optimize performance and prevent issues before they occur.

How do you implement SSL/TLS encryption in a .NET Core Web API?

SSL/TLS encryption is essential for securing web applications by encrypting the data transmitted between the client and server. In a .NET Core Web API, you can implement SSL/TLS encryption by following these steps:
  1. Obtain a certificate: To use SSL/TLS encryption, you need to obtain a certificate. You can either purchase a certificate from a trusted third-party provider or create a self-signed certificate.
  2. Configure HTTPS in your application: Once you have obtained a certificate, you need to configure HTTPS in your application. You can do this by modifying the launchSettings.json file or adding the UseHttpsRedirection and UseHsts methods in the Startup.cs file.
  3. Redirect HTTP requests to HTTPS: To ensure that all requests are encrypted, you can redirect HTTP requests to HTTPS. You can do this by adding the UseHttpsRedirection method in the Startup.cs file.
  4. Configure SSL/TLS in your server: You need to configure your server to use SSL/TLS. This can be done by modifying the web server configuration file.
  5. Test your SSL/TLS implementation: Finally, you should test your SSL/TLS implementation to ensure that it is working correctly.
Overall, SSL/TLS encryption is a crucial component of web application security, and it is essential to implement it correctly in a .NET Core Web API.