The Curious Engineer

All blogs / C# / .NET

Andrew Lock

andrewlock.net

Hi, my name is Andrew, or ‘Sock’ to most people. This blog is where I share my experiences as I journey into ASP.NET Core.

C# / .NETWeb developmentPerformance / optimizationSecurityDevOps / SRE / infrastructure

Posts
534 from 5 May 2016 to 20 Oct 2026
Posting
weekly (32 in the last year)
Kind
personal blog
Feed
https://andrewlock.net/rss.xml

2026 26

  1. An introduction to Compact Binary Object Representation (CBOR) in .NET
  2. Stripping extra dependencies in .NET NativeAOT apps using linker substitutions
  3. Experimental support for Device Bound Session Credentials (DBSC) in ASP.NET Core: Exploring the .NET 11 preview - Part 8
  4. Understanding Device Bound Session Credentials (DBSC)
  5. The pain of serializing unions and closed class hierarchies with System.Text.Json: Exploring the .NET 11 preview - Part 7
  6. Finding the total number of processors on a machine with .NET
  7. Automatic CSRF protection based on Fetch Metadata headers: Exploring the .NET 11 preview - Part 6
  8. Understanding the Fetch Metadata HTTP headers: Sec-Fetch-Site and friends
  9. Improvements to reading Process outputs: Exploring the .NET 11 preview - Part 5
  10. Closed class hierarchies: Exploring the .NET 11 preview - Part 4
  11. Avoiding ToString() allocations with StringBuilder.MoveChunks: Exploring the .NET 11 preview - Part 3
  12. .NET (OK, C#) finally gets union types🎉: Exploring the .NET 11 preview - Part 2
  13. Running background tasks in Blazor with Web Workers: Exploring the .NET 11 preview - Part 1
  14. New features in Git 2.54: easier rebasing, hooks, and statistics
  15. Removing byte[] allocations in .NET Framework using ReadOnlySpan
  16. Running AI agents with customized templates using docker sandbox
  17. Running AI agents safely in a microVM using docker sandbox
  18. Configuring contextual options with Microsoft.Extensions.Options.Contextual
  19. Splitting the NetEscapades.EnumGenerators packages: the road to a stable release
  20. Recording metrics in-process using MeterListener: System.Diagnostics.Metrics APIs - Part 4
  21. Creating standard and "observable" instruments: System.Diagnostics.Metrics APIs - Part 3
  22. Exploring the (underwhelming) System.Diagnostics.Metrics source generators: System.Diagnostics.Metrics APIs - Part 2
  23. Creating and consuming metrics with System.Diagnostics.Metrics APIs: System.Diagnostics.Metrics APIs - Part 1
  24. Making foreach on an IEnumerable allocation-free using reflection and dynamic methods
  25. The Windows File Explorer replacement, File Pilot, is awesome
  26. Recent updates to NetEscapades.EnumGenerators: new APIs and System.Memory support

2025 47

  1. Creating a .NET CLR profiler using C# and NativeAOT with Silhouette
  2. Trying out the Zed editor on Windows for .NET and Markdown
  3. Recent updates to NetEscapades.EnumGenerators: [EnumMember] support, analyzers, and bug fixes
  4. Exploring the .NET boot process via host tracing
  5. Companies complaining .NET moves too fast should just pay for post-EOL support
  6. Easier reflection with [UnsafeAccessorType] in .NET 10: Exploring the .NET 10 preview - Part 9
  7. Understanding the worst .NET vulnerability ever: request smuggling and CVE-2025-55315
  8. Adding metadata to fallback endpoints in ASP.NET Core
  9. Publishing NuGet packages from GitHub actions the easy way with Trusted Publishing
  10. sleep-pc: a .NET Native AOT tool to make Windows sleep after a timeout
  11. Supporting platform-specific .NET tools on old .NET SDKs: Exploring the .NET 10 preview - Part 8
  12. Packaging self-contained and native AOT .NET tools for NuGet: Exploring the .NET 10 preview - Part 7
  13. Using and authoring .NET tools
  14. Fixing an old .NET Core native library loading issue on Alpine
  15. Converting an xUnit test project to TUnit
  16. Running .NET in the browser without Blazor
  17. Passkey support for ASP.NET Core identity: Exploring the .NET 10 preview - Part 6
  18. Running one-off .NET tools with dnx: Exploring the .NET 10 preview - Part 5
  19. Solving the source generator 'marker attribute' problem in .NET 10: Exploring the .NET 10 preview - Part 4
  20. C# 14 extension members; AKA extension everything: Exploring the .NET 10 preview - Part 3
  21. Behind the scenes of dotnet run app.cs: Exploring the .NET 10 preview - Part 2
  22. Exploring the features of dotnet run app.cs: Exploring the .NET 10 preview - Part 1
  23. Working with stacked branches in git (Part 2)
  24. Working with stacked branches in git (Part 1)
  25. Converting a Microsoft XNA 3.1 game to MonoGame
  26. Creating your first sample game with MonoGame
  27. Converting a docker-compose file to .NET Aspire
  28. Pushing a whole stack of branches with a single Git command
  29. Using the new AI template to create a chatbot about a website
  30. Exploring the new AI chat template
  31. Creating a 'pooled' dependency injection lifetime
  32. Going beyond singleton, scoped, and transient lifetimes—tenant, pooled, and drifter
  33. NetEscapades.​AspNetCore.​SecurityHeaders 1.0.0 has been released
  34. Verifying tricky git rebases with git range-diff
  35. Creating SBOM attestations in GitHub Actions
  36. Creating a software bill of materials (SBOM) for an open-source NuGet package
  37. Creating provenance attestations for NuGet packages in GitHub Actions
  38. Running an ASP.NET Core app inside IIS in a Windows container
  39. Creating an analyzer to detect infinite loops caused by ThreadAbortExceptions
  40. Disabling localized satellite assemblies during dotnet publish
  41. Setting application environment variables in IIS without restarts
  42. Preventing client-side cross-site-scripting vulnerabilities with Trusted Types
  43. Supporting multiple .NET SDK versions in a source generator: Creating a source generator - Part 14
  44. Supporting multiple .NET SDK versions in analyzers and source generators
  45. Accessing MSBuild properties and user configuration from source generators: Creating a source generator - Part 13
  46. Reading compilation options and the C# version in source generators: Creating a source generator - Part 12
  47. Implementing an interceptor with a source generator: Creating a source generator - Part 11

2024 45

  1. Building LaTeX projects on Windows easily with Docker
  2. Using the YamlDotNet source generator for Native AOT
  3. Cross-Origin-Embedder-Policy: securing embedded resources: Understanding cross-origin security headers - Part 3
  4. Cross-Origin-Resource-Policy: preventing hotlinking and XSSI attacks: Understanding cross-origin security headers - Part 2
  5. Cross-Origin-Opener-Policy: preventing attacks from popups: Understanding cross-origin security headers - Part 1
  6. Recent updates for NetEscapades.EnumGenerators: interceptors!
  7. Is the result pattern worth it?: Working with the result pattern - Part 4
  8. Adding more extensions to Result<T>: Working with the result pattern - Part 3
  9. Safety and simplicity with LINQ: Working with the result pattern - Part 2
  10. Replacing Exceptions-as-flow-control with the result pattern: Working with the result pattern - Part 1
  11. Major updates to NetEscapades.​AspNetCore.​SecurityHeaders
  12. Fixing MAX_PATH issues in GitLab
  13. Preventing breaking changes in public APIs with PublicApiGenerator
  14. Working with tar files in .NET 8
  15. Using Azure Storage Queue messages with Azure Functions and [QueueTrigger]
  16. Avoiding CDN supply-chain attacks with Subresource Integrity (SRI)
  17. Combining multiple docker images into a multi-arch image
  18. Simplifying [Theory] test data with Xunit.Combinatorial
  19. Creating source-only NuGet packages
  20. Disambiguating types with the same name with extern alias
  21. Adding support for collection expressions to your own types: Behind the scenes of collection expressions - Part 5
  22. Exploring the generated code: the spread element: Behind the scenes of collection expressions - Part 4
  23. Exploring the generated code: T[], Span<T>, and Immutable collections: Behind the scenes of collection expressions - Part 3
  24. Exploring the generated code: List<T> and fallback cases: Behind the scenes of collection expressions - Part 2
  25. Introducing collection expressions in C#12: Behind the scenes of collection expressions - Part 1
  26. Conditionally skipping a trigger job in GitLab based on a previous job
  27. Blocking primary constructor member capture using a Roslyn Analyzer
  28. Thoughts about primary constructors: 3 pros and 5 cons
  29. An introduction to primary constructors in C#12
  30. Creating a .NET AsciiMath parser and using it in a Markdig extension
  31. Hacking together an AsciiMath parser for .NET
  32. Rendering Math in HTML: MathML, MathML Core, and AsciiMath
  33. Syncing a git branch between Windows and WSL filesystems
  34. Implementing Dijkstra's algorithm for finding the shortest path between two nodes using PriorityQueue in .NET 9
  35. Behind the implementation of .NET's PriorityQueue
  36. An introduction to the heap data structure and .NET's priority queue
  37. Using Unix domain sockets with ASP.NET Core and HttpClient
  38. Using named pipes with ASP.NET Core and HttpClient
  39. 8 ways to set the URLs for an ASP.NET Core app
  40. Using default interface methods for performance gains in IHeaderDictionary
  41. Understanding C# 8 default interface methods
  42. Testing your incremental generator pipeline outputs are cacheable: Creating a source generator - Part 10
  43. Avoiding performance pitfalls in incremental generators: Creating a source generator - Part 9
  44. A brief look at StringValues
  45. Backing up files to Azure blob storage with azcopy

2023 44

  1. Updates to the StronglyTypedId library - simplification, templating, and CodeFixes: Using strongly-typed entity IDs to avoid primitive obsession - Part 8
  2. Redacting sensitive data in logs with Microsoft​.Extensions​.Compliance​.Redaction
  3. Enriching logs with [TagProvider] and ILogEnricher
  4. Behind [LogProperties] and the new telemetry logging source generator
  5. A failed experiment with interceptors in C# 12 and .NET 8
  6. Reading JSON and binary data from multipart/form-data sections in ASP.NET Core
  7. Avoiding flaky tests with TimeProvider and ITimer: Exploring the .NET 8 preview - Part 12
  8. Short-circuit routing in .NET 8: Exploring the .NET 8 preview - Part 11
  9. Updates to Docker images in .NET 8: Exploring the .NET 8 preview - Part 10
  10. Rendering Blazor components to a string: Exploring the .NET 8 preview - Part 9
  11. Can you use the .NET 8 Identity API endpoints with IdentityServer?
  12. Should you use the .NET 8 Identity API endpoints?
  13. Introducing the Identity API endpoints: Exploring the .NET 8 preview - Part 8
  14. Form binding in minimal APIs: Exploring the .NET 8 preview - Part 7
  15. Last chance to win a ticket to APIDays London with my new book!
  16. Keyed service dependency injection container support: Exploring the .NET 8 preview - Part 6
  17. ASP.NET Core in Action, Third Edition is now in print
  18. Replacing method calls with Interceptors: Exploring the .NET 8 preview - Part 5
  19. Exploring the new minimal API source generator: Exploring the .NET 8 preview - Part 4
  20. Comparing WebApplication.CreateBuilder() to the new CreateSlimBuilder() method: Exploring the .NET 8 preview - Part 3
  21. The minimal API AOT compilation template: Exploring the .NET 8 preview - Part 2
  22. Using the new configuration binder source generator: Exploring the .NET 8 preview - Part 1
  23. Validating nested DataAnnotation IOptions recursively with MiniValidation
  24. Supporting legacy browsers and SameSite cookies without UserAgent sniffing in ASP.NET Core.
  25. Understanding SameSite cookies
  26. Making authenticated cross-origin requests with ASP.NET Core Identity
  27. Using Octokit.GraphQL to interact with the GitHub discussions API
  28. Migrating comments from Disqus to giscus
  29. Super-charging 'git rebase' with 'git absorb'
  30. Smoother rebases with auto-squashing Git commits
  31. Adding client-side validation to ASP.NET Core, without jQuery or unobtrusive validation
  32. Understanding the .NET ecosystem: The introduction of .NET Standard
  33. Understanding the .NET ecosystem: The evolution of .NET into .NET 7
  34. Working with Git in JetBrains Rider
  35. Drawing graphs in GitHub comments with Mermaid diagrams
  36. Customising the RequestDelegate with filters: Behind the scenes of minimal APIs - Part 8
  37. Building the final RequestDelegate: Behind the scenes of minimal APIs - Part 7
  38. Thoughts on 'What is .NET, and why should you choose it?'
  39. Generating the response writing expression for RequestDelegate: Behind the scenes of minimal APIs - Part 6
  40. Generating argument expressions for minimal APIs (continued): Behind the scenes of minimal APIs - Part 5
  41. Generating argument expressions for minimal APIs: Behind the scenes of minimal APIs - Part 4
  42. Exploring the model-binding logic of minimal APIs: Behind the scenes of minimal APIs - Part 3
  43. Extracting metadata from a minimal API handler: Behind the scenes of minimal APIs - Part 2
  44. A first look behind the scenes of minimal API endpoints: Behind the scenes of minimal APIs - Part 1

2022 41

  1. ASP.NET Core in Action, Version 3 update
  2. 5 new MVC features in .NET 7
  3. The dangers and gotchas of using scoped services in OptionsBuilder
  4. Working with stacked branches in Git is easier with --update-refs
  5. Fighting with nullable reference types in Razor Pages
  6. Adding validation to strongly typed configuration objects using FluentValidation
  7. Adding validation to strongly typed configuration objects in .NET 6
  8. ASP.NET Core in Action, version 3, is now available
  9. Counting the leading zeroes in a binary number with C#
  10. Working with System.Random and threads safely in .NET Core and .NET Framework
  11. Using CancellationTokens in ASP.NET Core minimal APIs
  12. Handling concurrent merges to master in multi-stage Azure DevOps pipelines
  13. Replacing Disqus with GitHub discussions using giscus
  14. Considering replacing Disqus with Giscus
  15. Adding content negotiation to minimal APIs with Carter
  16. Returning XML from minimal APIs in .NET 6
  17. Understanding your middleware pipeline in .NET 6 with the Middleware Analysis package
  18. Consuming anonymous types with DiagnosticListener in .NET 6
  19. A brief introduction to DiagnosticSource
  20. Using PathBase with .NET 6's WebApplicationBuilder
  21. Understanding PathBase in ASP.NET Core
  22. Reducing the size of a git repository with git-replace
  23. Rewriting git history simply with git-filter-repo
  24. Testing ASP.NET Core gRPC services in JetBrains Rider
  25. Generating sortable Guids using NewId
  26. Why isn't my ASP.NET Core app in Docker working?
  27. Running JavaScript inside a .NET app with JavaScriptEngineSwitcher
  28. Keeping up with .NET: learning about new features and APIs
  29. Working on two git branches at once with git worktree
  30. Tracking down a hanging xUnit test in CI: building a custom Test Framework
  31. Just because you stopped waiting for it, doesn't mean the Task stopped running
  32. A deep-dive into the new Task.WaitAsync() API in .NET 6
  33. Cancelling await calls in .NET 6 with Task.WaitAsync()
  34. Please stop lying about .NET Standard 2.0 support!
  35. Waiting for your ASP.NET Core app to be ready from an IHostedService in .NET 6
  36. NetEscapades.EnumGenerators: a source generator for enum performance
  37. Solving the source generator 'marker attribute' problem - Part 2: Creating a source generator - Part 8
  38. Solving the source generator 'marker attribute' problem - Part 1: Creating a source generator - Part 7
  39. Saving source generator output in source control: Creating a source generator - Part 6
  40. Finding a type declaration's namespace and type hierarchy: Creating a source generator - Part 5
  41. Customising generated code with marker attributes: Creating a source generator - Part 4

2021 51

  1. Integration testing and NuGet packaging: Creating a source generator - Part 3
  2. Testing an incremental generator with snapshot testing: Creating a source generator - Part 2
  3. Creating an incremental generator: Creating a source generator - Part 1
  4. Upgrading a .NET 5 "Startup-based" app to .NET 6: Exploring .NET 6 - Part 12
  5. [CallerArgumentExpression] and throw helpers: Exploring .NET 6 - Part 11
  6. New dependency injection features in .NET 6: Exploring .NET 6 - Part 10
  7. Source generator updates: incremental generators: Exploring .NET 6 - Part 9
  8. Improving logging performance with source generators: Exploring .NET 6 - Part 8
  9. Analyzers for ASP.NET Core in .NET 6: Exploring .NET 6 - Part 7
  10. Supporting integration tests with WebApplicationFactory in .NET 6: Exploring .NET 6 - Part 6
  11. Supporting EF Core migrations with WebApplicationBuilder: Exploring .NET 6 - Part 5
  12. Building a middleware pipeline with WebApplication: Exploring .NET 6 - Part 4
  13. Exploring the code behind WebApplicationBuilder: Exploring .NET 6 - Part 3
  14. Comparing WebApplicationBuilder to the Generic Host: Exploring .NET 6 - Part 2
  15. Looking inside ConfigurationManager in .NET 6: Exploring .NET 6 - Part 1
  16. Using Source Generators with Blazor components in .NET 6
  17. Downloading artifacts from Azure DevOps using .NET
  18. Rebuilding StronglyTypedId as a source generator - 1.0.0-beta release: Using strongly-typed entity IDs to avoid primitive obsession - Part 7
  19. ValueStringBuilder: a stack-based string-builder: A deep dive on StringBuilder - Part 6
  20. Reducing allocations by caching with StringBuilderCache: A deep dive on StringBuilder - Part 5
  21. Inserting and removing characters: A deep dive on StringBuilder - Part 4
  22. Converting chunks to a string with ToString(): A deep dive on StringBuilder - Part 3
  23. Appending strings, built-in types, and lists: A deep dive on StringBuilder - Part 2
  24. The overall design and a first look at the internals: A deep dive on StringBuilder - Part 1
  25. Adding authentication to a Blazor Server app using Auth0
  26. Conditional compilation for ignoring method calls with the ConditionalAttribute
  27. Using SSH and localhost.run to test GitHub webhooks locally
  28. Creating Docker multi-arch images for ARM64 from Windows
  29. Exploring .NET interactive notebooks with VS Code
  30. Benchmarking 4 reflection methods for calling a constructor in .NET
  31. How to stop Visual Studio from creating launchsettings.json
  32. Extending the calculator implementation: Creating a Simple Moving Average calculator in C# - Part 3
  33. Making the calculator thread-safe: Creating a Simple Moving Average calculator in C# - Part 2
  34. A Simple Moving Average calculator: Creating a Simple Moving Average calculator in C# - Part 1
  35. Trying out the open-source eCommerce platform nopCommerce using Docker
  36. Fixing build warning NETSSDK1138 when building projects with end-of-life .NET frameworks
  37. Viewing overwritten configuration values in ASP.NET Core
  38. ASP.NET Core in Action, Second Edition is available now!
  39. Viewing app configuration using Oakton's Describe command and Spectre.Console
  40. Debugging configuration values in ASP.NET Core
  41. Running Kubernetes and the dashboard with Docker Desktop
  42. Installing Docker Desktop for Windows and WSL 2
  43. Configuring HTTPS using a custom TLS certificate with Netlify and Cloudflare
  44. Using source generators with a custom attribute to generate a menu component in a Blazor app
  45. Using source generators to generate a menu component in a Blazor app
  46. Using source generators to find all routable components in a Blazor WebAssembly app
  47. Finding all routable components in a Blazor App
  48. Prerendering a Blazor WebAssembly app to static files, without an ASP.NET Core host app
  49. Enabling prerendering for Blazor WebAssembly apps
  50. An introduction to the Data Protection system in ASP.NET Core
  51. Auto-assigning issues using a GitHub Action: Creating my first GitHub app with Probot - Part 4

2020 50

  1. Should I use self-contained or framework-dependent publishing in Docker images?
  2. Using action results and content negotiation with "route-to-code" APIs
  3. Using Quartz.NET with ASP.NET Core and worker services
  4. Applying the MVC design pattern to Razor Pages
  5. Tips, tricks, and edge cases: Deploying ASP.NET Core applications to Kubernetes - Part 12
  6. Avoiding downtime in rolling deployments by blocking SIGTERM: Deploying ASP.NET Core applications to Kubernetes - Part 11
  7. Creating an 'exec-host' deployment for running one-off commands: Deploying ASP.NET Core applications to Kubernetes - Part 10
  8. Monitoring Helm releases that use jobs and init containers: Deploying ASP.NET Core applications to Kubernetes - Part 9
  9. Running database migrations using jobs and init containers: Deploying ASP.NET Core applications to Kubernetes - Part 8
  10. Running database migrations when deploying to Kubernetes: Deploying ASP.NET Core applications to Kubernetes - Part 7
  11. Adding health checks with Liveness, Readiness, and Startup probes: Deploying ASP.NET Core applications to Kubernetes - Part 6
  12. Setting environment variables for ASP.NET Core apps in a Helm chart: Deploying ASP.NET Core applications to Kubernetes - Part 5
  13. Creating a Helm chart for an ASP.NET Core app: Deploying ASP.NET Core applications to Kubernetes - Part 4
  14. An introduction to deploying applications with Helm: Deploying ASP.NET Core applications to Kubernetes - Part 3
  15. Configuring resources with YAML manifests: Deploying ASP.NET Core applications to Kubernetes - Part 2
  16. An Introduction to Kubernetes: Deploying ASP.NET Core applications to Kubernetes - Part 1
  17. Should you unit-test API/MVC controllers in ASP.NET Core?
  18. Controlling IHostedService execution order in ASP.NET Core 3.x
  19. DI scopes in IHttpClientFactory message handlers don't work like you think they do
  20. Exploring the code behind IHttpClientFactory in depth
  21. Detecting duplicate routes in ASP.NET Core: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 5
  22. Creating a custom endpoint visualization graph: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 4
  23. Creating a custom DfaGraphWriter using ImpromptuInterface for easier reflection: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 3
  24. Adding an endpoint graph to your ASP.NET Core application: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 2
  25. Visualizing endpoints using the DOT language: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 1
  26. Getting started with ASP.NET Core
  27. Adding host filtering to Kestrel in ASP.NET Core
  28. Setting global authorization policies using the DefaultPolicy and the FallbackPolicy in ASP.NET Core 3.x
  29. Customising the ASP.NET Core default UI without editing the PageModels
  30. Strongly-typed ID update 0.2.1: Using strongly-typed entity IDs to avoid primitive obsession - Part 6
  31. Handling Web API Exceptions with ProblemDetails middleware
  32. Extending the shutdown timeout setting to ensure graceful IHostedService shutdown
  33. Using jQuery and Bootstrap from a CDN with fallback scripts in ASP.NET Core 3.0
  34. Preventing mass assignment or over posting with Razor Pages in ASP.NET Core
  35. Adding simple email address obfuscation for your blog like Cloudflare Scrape Shield
  36. How to automatically choose a free port in ASP.NET Core 3.0
  37. 5 ways to set the URLs for an ASP.NET Core app
  38. Accessing route values in endpoint middleware in ASP.NET Core 3.0
  39. Replacing AJAX calls in Razor Pages with Razor Components and Blazor
  40. Don't replace your View Components with Razor Components
  41. How to fix the order of commits in GitHub Pull Requests
  42. Creating a custom ErrorHandlerMiddleware function
  43. When ASP.NET Core can't find your controller: debugging application parts
  44. Exploring the new rollForward and allowPrerelease settings in global.json: Exploring ASP.NET Core 3.0 - Part 8
  45. Creating an endpoint from multiple middleware in ASP.NET Core 3.x
  46. Inserting middleware between UseRouting() and UseEndpoints() as a library author - Part 2
  47. Inserting middleware between UseRouting() and UseEndpoints() as a library author - Part 1
  48. Excluding health check endpoints from Serilog request logging: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 4
  49. Logging MVC properties with Serilog.AspNetCore: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 3
  50. Logging the selected Endpoint Name with Serilog: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 2

2019 57

  1. Reducing log verbosity with Serilog RequestLogging: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 1
  2. A Quantum Random Number Generator for .NET: The quantum measurement problem and many-worlds approach
  3. .NET Core, Docker, and Cultures - Solving a culture issue porting a .NET Core app from Windows to Linux
  4. Converting integration tests to .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 5
  5. Converting a terminal middleware to endpoint routing in ASP.NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 4
  6. Avoiding Startup service injection in ASP.NET Core 3: Upgrading to ASP.NET Core 3.0 - Part 3
  7. IHostingEnvironment vs IHostEnvironment - obsolete types in .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 2
  8. Converting a .NET Standard 2.0 library to .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 1
  9. Simplifying the Cake global tool bootstrapper scripts with .NET Core 3 local tools
  10. New in .NET Core 3.0: local tools: Exploring ASP.NET Core 3.0 - Part 7
  11. Running .NET Core global tools in non-sdk Docker images
  12. Packaging CLI programs into Docker images to avoid dependency hell
  13. New in ASP.NET Core 3.0: structured logging for startup messages: Exploring ASP.NET Core 3.0 - Part 6
  14. Introducing IHostLifetime and untangling the Generic Host startup interactions: Exploring ASP.NET Core 3.0 - Part 5
  15. Running async tasks on app startup in ASP.NET Core 3.0: Exploring ASP.NET Core 3.0 - Part 4
  16. New in ASP.NET Core 3: Service provider validation: Exploring ASP.NET Core 3.0 - Part 3
  17. Comparing Startup.cs between the ASP.NET Core 3.0 templates: Exploring ASP.NET Core 3.0 - Part 2
  18. Exploring the new project file, Program.cs, and the generic host: Exploring ASP.NET Core 3.0 - Part 1
  19. Making my first contribution on SourceForge using Mercurial
  20. A bootstrapper script for the Cake .NET Core Global Tool on Alpine using ash
  21. A bootstrapper script for the Cake .NET Core Global Tool on Windows
  22. How to build with Cake on Linux using Cake.CoreCLR or the Cake global tool
  23. Using the ReferenceAssemblies NuGet package to build .NET Framework libraries on Linux, without installing Mono
  24. Alternatives to Microsoft.FeatureManagement: Adding feature flags to an ASP.NET Core app - Part 6
  25. Generating strongly-typed IDs at build-time with Roslyn: Using strongly-typed entity IDs to avoid primitive obsession - Part 5
  26. Exploring Raygun's new application performance monitoring tool for .NET Core
  27. Verifying phone number ownership with Twilio Verify API v2 using ASP.NET Core Identity and Razor Pages
  28. Ensuring consistent feature flags across requests: Adding feature flags to an ASP.NET Core app - Part 5
  29. Creating a custom feature filter: Adding feature flags to an ASP.NET Core app - Part 4
  30. Creating dynamic feature flags with feature filters: Adding feature flags to an ASP.NET Core app - Part 3
  31. Filtering action methods with feature flags: Adding feature flags to an ASP.NET Core app - Part 2
  32. Introducing Microsoft.FeatureManagement: Adding feature flags to an ASP.NET Core app - Part 1
  33. Serializing a PascalCase Newtonsoft.Json JObject to camelCase
  34. Using scoped services inside a Quartz.NET hosted service with ASP.NET Core
  35. Creating a Quartz.NET hosted service with ASP.NET Core
  36. Verifying phone number ownership with Twilio using ASP.NET Core Identity and Razor Pages
  37. Safely migrating passwords in ASP.NET Core Identity with a custom PasswordHasher
  38. Validating phone numbers with Twilio using ASP.NET Core Identity and Razor Pages
  39. Strongly-typed IDs in EF Core (Revisited): Using strongly-typed entity IDs to avoid primitive obsession - Part 4
  40. Using strongly-typed entity IDs with EF Core: Using strongly-typed entity IDs to avoid primitive obsession - Part 3
  41. Adding JSON converters to strongly typed IDs: Using strongly-typed entity IDs to avoid primitive obsession - Part 2
  42. An introduction to strongly-typed entity IDs: Using strongly-typed entity IDs to avoid primitive obsession - Part 1
  43. Using Lambda@Edge to handle Angular client-side routing with S3 and CloudFront
  44. Exploring the .NET Core MCR Docker files (updated): runtime vs aspnet vs sdk
  45. Creating my first Azure Functions v2.0 app: a WebHook and a timer
  46. Creating a not-empty GUID validation attribute and a not-default validation attribute
  47. Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies
  48. Deploying a GitHub app to Glitch: Creating my first GitHub app with Probot - Part 3
  49. Creating the auto-assign-issues bot: Creating my first GitHub app with Probot - Part 2
  50. Creating a GitHub app with create-probot-app: Creating my first GitHub app with Probot - Part 1
  51. An introduction to ASP.NET Core Razor Pages
  52. Reducing initial request latency by pre-building services in a startup task in ASP.NET Core
  53. Using health checks to run async tasks in ASP.NET Core: Running async tasks on app startup in ASP.NET Core - Part 4
  54. Feedback on async task examples and another possible solution: Running async tasks on app startup in ASP.NET Core - Part 3
  55. Two approaches for running async tasks: Running async tasks on app startup in ASP.NET Core - Part 2
  56. Built in options for running async tasks: Running async tasks on app startup in ASP.NET Core - Part 1
  57. Using dependency injection with Twilio SMS and ASP.NET Core 2.1

2018 57

  1. Creating an AWS policy for calling the SES mailbox simulator from CodeBuild
  2. Creating a git repo with Azure Repos and trying out Git LFS
  3. Dark mode now available!
  4. Why is string.GetHashCode() different each time I run my program in .NET Core?
  5. Secure secrets storage for ASP.NET Core with AWS Secrets Manager (Part 2)
  6. Secure secrets storage for ASP.NET Core with AWS Secrets Manager (Part 1)
  7. Caching Docker layers on serverless build hosts with multi-stage builds, --target, and --cache-from
  8. Generating .editorconfig files automatically using IntelliCode
  9. Creating singleton named options with IOptionsMonitor
  10. Simplifying dependency injection for IConfigureOptions with the ConfigureOptions() helper
  11. Delaying strongly-typed options configuration using PostConfigure in ASP.NET Core
  12. Configuring named options using IConfigureNamedOptions and ConfigureAll
  13. The dangers and gotchas of using scoped services in IConfigureOptions
  14. Using multiple instances of strongly-typed settings with named options in .NET Core 2.x
  15. Building an open source GitHub project using Azure DevOps
  16. Creating an ASCII-art tree in C#
  17. Adding decorated classes to the ASP.NET Core DI container using Scrutor
  18. Using Scrutor to automatically register your services with the ASP.NET Core DI container
  19. How to register a service with multiple interfaces in ASP.NET Core DI
  20. The difference between GetService() and GetRequiredService() in ASP.NET Core
  21. Why isn't my ASP.NET Core environment-specific configuration loading?
  22. Running smoke tests for ASP.NET Core apps in CI using Docker
  23. Adding Segment client-side analytics to an ASP.NET Core application
  24. Using snake case column names with Dapper and PostgreSQL
  25. Adding Serilog to the ASP.NET Core Generic Host
  26. The ASP.NET Core Generic Host: namespace clashes and extension methods
  27. Creating an If Tag Helper to conditionally render content
  28. Converting web.config files to appsettings.json with a .NET Core global tool
  29. Adding validation to strongly typed configuration objects in ASP.NET Core
  30. Building .NET Framework ASP.NET Core apps on Linux using Mono and the .NET CLI
  31. Building ASP.NET Core apps on both Windows and Linux using AppVeyor
  32. Writing logs to Elasticsearch with Fluentd using Serilog in ASP.NET Core
  33. Suppressing the startup and shutdown messages in ASP.NET Core
  34. Exploring the .NET Core 2.1 Docker files (updated): dotnet:runtime vs aspnetcore-runtime vs sdk
  35. Pushing NuGet packages built in Docker by running the container
  36. Setting ASP.NET Core version numbers for a Docker ONBUILD builder image
  37. Creating NuGet packages in Docker using the .NET Core CLI
  38. Version vs VersionSuffix vs PackageVersion: What do they all mean?
  39. Creating a generalised Docker image for building ASP.NET Core apps using ONBUILD
  40. Optimising ASP.NET Core apps in Docker - avoiding manually copying csproj files (Part 2)
  41. Using an IActionFilter to read action method parameter values in ASP.NET Core MVC
  42. Implementing custom token providers for passwordless authentication in ASP.NET Core Identity
  43. Creating a .NET Core global CLI tool for squashing images with the TinyPNG API
  44. How to create a Helm chart repository using Amazon S3
  45. Exploring the Microsoft.AspNetCore.App shared framework in ASP.NET Core 2.1 (preview 1)
  46. Fixing Nginx "upstream sent too big header" error when running an ingress controller in Kubernetes
  47. ASP.NET Core in Action - Filters
  48. Coming in ASP.NET Core 2.1 - top-level MVC parameter validation
  49. Gotchas upgrading from IdentityServer 3 to IdentityServer 4
  50. Optimising ASP.NET Core apps in Docker - avoiding manually copying csproj files
  51. Sharing appsettings.json configuration files between projects in ASP.NET Core
  52. ASP.NET Core in Action - MVC in ASP.NET Core
  53. Including linked files from outside the project directory in ASP.NET Core
  54. Creating GitHub pull requests from the command-line with Hub
  55. Handy Docker commands for local development - Part 2
  56. Handy Docker commands for local development - Part 1
  57. Exploring the .NET Core Docker files: dotnet vs aspnetcore vs aspnetcore-build

2017 66

  1. ASP.NET Core in Action - What is middleware?
  2. Building ASP.NET Core apps using Cake in Docker
  3. Creating a .NET Standard Roslyn Analyzer in Visual Studio 2017
  4. Using Docker Hub to automatically build a Docker image for ASP.NET Core apps
  5. Home, home on the range: Installing Kubernetes using Rancher 2.0
  6. Creating strongly typed xUnit theory test data with TheoryData
  7. Creating a custom xUnit theory test DataAttribute to load data from JSON files
  8. Creating parameterised tests in xUnit with [InlineData], [ClassData], and [MemberData]
  9. Fixing the error "Program has more than one entry point defined" for console apps containing xUnit tests
  10. Migrating passwords in ASP.NET Core Identity with a custom PasswordHasher
  11. Exploring the ASP.NET Core Identity PasswordHasher
  12. Free .NET Core eBook, including ASP.NET Core and EF Core
  13. Running tests with dotnet xunit using Cake
  14. Debugging JWT validation problems between an OWIN app and IdentityServer4
  15. Creating and trusting a self-signed certificate on Linux for use in Kestrel and ASP.NET Core
  16. Using anonymous types and tuples to attach correlation IDs to scope state with Serilog and Seq in ASP.NET Core
  17. Creating an extension method for attaching key-value pairs to scope state using ASP.NET Core
  18. How to include scopes when logging exceptions in ASP.NET Core
  19. Creating a rolling file logging provider for ASP.NET Core 2.0
  20. Aligning strings within string.Format and interpolated strings
  21. Using CancellationTokens in ASP.NET Core MVC controllers
  22. The SDK 'Microsoft.Net.Sdk.Web' specified could not be found
  23. Introduction to the ApiExplorer in ASP.NET Core
  24. How to format response data as XML or JSON, based on the request URL in ASP.NET Core
  25. Customising ASP.NET Core Identity EF Core naming conventions for PostgreSQL
  26. Building ASP.NET Core 2.0 preview 2 packages on AppVeyor
  27. Creating a validator to check for common passwords in ASP.NET Core Identity
  28. Creating custom password validators for ASP.NET Core Identity
  29. Localising the DisplayAttribute in ASP.NET Core 1.1
  30. When you use the Polly circuit-breaker, make sure you share your Policy instances!
  31. Controller activation and dependency injection in ASP.NET Core MVC
  32. Four ways to dispose IDisposables in ASP.NET Core
  33. Automatically validating anti-forgery tokens in ASP.NET Core with the AutoValidateAntiforgeryTokenAttribute
  34. Defining custom logging messages with LoggerMessage.Define in ASP.NET Core
  35. Using ImageSharp to resize images in ASP.NET Core - Part 4: saving to disk
  36. The Microsoft.AspNetCore.All metapackage is huge, and that's awesome, thanks to the .NET Core runtime store
  37. How to use multiple hosting environments on the same machine in ASP.NET Core
  38. Using Razor Pages to simplify basic actions in ASP.NET Core 2.0 preview 1
  39. Exploring Program.cs, Startup.cs and CreateDefaultBuilder in ASP.NET Core 2 preview 1
  40. The .NET Core 2.0 Preview 1, version numbers and global.json
  41. Using ImageSharp to resize images in ASP.NET Core - Part 3: caching
  42. Using ImageSharp to resize images in ASP.NET Core - Part 2
  43. Using ImageSharp to resize images in ASP.NET Core - a comparison with CoreCompat.System.Drawing
  44. Creating a basic Web API template using dotnet new custom templates
  45. Removing the MVC Razor dependencies from the Web API template in ASP.NET Core
  46. Creating and editing solution files with the .NET CLI
  47. Getting started with ASP.NET Core
  48. Image credits
  49. Adding favicons to your ASP.NET Core website with Real Favicon Generator
  50. Retrieving the path that generated an error with the StatusCodePages Middleware
  51. Re-execute the middleware pipeline with the StatusCodePages Middleware to create custom error pages
  52. Deconstructors for non-tuple types in C# 7.0
  53. Preventing mass assignment or over posting in ASP.NET Core
  54. Git integration improvements in Visual Studio 2017 - git-hooks
  55. What is the NETStandard.Library metapackage?
  56. What is the Microsoft.AspNetCore metapackage?
  57. Supporting both LTS and Current releases for ASP.NET Core
  58. Using routing DataTokens in ASP.NET Core
  59. Under the hood of the Middleware Analysis package
  60. Understanding your middleware pipeline with the Middleware Analysis package
  61. Exploring IStartupFilter in ASP.NET Core
  62. Logging using DiagnosticSource in ASP.NET Core
  63. Reloading strongly typed options in ASP.NET Core 1.1.0
  64. How to pass parameters to a view component
  65. An introduction to ViewComponents - a login status view component
  66. Understanding and updating package versions for .NET Core 1.0.3

2016 50

  1. Redirecting unknown cultures when using the url culture provider: Adding a URL culture provider using middleware as filters - Part 5
  2. Using a culture constraint and redirecting 404s with the url culture provider: Adding a URL culture provider using middleware as filters - Part 4
  3. Applying the RouteDataRequest CultureProvider globally with middleware as filters: Adding a URL culture provider using middleware as filters - Part 3
  4. Url culture provider using middleware as filters in ASP.NET Core 1.1.0: Adding a URL culture provider using middleware as filters - Part 2
  5. Exploring Middleware as MVC Filters in ASP.NET Core 1.1: Adding a URL culture provider using middleware as filters - Part 1
  6. Troubleshooting ASP.NET Core 1.1.0 install problems
  7. Making ConcurrentDictionary GetOrAdd thread safe using Lazy
  8. Fixing a bug: when concatenated strings turn into numbers in JavaScript
  9. Using dependency injection in a .Net Core console application
  10. Adding Cache-Control headers to Static Files in ASP.NET Core
  11. Accessing services when configuring MvcOptions in ASP.NET Core
  12. Resource-based authorisation in ASP.NET Core
  13. Modifying the UI based on user authorisation in ASP.NET Core
  14. Custom authorisation policies and requirements in ASP.NET Core
  15. Introduction to Authorisation in ASP.NET Core
  16. Injecting services into ValidationAttributes in ASP.NET Core
  17. Localising the DisplayAttribute and avoiding magic strings in ASP.NET Core
  18. How to use machine-specific configuration with ASP.NET Core
  19. Adding Localisation to an ASP.NET Core application
  20. Viewing what's changed in ASP.NET Core 1.0.1
  21. HTML minification using WebMarkupMin in ASP.NET Core
  22. Configuring environment specific services in ASP.NET Core - Part 2
  23. Configuring environment specific services for dependency injection in ASP.NET Core
  24. An introduction to OpenID Connect in ASP.NET Core
  25. POST-REDIRECT-GET using TempData in ASP.NET Core
  26. An introduction to OAuth 2.0 using Facebook in ASP.NET Core
  27. An introduction to Session storage in ASP.NET Core
  28. A look behind the JWT bearer authentication middleware in ASP.NET Core
  29. How to set the hosting environment in ASP.NET Core
  30. Access services inside ConfigureServices using IConfigureOptions in ASP.NET Core
  31. Exploring the cookie authentication middleware in ASP.NET Core
  32. Introduction to Authentication with ASP.NET Core
  33. Forking the pipeline - adding tenant-specific files with SaasKit in ASP.NET Core
  34. Loading tenants from the database with SaasKit - Part 2, Caching
  35. Loading tenants from the database with SaasKit in ASP.NET Core
  36. Adding EF Core and PostgreSQL to an ASP.NET Core project on OS X
  37. How to configure urls for Kestrel, WebListener and IIS express in ASP.NET Core
  38. Getting started with StructureMap in ASP.NET Core
  39. Reloading strongly typed Options on file changes in ASP.NET Core RC2
  40. Creating a custom ConfigurationProvider in ASP.NET Core to parse YAML
  41. Adding Travis CI builds to a .NET Core app
  42. Publishing your first .NET Core NuGet package with AppVeyor and MyGet
  43. Introduction to integration testing with xUnit and TestServer in ASP.NET Core
  44. Use project.lock.json to troubleshoot dotnet restore problems
  45. A deep dive into the ASP.NET Core CORS library
  46. How to use the IOptions pattern for configuration in ASP.NET Core RC2
  47. How to add default security headers in ASP.NET Core using custom middleware
  48. Model binding JSON POSTs in ASP.NET Core
  49. Understanding .NET Core, NETStandard, .NET Core applications and ASP.NET Core
  50. Starting a blog to get yourself noticed