Andrew Lock
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
- An introduction to Compact Binary Object Representation (CBOR) in .NET
- Stripping extra dependencies in .NET NativeAOT apps using linker substitutions
- Experimental support for Device Bound Session Credentials (DBSC) in ASP.NET Core: Exploring the .NET 11 preview - Part 8
- Understanding Device Bound Session Credentials (DBSC)
- The pain of serializing unions and closed class hierarchies with System.Text.Json: Exploring the .NET 11 preview - Part 7
- Finding the total number of processors on a machine with .NET
- Automatic CSRF protection based on Fetch Metadata headers: Exploring the .NET 11 preview - Part 6
- Understanding the Fetch Metadata HTTP headers: Sec-Fetch-Site and friends
- Improvements to reading Process outputs: Exploring the .NET 11 preview - Part 5
- Closed class hierarchies: Exploring the .NET 11 preview - Part 4
- Avoiding ToString() allocations with StringBuilder.MoveChunks: Exploring the .NET 11 preview - Part 3
- .NET (OK, C#) finally gets union types🎉: Exploring the .NET 11 preview - Part 2
- Running background tasks in Blazor with Web Workers: Exploring the .NET 11 preview - Part 1
- New features in Git 2.54: easier rebasing, hooks, and statistics
- Removing byte[] allocations in .NET Framework using ReadOnlySpan
- Running AI agents with customized templates using docker sandbox
- Running AI agents safely in a microVM using docker sandbox
- Configuring contextual options with Microsoft.Extensions.Options.Contextual
- Splitting the NetEscapades.EnumGenerators packages: the road to a stable release
- Recording metrics in-process using MeterListener: System.Diagnostics.Metrics APIs - Part 4
- Creating standard and "observable" instruments: System.Diagnostics.Metrics APIs - Part 3
- Exploring the (underwhelming) System.Diagnostics.Metrics source generators: System.Diagnostics.Metrics APIs - Part 2
- Creating and consuming metrics with System.Diagnostics.Metrics APIs: System.Diagnostics.Metrics APIs - Part 1
- Making foreach on an IEnumerable allocation-free using reflection and dynamic methods
- The Windows File Explorer replacement, File Pilot, is awesome
- Recent updates to NetEscapades.EnumGenerators: new APIs and System.Memory support
2025 47
- Creating a .NET CLR profiler using C# and NativeAOT with Silhouette
- Trying out the Zed editor on Windows for .NET and Markdown
- Recent updates to NetEscapades.EnumGenerators: [EnumMember] support, analyzers, and bug fixes
- Exploring the .NET boot process via host tracing
- Companies complaining .NET moves too fast should just pay for post-EOL support
- Easier reflection with [UnsafeAccessorType] in .NET 10: Exploring the .NET 10 preview - Part 9
- Understanding the worst .NET vulnerability ever: request smuggling and CVE-2025-55315
- Adding metadata to fallback endpoints in ASP.NET Core
- Publishing NuGet packages from GitHub actions the easy way with Trusted Publishing
- sleep-pc: a .NET Native AOT tool to make Windows sleep after a timeout
- Supporting platform-specific .NET tools on old .NET SDKs: Exploring the .NET 10 preview - Part 8
- Packaging self-contained and native AOT .NET tools for NuGet: Exploring the .NET 10 preview - Part 7
- Using and authoring .NET tools
- Fixing an old .NET Core native library loading issue on Alpine
- Converting an xUnit test project to TUnit
- Running .NET in the browser without Blazor
- Passkey support for ASP.NET Core identity: Exploring the .NET 10 preview - Part 6
- Running one-off .NET tools with dnx: Exploring the .NET 10 preview - Part 5
- Solving the source generator 'marker attribute' problem in .NET 10: Exploring the .NET 10 preview - Part 4
- C# 14 extension members; AKA extension everything: Exploring the .NET 10 preview - Part 3
- Behind the scenes of dotnet run app.cs: Exploring the .NET 10 preview - Part 2
- Exploring the features of dotnet run app.cs: Exploring the .NET 10 preview - Part 1
- Working with stacked branches in git (Part 2)
- Working with stacked branches in git (Part 1)
- Converting a Microsoft XNA 3.1 game to MonoGame
- Creating your first sample game with MonoGame
- Converting a docker-compose file to .NET Aspire
- Pushing a whole stack of branches with a single Git command
- Using the new AI template to create a chatbot about a website
- Exploring the new AI chat template
- Creating a 'pooled' dependency injection lifetime
- Going beyond singleton, scoped, and transient lifetimes—tenant, pooled, and drifter
- NetEscapades.AspNetCore.SecurityHeaders 1.0.0 has been released
- Verifying tricky git rebases with git range-diff
- Creating SBOM attestations in GitHub Actions
- Creating a software bill of materials (SBOM) for an open-source NuGet package
- Creating provenance attestations for NuGet packages in GitHub Actions
- Running an ASP.NET Core app inside IIS in a Windows container
- Creating an analyzer to detect infinite loops caused by ThreadAbortExceptions
- Disabling localized satellite assemblies during dotnet publish
- Setting application environment variables in IIS without restarts
- Preventing client-side cross-site-scripting vulnerabilities with Trusted Types
- Supporting multiple .NET SDK versions in a source generator: Creating a source generator - Part 14
- Supporting multiple .NET SDK versions in analyzers and source generators
- Accessing MSBuild properties and user configuration from source generators: Creating a source generator - Part 13
- Reading compilation options and the C# version in source generators: Creating a source generator - Part 12
- Implementing an interceptor with a source generator: Creating a source generator - Part 11
2024 45
- Building LaTeX projects on Windows easily with Docker
- Using the YamlDotNet source generator for Native AOT
- Cross-Origin-Embedder-Policy: securing embedded resources: Understanding cross-origin security headers - Part 3
- Cross-Origin-Resource-Policy: preventing hotlinking and XSSI attacks: Understanding cross-origin security headers - Part 2
- Cross-Origin-Opener-Policy: preventing attacks from popups: Understanding cross-origin security headers - Part 1
- Recent updates for NetEscapades.EnumGenerators: interceptors!
- Is the result pattern worth it?: Working with the result pattern - Part 4
- Adding more extensions to Result<T>: Working with the result pattern - Part 3
- Safety and simplicity with LINQ: Working with the result pattern - Part 2
- Replacing Exceptions-as-flow-control with the result pattern: Working with the result pattern - Part 1
- Major updates to NetEscapades.AspNetCore.SecurityHeaders
- Fixing MAX_PATH issues in GitLab
- Preventing breaking changes in public APIs with PublicApiGenerator
- Working with tar files in .NET 8
- Using Azure Storage Queue messages with Azure Functions and [QueueTrigger]
- Avoiding CDN supply-chain attacks with Subresource Integrity (SRI)
- Combining multiple docker images into a multi-arch image
- Simplifying [Theory] test data with Xunit.Combinatorial
- Creating source-only NuGet packages
- Disambiguating types with the same name with extern alias
- Adding support for collection expressions to your own types: Behind the scenes of collection expressions - Part 5
- Exploring the generated code: the spread element: Behind the scenes of collection expressions - Part 4
- Exploring the generated code: T[], Span<T>, and Immutable collections: Behind the scenes of collection expressions - Part 3
- Exploring the generated code: List<T> and fallback cases: Behind the scenes of collection expressions - Part 2
- Introducing collection expressions in C#12: Behind the scenes of collection expressions - Part 1
- Conditionally skipping a trigger job in GitLab based on a previous job
- Blocking primary constructor member capture using a Roslyn Analyzer
- Thoughts about primary constructors: 3 pros and 5 cons
- An introduction to primary constructors in C#12
- Creating a .NET AsciiMath parser and using it in a Markdig extension
- Hacking together an AsciiMath parser for .NET
- Rendering Math in HTML: MathML, MathML Core, and AsciiMath
- Syncing a git branch between Windows and WSL filesystems
- Implementing Dijkstra's algorithm for finding the shortest path between two nodes using PriorityQueue in .NET 9
- Behind the implementation of .NET's PriorityQueue
- An introduction to the heap data structure and .NET's priority queue
- Using Unix domain sockets with ASP.NET Core and HttpClient
- Using named pipes with ASP.NET Core and HttpClient
- 8 ways to set the URLs for an ASP.NET Core app
- Using default interface methods for performance gains in IHeaderDictionary
- Understanding C# 8 default interface methods
- Testing your incremental generator pipeline outputs are cacheable: Creating a source generator - Part 10
- Avoiding performance pitfalls in incremental generators: Creating a source generator - Part 9
- A brief look at StringValues
- Backing up files to Azure blob storage with azcopy
2023 44
- Updates to the StronglyTypedId library - simplification, templating, and CodeFixes: Using strongly-typed entity IDs to avoid primitive obsession - Part 8
- Redacting sensitive data in logs with Microsoft.Extensions.Compliance.Redaction
- Enriching logs with [TagProvider] and ILogEnricher
- Behind [LogProperties] and the new telemetry logging source generator
- A failed experiment with interceptors in C# 12 and .NET 8
- Reading JSON and binary data from multipart/form-data sections in ASP.NET Core
- Avoiding flaky tests with TimeProvider and ITimer: Exploring the .NET 8 preview - Part 12
- Short-circuit routing in .NET 8: Exploring the .NET 8 preview - Part 11
- Updates to Docker images in .NET 8: Exploring the .NET 8 preview - Part 10
- Rendering Blazor components to a string: Exploring the .NET 8 preview - Part 9
- Can you use the .NET 8 Identity API endpoints with IdentityServer?
- Should you use the .NET 8 Identity API endpoints?
- Introducing the Identity API endpoints: Exploring the .NET 8 preview - Part 8
- Form binding in minimal APIs: Exploring the .NET 8 preview - Part 7
- Last chance to win a ticket to APIDays London with my new book!
- Keyed service dependency injection container support: Exploring the .NET 8 preview - Part 6
- ASP.NET Core in Action, Third Edition is now in print
- Replacing method calls with Interceptors: Exploring the .NET 8 preview - Part 5
- Exploring the new minimal API source generator: Exploring the .NET 8 preview - Part 4
- Comparing WebApplication.CreateBuilder() to the new CreateSlimBuilder() method: Exploring the .NET 8 preview - Part 3
- The minimal API AOT compilation template: Exploring the .NET 8 preview - Part 2
- Using the new configuration binder source generator: Exploring the .NET 8 preview - Part 1
- Validating nested DataAnnotation IOptions recursively with MiniValidation
- Supporting legacy browsers and SameSite cookies without UserAgent sniffing in ASP.NET Core.
- Understanding SameSite cookies
- Making authenticated cross-origin requests with ASP.NET Core Identity
- Using Octokit.GraphQL to interact with the GitHub discussions API
- Migrating comments from Disqus to giscus
- Super-charging 'git rebase' with 'git absorb'
- Smoother rebases with auto-squashing Git commits
- Adding client-side validation to ASP.NET Core, without jQuery or unobtrusive validation
- Understanding the .NET ecosystem: The introduction of .NET Standard
- Understanding the .NET ecosystem: The evolution of .NET into .NET 7
- Working with Git in JetBrains Rider
- Drawing graphs in GitHub comments with Mermaid diagrams
- Customising the RequestDelegate with filters: Behind the scenes of minimal APIs - Part 8
- Building the final RequestDelegate: Behind the scenes of minimal APIs - Part 7
- Thoughts on 'What is .NET, and why should you choose it?'
- Generating the response writing expression for RequestDelegate: Behind the scenes of minimal APIs - Part 6
- Generating argument expressions for minimal APIs (continued): Behind the scenes of minimal APIs - Part 5
- Generating argument expressions for minimal APIs: Behind the scenes of minimal APIs - Part 4
- Exploring the model-binding logic of minimal APIs: Behind the scenes of minimal APIs - Part 3
- Extracting metadata from a minimal API handler: Behind the scenes of minimal APIs - Part 2
- A first look behind the scenes of minimal API endpoints: Behind the scenes of minimal APIs - Part 1
2022 41
- ASP.NET Core in Action, Version 3 update
- 5 new MVC features in .NET 7
- The dangers and gotchas of using scoped services in OptionsBuilder
- Working with stacked branches in Git is easier with --update-refs
- Fighting with nullable reference types in Razor Pages
- Adding validation to strongly typed configuration objects using FluentValidation
- Adding validation to strongly typed configuration objects in .NET 6
- ASP.NET Core in Action, version 3, is now available
- Counting the leading zeroes in a binary number with C#
- Working with System.Random and threads safely in .NET Core and .NET Framework
- Using CancellationTokens in ASP.NET Core minimal APIs
- Handling concurrent merges to master in multi-stage Azure DevOps pipelines
- Replacing Disqus with GitHub discussions using giscus
- Considering replacing Disqus with Giscus
- Adding content negotiation to minimal APIs with Carter
- Returning XML from minimal APIs in .NET 6
- Understanding your middleware pipeline in .NET 6 with the Middleware Analysis package
- Consuming anonymous types with DiagnosticListener in .NET 6
- A brief introduction to DiagnosticSource
- Using PathBase with .NET 6's WebApplicationBuilder
- Understanding PathBase in ASP.NET Core
- Reducing the size of a git repository with git-replace
- Rewriting git history simply with git-filter-repo
- Testing ASP.NET Core gRPC services in JetBrains Rider
- Generating sortable Guids using NewId
- Why isn't my ASP.NET Core app in Docker working?
- Running JavaScript inside a .NET app with JavaScriptEngineSwitcher
- Keeping up with .NET: learning about new features and APIs
- Working on two git branches at once with git worktree
- Tracking down a hanging xUnit test in CI: building a custom Test Framework
- Just because you stopped waiting for it, doesn't mean the Task stopped running
- A deep-dive into the new Task.WaitAsync() API in .NET 6
- Cancelling await calls in .NET 6 with Task.WaitAsync()
- Please stop lying about .NET Standard 2.0 support!
- Waiting for your ASP.NET Core app to be ready from an IHostedService in .NET 6
- NetEscapades.EnumGenerators: a source generator for enum performance
- Solving the source generator 'marker attribute' problem - Part 2: Creating a source generator - Part 8
- Solving the source generator 'marker attribute' problem - Part 1: Creating a source generator - Part 7
- Saving source generator output in source control: Creating a source generator - Part 6
- Finding a type declaration's namespace and type hierarchy: Creating a source generator - Part 5
- Customising generated code with marker attributes: Creating a source generator - Part 4
2021 51
- Integration testing and NuGet packaging: Creating a source generator - Part 3
- Testing an incremental generator with snapshot testing: Creating a source generator - Part 2
- Creating an incremental generator: Creating a source generator - Part 1
- Upgrading a .NET 5 "Startup-based" app to .NET 6: Exploring .NET 6 - Part 12
- [CallerArgumentExpression] and throw helpers: Exploring .NET 6 - Part 11
- New dependency injection features in .NET 6: Exploring .NET 6 - Part 10
- Source generator updates: incremental generators: Exploring .NET 6 - Part 9
- Improving logging performance with source generators: Exploring .NET 6 - Part 8
- Analyzers for ASP.NET Core in .NET 6: Exploring .NET 6 - Part 7
- Supporting integration tests with WebApplicationFactory in .NET 6: Exploring .NET 6 - Part 6
- Supporting EF Core migrations with WebApplicationBuilder: Exploring .NET 6 - Part 5
- Building a middleware pipeline with WebApplication: Exploring .NET 6 - Part 4
- Exploring the code behind WebApplicationBuilder: Exploring .NET 6 - Part 3
- Comparing WebApplicationBuilder to the Generic Host: Exploring .NET 6 - Part 2
- Looking inside ConfigurationManager in .NET 6: Exploring .NET 6 - Part 1
- Using Source Generators with Blazor components in .NET 6
- Downloading artifacts from Azure DevOps using .NET
- Rebuilding StronglyTypedId as a source generator - 1.0.0-beta release: Using strongly-typed entity IDs to avoid primitive obsession - Part 7
- ValueStringBuilder: a stack-based string-builder: A deep dive on StringBuilder - Part 6
- Reducing allocations by caching with StringBuilderCache: A deep dive on StringBuilder - Part 5
- Inserting and removing characters: A deep dive on StringBuilder - Part 4
- Converting chunks to a string with ToString(): A deep dive on StringBuilder - Part 3
- Appending strings, built-in types, and lists: A deep dive on StringBuilder - Part 2
- The overall design and a first look at the internals: A deep dive on StringBuilder - Part 1
- Adding authentication to a Blazor Server app using Auth0
- Conditional compilation for ignoring method calls with the ConditionalAttribute
- Using SSH and localhost.run to test GitHub webhooks locally
- Creating Docker multi-arch images for ARM64 from Windows
- Exploring .NET interactive notebooks with VS Code
- Benchmarking 4 reflection methods for calling a constructor in .NET
- How to stop Visual Studio from creating launchsettings.json
- Extending the calculator implementation: Creating a Simple Moving Average calculator in C# - Part 3
- Making the calculator thread-safe: Creating a Simple Moving Average calculator in C# - Part 2
- A Simple Moving Average calculator: Creating a Simple Moving Average calculator in C# - Part 1
- Trying out the open-source eCommerce platform nopCommerce using Docker
- Fixing build warning NETSSDK1138 when building projects with end-of-life .NET frameworks
- Viewing overwritten configuration values in ASP.NET Core
- ASP.NET Core in Action, Second Edition is available now!
- Viewing app configuration using Oakton's Describe command and Spectre.Console
- Debugging configuration values in ASP.NET Core
- Running Kubernetes and the dashboard with Docker Desktop
- Installing Docker Desktop for Windows and WSL 2
- Configuring HTTPS using a custom TLS certificate with Netlify and Cloudflare
- Using source generators with a custom attribute to generate a menu component in a Blazor app
- Using source generators to generate a menu component in a Blazor app
- Using source generators to find all routable components in a Blazor WebAssembly app
- Finding all routable components in a Blazor App
- Prerendering a Blazor WebAssembly app to static files, without an ASP.NET Core host app
- Enabling prerendering for Blazor WebAssembly apps
- An introduction to the Data Protection system in ASP.NET Core
- Auto-assigning issues using a GitHub Action: Creating my first GitHub app with Probot - Part 4
2020 50
- Should I use self-contained or framework-dependent publishing in Docker images?
- Using action results and content negotiation with "route-to-code" APIs
- Using Quartz.NET with ASP.NET Core and worker services
- Applying the MVC design pattern to Razor Pages
- Tips, tricks, and edge cases: Deploying ASP.NET Core applications to Kubernetes - Part 12
- Avoiding downtime in rolling deployments by blocking SIGTERM: Deploying ASP.NET Core applications to Kubernetes - Part 11
- Creating an 'exec-host' deployment for running one-off commands: Deploying ASP.NET Core applications to Kubernetes - Part 10
- Monitoring Helm releases that use jobs and init containers: Deploying ASP.NET Core applications to Kubernetes - Part 9
- Running database migrations using jobs and init containers: Deploying ASP.NET Core applications to Kubernetes - Part 8
- Running database migrations when deploying to Kubernetes: Deploying ASP.NET Core applications to Kubernetes - Part 7
- Adding health checks with Liveness, Readiness, and Startup probes: Deploying ASP.NET Core applications to Kubernetes - Part 6
- Setting environment variables for ASP.NET Core apps in a Helm chart: Deploying ASP.NET Core applications to Kubernetes - Part 5
- Creating a Helm chart for an ASP.NET Core app: Deploying ASP.NET Core applications to Kubernetes - Part 4
- An introduction to deploying applications with Helm: Deploying ASP.NET Core applications to Kubernetes - Part 3
- Configuring resources with YAML manifests: Deploying ASP.NET Core applications to Kubernetes - Part 2
- An Introduction to Kubernetes: Deploying ASP.NET Core applications to Kubernetes - Part 1
- Should you unit-test API/MVC controllers in ASP.NET Core?
- Controlling IHostedService execution order in ASP.NET Core 3.x
- DI scopes in IHttpClientFactory message handlers don't work like you think they do
- Exploring the code behind IHttpClientFactory in depth
- Detecting duplicate routes in ASP.NET Core: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 5
- Creating a custom endpoint visualization graph: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 4
- Creating a custom DfaGraphWriter using ImpromptuInterface for easier reflection: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 3
- Adding an endpoint graph to your ASP.NET Core application: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 2
- Visualizing endpoints using the DOT language: Visualizing ASP.NET Core 3.0 endpoints using GraphvizOnline - Part 1
- Getting started with ASP.NET Core
- Adding host filtering to Kestrel in ASP.NET Core
- Setting global authorization policies using the DefaultPolicy and the FallbackPolicy in ASP.NET Core 3.x
- Customising the ASP.NET Core default UI without editing the PageModels
- Strongly-typed ID update 0.2.1: Using strongly-typed entity IDs to avoid primitive obsession - Part 6
- Handling Web API Exceptions with ProblemDetails middleware
- Extending the shutdown timeout setting to ensure graceful IHostedService shutdown
- Using jQuery and Bootstrap from a CDN with fallback scripts in ASP.NET Core 3.0
- Preventing mass assignment or over posting with Razor Pages in ASP.NET Core
- Adding simple email address obfuscation for your blog like Cloudflare Scrape Shield
- How to automatically choose a free port in ASP.NET Core 3.0
- 5 ways to set the URLs for an ASP.NET Core app
- Accessing route values in endpoint middleware in ASP.NET Core 3.0
- Replacing AJAX calls in Razor Pages with Razor Components and Blazor
- Don't replace your View Components with Razor Components
- How to fix the order of commits in GitHub Pull Requests
- Creating a custom ErrorHandlerMiddleware function
- When ASP.NET Core can't find your controller: debugging application parts
- Exploring the new rollForward and allowPrerelease settings in global.json: Exploring ASP.NET Core 3.0 - Part 8
- Creating an endpoint from multiple middleware in ASP.NET Core 3.x
- Inserting middleware between UseRouting() and UseEndpoints() as a library author - Part 2
- Inserting middleware between UseRouting() and UseEndpoints() as a library author - Part 1
- Excluding health check endpoints from Serilog request logging: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 4
- Logging MVC properties with Serilog.AspNetCore: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 3
- Logging the selected Endpoint Name with Serilog: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 2
2019 57
- Reducing log verbosity with Serilog RequestLogging: Using Serilog.AspNetCore in ASP.NET Core 3.0 - Part 1
- A Quantum Random Number Generator for .NET: The quantum measurement problem and many-worlds approach
- .NET Core, Docker, and Cultures - Solving a culture issue porting a .NET Core app from Windows to Linux
- Converting integration tests to .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 5
- Converting a terminal middleware to endpoint routing in ASP.NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 4
- Avoiding Startup service injection in ASP.NET Core 3: Upgrading to ASP.NET Core 3.0 - Part 3
- IHostingEnvironment vs IHostEnvironment - obsolete types in .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 2
- Converting a .NET Standard 2.0 library to .NET Core 3.0: Upgrading to ASP.NET Core 3.0 - Part 1
- Simplifying the Cake global tool bootstrapper scripts with .NET Core 3 local tools
- New in .NET Core 3.0: local tools: Exploring ASP.NET Core 3.0 - Part 7
- Running .NET Core global tools in non-sdk Docker images
- Packaging CLI programs into Docker images to avoid dependency hell
- New in ASP.NET Core 3.0: structured logging for startup messages: Exploring ASP.NET Core 3.0 - Part 6
- Introducing IHostLifetime and untangling the Generic Host startup interactions: Exploring ASP.NET Core 3.0 - Part 5
- Running async tasks on app startup in ASP.NET Core 3.0: Exploring ASP.NET Core 3.0 - Part 4
- New in ASP.NET Core 3: Service provider validation: Exploring ASP.NET Core 3.0 - Part 3
- Comparing Startup.cs between the ASP.NET Core 3.0 templates: Exploring ASP.NET Core 3.0 - Part 2
- Exploring the new project file, Program.cs, and the generic host: Exploring ASP.NET Core 3.0 - Part 1
- Making my first contribution on SourceForge using Mercurial
- A bootstrapper script for the Cake .NET Core Global Tool on Alpine using ash
- A bootstrapper script for the Cake .NET Core Global Tool on Windows
- How to build with Cake on Linux using Cake.CoreCLR or the Cake global tool
- Using the ReferenceAssemblies NuGet package to build .NET Framework libraries on Linux, without installing Mono
- Alternatives to Microsoft.FeatureManagement: Adding feature flags to an ASP.NET Core app - Part 6
- Generating strongly-typed IDs at build-time with Roslyn: Using strongly-typed entity IDs to avoid primitive obsession - Part 5
- Exploring Raygun's new application performance monitoring tool for .NET Core
- Verifying phone number ownership with Twilio Verify API v2 using ASP.NET Core Identity and Razor Pages
- Ensuring consistent feature flags across requests: Adding feature flags to an ASP.NET Core app - Part 5
- Creating a custom feature filter: Adding feature flags to an ASP.NET Core app - Part 4
- Creating dynamic feature flags with feature filters: Adding feature flags to an ASP.NET Core app - Part 3
- Filtering action methods with feature flags: Adding feature flags to an ASP.NET Core app - Part 2
- Introducing Microsoft.FeatureManagement: Adding feature flags to an ASP.NET Core app - Part 1
- Serializing a PascalCase Newtonsoft.Json JObject to camelCase
- Using scoped services inside a Quartz.NET hosted service with ASP.NET Core
- Creating a Quartz.NET hosted service with ASP.NET Core
- Verifying phone number ownership with Twilio using ASP.NET Core Identity and Razor Pages
- Safely migrating passwords in ASP.NET Core Identity with a custom PasswordHasher
- Validating phone numbers with Twilio using ASP.NET Core Identity and Razor Pages
- Strongly-typed IDs in EF Core (Revisited): Using strongly-typed entity IDs to avoid primitive obsession - Part 4
- Using strongly-typed entity IDs with EF Core: Using strongly-typed entity IDs to avoid primitive obsession - Part 3
- Adding JSON converters to strongly typed IDs: Using strongly-typed entity IDs to avoid primitive obsession - Part 2
- An introduction to strongly-typed entity IDs: Using strongly-typed entity IDs to avoid primitive obsession - Part 1
- Using Lambda@Edge to handle Angular client-side routing with S3 and CloudFront
- Exploring the .NET Core MCR Docker files (updated): runtime vs aspnet vs sdk
- Creating my first Azure Functions v2.0 app: a WebHook and a timer
- Creating a not-empty GUID validation attribute and a not-default validation attribute
- Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies
- Deploying a GitHub app to Glitch: Creating my first GitHub app with Probot - Part 3
- Creating the auto-assign-issues bot: Creating my first GitHub app with Probot - Part 2
- Creating a GitHub app with create-probot-app: Creating my first GitHub app with Probot - Part 1
- An introduction to ASP.NET Core Razor Pages
- Reducing initial request latency by pre-building services in a startup task in ASP.NET Core
- Using health checks to run async tasks in ASP.NET Core: Running async tasks on app startup in ASP.NET Core - Part 4
- Feedback on async task examples and another possible solution: Running async tasks on app startup in ASP.NET Core - Part 3
- Two approaches for running async tasks: Running async tasks on app startup in ASP.NET Core - Part 2
- Built in options for running async tasks: Running async tasks on app startup in ASP.NET Core - Part 1
- Using dependency injection with Twilio SMS and ASP.NET Core 2.1
2018 57
- Creating an AWS policy for calling the SES mailbox simulator from CodeBuild
- Creating a git repo with Azure Repos and trying out Git LFS
- Dark mode now available!
- Why is string.GetHashCode() different each time I run my program in .NET Core?
- Secure secrets storage for ASP.NET Core with AWS Secrets Manager (Part 2)
- Secure secrets storage for ASP.NET Core with AWS Secrets Manager (Part 1)
- Caching Docker layers on serverless build hosts with multi-stage builds, --target, and --cache-from
- Generating .editorconfig files automatically using IntelliCode
- Creating singleton named options with IOptionsMonitor
- Simplifying dependency injection for IConfigureOptions with the ConfigureOptions() helper
- Delaying strongly-typed options configuration using PostConfigure in ASP.NET Core
- Configuring named options using IConfigureNamedOptions and ConfigureAll
- The dangers and gotchas of using scoped services in IConfigureOptions
- Using multiple instances of strongly-typed settings with named options in .NET Core 2.x
- Building an open source GitHub project using Azure DevOps
- Creating an ASCII-art tree in C#
- Adding decorated classes to the ASP.NET Core DI container using Scrutor
- Using Scrutor to automatically register your services with the ASP.NET Core DI container
- How to register a service with multiple interfaces in ASP.NET Core DI
- The difference between GetService() and GetRequiredService() in ASP.NET Core
- Why isn't my ASP.NET Core environment-specific configuration loading?
- Running smoke tests for ASP.NET Core apps in CI using Docker
- Adding Segment client-side analytics to an ASP.NET Core application
- Using snake case column names with Dapper and PostgreSQL
- Adding Serilog to the ASP.NET Core Generic Host
- The ASP.NET Core Generic Host: namespace clashes and extension methods
- Creating an If Tag Helper to conditionally render content
- Converting web.config files to appsettings.json with a .NET Core global tool
- Adding validation to strongly typed configuration objects in ASP.NET Core
- Building .NET Framework ASP.NET Core apps on Linux using Mono and the .NET CLI
- Building ASP.NET Core apps on both Windows and Linux using AppVeyor
- Writing logs to Elasticsearch with Fluentd using Serilog in ASP.NET Core
- Suppressing the startup and shutdown messages in ASP.NET Core
- Exploring the .NET Core 2.1 Docker files (updated): dotnet:runtime vs aspnetcore-runtime vs sdk
- Pushing NuGet packages built in Docker by running the container
- Setting ASP.NET Core version numbers for a Docker ONBUILD builder image
- Creating NuGet packages in Docker using the .NET Core CLI
- Version vs VersionSuffix vs PackageVersion: What do they all mean?
- Creating a generalised Docker image for building ASP.NET Core apps using ONBUILD
- Optimising ASP.NET Core apps in Docker - avoiding manually copying csproj files (Part 2)
- Using an IActionFilter to read action method parameter values in ASP.NET Core MVC
- Implementing custom token providers for passwordless authentication in ASP.NET Core Identity
- Creating a .NET Core global CLI tool for squashing images with the TinyPNG API
- How to create a Helm chart repository using Amazon S3
- Exploring the Microsoft.AspNetCore.App shared framework in ASP.NET Core 2.1 (preview 1)
- Fixing Nginx "upstream sent too big header" error when running an ingress controller in Kubernetes
- ASP.NET Core in Action - Filters
- Coming in ASP.NET Core 2.1 - top-level MVC parameter validation
- Gotchas upgrading from IdentityServer 3 to IdentityServer 4
- Optimising ASP.NET Core apps in Docker - avoiding manually copying csproj files
- Sharing appsettings.json configuration files between projects in ASP.NET Core
- ASP.NET Core in Action - MVC in ASP.NET Core
- Including linked files from outside the project directory in ASP.NET Core
- Creating GitHub pull requests from the command-line with Hub
- Handy Docker commands for local development - Part 2
- Handy Docker commands for local development - Part 1
- Exploring the .NET Core Docker files: dotnet vs aspnetcore vs aspnetcore-build
2017 66
- ASP.NET Core in Action - What is middleware?
- Building ASP.NET Core apps using Cake in Docker
- Creating a .NET Standard Roslyn Analyzer in Visual Studio 2017
- Using Docker Hub to automatically build a Docker image for ASP.NET Core apps
- Home, home on the range: Installing Kubernetes using Rancher 2.0
- Creating strongly typed xUnit theory test data with TheoryData
- Creating a custom xUnit theory test DataAttribute to load data from JSON files
- Creating parameterised tests in xUnit with [InlineData], [ClassData], and [MemberData]
- Fixing the error "Program has more than one entry point defined" for console apps containing xUnit tests
- Migrating passwords in ASP.NET Core Identity with a custom PasswordHasher
- Exploring the ASP.NET Core Identity PasswordHasher
- Free .NET Core eBook, including ASP.NET Core and EF Core
- Running tests with dotnet xunit using Cake
- Debugging JWT validation problems between an OWIN app and IdentityServer4
- Creating and trusting a self-signed certificate on Linux for use in Kestrel and ASP.NET Core
- Using anonymous types and tuples to attach correlation IDs to scope state with Serilog and Seq in ASP.NET Core
- Creating an extension method for attaching key-value pairs to scope state using ASP.NET Core
- How to include scopes when logging exceptions in ASP.NET Core
- Creating a rolling file logging provider for ASP.NET Core 2.0
- Aligning strings within string.Format and interpolated strings
- Using CancellationTokens in ASP.NET Core MVC controllers
- The SDK 'Microsoft.Net.Sdk.Web' specified could not be found
- Introduction to the ApiExplorer in ASP.NET Core
- How to format response data as XML or JSON, based on the request URL in ASP.NET Core
- Customising ASP.NET Core Identity EF Core naming conventions for PostgreSQL
- Building ASP.NET Core 2.0 preview 2 packages on AppVeyor
- Creating a validator to check for common passwords in ASP.NET Core Identity
- Creating custom password validators for ASP.NET Core Identity
- Localising the DisplayAttribute in ASP.NET Core 1.1
- When you use the Polly circuit-breaker, make sure you share your Policy instances!
- Controller activation and dependency injection in ASP.NET Core MVC
- Four ways to dispose IDisposables in ASP.NET Core
- Automatically validating anti-forgery tokens in ASP.NET Core with the AutoValidateAntiforgeryTokenAttribute
- Defining custom logging messages with LoggerMessage.Define in ASP.NET Core
- Using ImageSharp to resize images in ASP.NET Core - Part 4: saving to disk
- The Microsoft.AspNetCore.All metapackage is huge, and that's awesome, thanks to the .NET Core runtime store
- How to use multiple hosting environments on the same machine in ASP.NET Core
- Using Razor Pages to simplify basic actions in ASP.NET Core 2.0 preview 1
- Exploring Program.cs, Startup.cs and CreateDefaultBuilder in ASP.NET Core 2 preview 1
- The .NET Core 2.0 Preview 1, version numbers and global.json
- Using ImageSharp to resize images in ASP.NET Core - Part 3: caching
- Using ImageSharp to resize images in ASP.NET Core - Part 2
- Using ImageSharp to resize images in ASP.NET Core - a comparison with CoreCompat.System.Drawing
- Creating a basic Web API template using dotnet new custom templates
- Removing the MVC Razor dependencies from the Web API template in ASP.NET Core
- Creating and editing solution files with the .NET CLI
- Getting started with ASP.NET Core
- Image credits
- Adding favicons to your ASP.NET Core website with Real Favicon Generator
- Retrieving the path that generated an error with the StatusCodePages Middleware
- Re-execute the middleware pipeline with the StatusCodePages Middleware to create custom error pages
- Deconstructors for non-tuple types in C# 7.0
- Preventing mass assignment or over posting in ASP.NET Core
- Git integration improvements in Visual Studio 2017 - git-hooks
- What is the NETStandard.Library metapackage?
- What is the Microsoft.AspNetCore metapackage?
- Supporting both LTS and Current releases for ASP.NET Core
- Using routing DataTokens in ASP.NET Core
- Under the hood of the Middleware Analysis package
- Understanding your middleware pipeline with the Middleware Analysis package
- Exploring IStartupFilter in ASP.NET Core
- Logging using DiagnosticSource in ASP.NET Core
- Reloading strongly typed options in ASP.NET Core 1.1.0
- How to pass parameters to a view component
- An introduction to ViewComponents - a login status view component
- Understanding and updating package versions for .NET Core 1.0.3
2016 50
- Redirecting unknown cultures when using the url culture provider: Adding a URL culture provider using middleware as filters - Part 5
- Using a culture constraint and redirecting 404s with the url culture provider: Adding a URL culture provider using middleware as filters - Part 4
- Applying the RouteDataRequest CultureProvider globally with middleware as filters: Adding a URL culture provider using middleware as filters - Part 3
- 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
- Exploring Middleware as MVC Filters in ASP.NET Core 1.1: Adding a URL culture provider using middleware as filters - Part 1
- Troubleshooting ASP.NET Core 1.1.0 install problems
- Making ConcurrentDictionary GetOrAdd thread safe using Lazy
- Fixing a bug: when concatenated strings turn into numbers in JavaScript
- Using dependency injection in a .Net Core console application
- Adding Cache-Control headers to Static Files in ASP.NET Core
- Accessing services when configuring MvcOptions in ASP.NET Core
- Resource-based authorisation in ASP.NET Core
- Modifying the UI based on user authorisation in ASP.NET Core
- Custom authorisation policies and requirements in ASP.NET Core
- Introduction to Authorisation in ASP.NET Core
- Injecting services into ValidationAttributes in ASP.NET Core
- Localising the DisplayAttribute and avoiding magic strings in ASP.NET Core
- How to use machine-specific configuration with ASP.NET Core
- Adding Localisation to an ASP.NET Core application
- Viewing what's changed in ASP.NET Core 1.0.1
- HTML minification using WebMarkupMin in ASP.NET Core
- Configuring environment specific services in ASP.NET Core - Part 2
- Configuring environment specific services for dependency injection in ASP.NET Core
- An introduction to OpenID Connect in ASP.NET Core
- POST-REDIRECT-GET using TempData in ASP.NET Core
- An introduction to OAuth 2.0 using Facebook in ASP.NET Core
- An introduction to Session storage in ASP.NET Core
- A look behind the JWT bearer authentication middleware in ASP.NET Core
- How to set the hosting environment in ASP.NET Core
- Access services inside ConfigureServices using IConfigureOptions in ASP.NET Core
- Exploring the cookie authentication middleware in ASP.NET Core
- Introduction to Authentication with ASP.NET Core
- Forking the pipeline - adding tenant-specific files with SaasKit in ASP.NET Core
- Loading tenants from the database with SaasKit - Part 2, Caching
- Loading tenants from the database with SaasKit in ASP.NET Core
- Adding EF Core and PostgreSQL to an ASP.NET Core project on OS X
- How to configure urls for Kestrel, WebListener and IIS express in ASP.NET Core
- Getting started with StructureMap in ASP.NET Core
- Reloading strongly typed Options on file changes in ASP.NET Core RC2
- Creating a custom ConfigurationProvider in ASP.NET Core to parse YAML
- Adding Travis CI builds to a .NET Core app
- Publishing your first .NET Core NuGet package with AppVeyor and MyGet
- Introduction to integration testing with xUnit and TestServer in ASP.NET Core
- Use project.lock.json to troubleshoot dotnet restore problems
- A deep dive into the ASP.NET Core CORS library
- How to use the IOptions pattern for configuration in ASP.NET Core RC2
- How to add default security headers in ASP.NET Core using custom middleware
- Model binding JSON POSTs in ASP.NET Core
- Understanding .NET Core, NETStandard, .NET Core applications and ASP.NET Core
- Starting a blog to get yourself noticed