<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hi, I'm Ben. I use code to solve your problems. on BEN ABT</title><link>https://benjamin-abt.com/</link><description>Recent content in Hi, I'm Ben. I use code to solve your problems. on BEN ABT</description><generator>Hugo</generator><language>en-US</language><atom:link href="https://benjamin-abt.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Problem Details in ASP.NET Core and .NET 11</title><link>https://benjamin-abt.com/blog/2026/10/05/problemdetails-done-right-aspnet-core-dotnet-11/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/10/05/problemdetails-done-right-aspnet-core-dotnet-11/</guid><description>&lt;p&gt;&lt;code&gt;builder.Services.AddProblemDetails()&lt;/code&gt; registers infrastructure. It does not create an error contract.&lt;/p&gt;
&lt;p&gt;An ASP.NET Core request can fail during binding, validation, authentication, authorization, endpoint execution, exception handling, routing or rate limiting. Without one design, those paths return different media types, identifiers and amounts of detail. Clients still need special cases even though some responses happen to use the &lt;code&gt;ProblemDetails&lt;/code&gt; class.&lt;/p&gt;</description></item><item><title>Resilience in .NET with Microsoft.Extensions.Resilience</title><link>https://benjamin-abt.com/blog/2026/09/21/resilience-dotnet-microsoft-extensions-resilience/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/09/21/resilience-dotnet-microsoft-extensions-resilience/</guid><description>&lt;p&gt;Retries are the most visible resilience strategy and the easiest one to misuse. Repeating a failing call can recover from a short network problem. It can also multiply load, repeat a write and keep working long after the caller has left.&lt;/p&gt;</description></item><item><title>What Matters in ASP.NET Core 11</title><link>https://benjamin-abt.com/blog/2026/09/14/whats-new-aspnet-core-11-that-actually-matters/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/09/14/whats-new-aspnet-core-11-that-actually-matters/</guid><description>&lt;p&gt;ASP.NET Core 11 has no single feature that fundamentally changes how web applications are built. That is not a criticism. Mature frameworks improve by removing custom infrastructure, tightening defaults and making common behavior cheaper or easier to observe.&lt;/p&gt;</description></item><item><title>Migrating Semantic Kernel Agents to Microsoft Agent Framework</title><link>https://benjamin-abt.com/blog/2026/09/07/microsoft-agent-framework-semantic-kernel-migration/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/09/07/microsoft-agent-framework-semantic-kernel-migration/</guid><description>&lt;p&gt;Microsoft Agent Framework is the successor to the agent capabilities in Semantic Kernel and AutoGen. That statement is easy to misread as &amp;ldquo;replace the package and rename a few classes.&amp;rdquo; The migration is more architectural than that.&lt;/p&gt;</description></item><item><title>Building Production MCP Servers with ASP.NET Core</title><link>https://benjamin-abt.com/blog/2026/08/31/building-mcp-server-aspnet-core/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/31/building-mcp-server-aspnet-core/</guid><description>&lt;p&gt;An MCP server can look deceptively small. A package is installed, a method receives an attribute and ASP.NET Core maps an endpoint. That is enough for a demonstration. It is not enough for a server that is allowed to read company data, call internal services or change business state on behalf of an AI application.&lt;/p&gt;</description></item><item><title>Telemetry, Logging and Auditing in .NET: Designing the Right Data Path</title><link>https://benjamin-abt.com/blog/2026/08/24/telemetry-logging-auditing-application-insights-cosmos-db/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/24/telemetry-logging-auditing-application-insights-cosmos-db/</guid><description>&lt;p&gt;Telemetry, logging and auditing are often implemented through the same API because all three produce timestamped records. That similarity is superficial. They answer different questions, tolerate different failure modes and require different storage contracts.&lt;/p&gt;</description></item><item><title>Automatic TTL in Azure Cosmos DB with .NET</title><link>https://benjamin-abt.com/blog/2026/08/17/cosmos-db-automatic-ttl-dotnet/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/17/cosmos-db-automatic-ttl-dotnet/</guid><description>&lt;p&gt;Temporary data is easy to create and surprisingly difficult to remove reliably. Sessions, idempotency keys, import buffers, transient integration responses, processed-message markers and short-lived audit records all have a natural end of life. Without an explicit lifecycle, they remain in the database, increase storage and indexing cost and eventually make ordinary queries operate over data that no longer has business value.&lt;/p&gt;</description></item><item><title>Custom Password Hashing in ASP.NET Core: A Versioned, Upgradeable Design</title><link>https://benjamin-abt.com/blog/2026/08/10/custom-password-hashing-aspnet-core/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/10/custom-password-hashing-aspnet-core/</guid><description>&lt;p&gt;Applications that do not use ASP.NET Core Identity still need a disciplined password-storage design. This often leads to a requirement phrased as &amp;ldquo;password encryption.&amp;rdquo; That phrase is dangerous because encryption is reversible: an application holding the key can recover every password. Password storage needs a deliberately one-way, slow derivation function instead.&lt;/p&gt;</description></item><item><title>MCP C# SDK 2.0: Stateless HTTP, Interactive Tools and a Practical Migration Path</title><link>https://benjamin-abt.com/blog/2026/08/03/mcp-csharp-sdk-2/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/03/mcp-csharp-sdk-2/</guid><description>&lt;p&gt;The 2.0 release of the official Model Context Protocol (MCP) C# SDK is more than a version increment. It implements the 2026-07-28 MCP specification revision, which changes the default shape of MCP over HTTP. The protocol now favors independent, self-describing requests over a connection-scoped session, while still supporting interactive workflows that need more than one exchange.&lt;/p&gt;</description></item><item><title>Handle time correctly in .NET: TimeProvider</title><link>https://benjamin-abt.com/blog/2026/07/27/dotnet-timeprovider/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/27/dotnet-timeprovider/</guid><description>&lt;p&gt;Time is an external dependency. That may sound unusual at first because &lt;code&gt;DateTime.UtcNow&lt;/code&gt; is available anywhere without configuration. This convenience becomes a problem as soon as business rules depend on the current moment: expired invitations, time-limited tokens, cancellation windows, rate limits, background jobs and reminders.&lt;/p&gt;</description></item><item><title>Run Hono on Azure Static Web Apps: managed Functions APIs for static frontends</title><link>https://benjamin-abt.com/blog/2026/07/19/run-hono-on-azure-static-web-apps/</link><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/19/run-hono-on-azure-static-web-apps/</guid><description>&lt;p&gt;Azure Static Web Apps is primarily a host for static frontend assets, but it can also deploy a small HTTP API alongside the frontend. That API is implemented as an Azure Functions application and is exposed through the same site under the fixed &lt;code&gt;/api&lt;/code&gt; path. Hono fits this model well when a web application needs a focused JSON API without introducing a separately operated container or web host.&lt;/p&gt;</description></item><item><title>Problem Details in ASP.NET Core and .NET 10</title><link>https://benjamin-abt.com/blog/2026/07/15/problem-details-standard-aspnet-core-dotnet-10/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/15/problem-details-standard-aspnet-core-dotnet-10/</guid><description>&lt;p&gt;Error responses are part of an API contract. Still, many systems grow them incidentally: one endpoint returns &lt;code&gt;{ &amp;quot;error&amp;quot;: &amp;quot;not found&amp;quot; }&lt;/code&gt;, another returns an array of validation errors, a gateway adds its own structure and an unexpected exception ends up as another JSON shape. That is inconvenient for people and brittle for client applications.&lt;/p&gt;</description></item><item><title>Using MeterListener with the new .NET 11 MemoryCache metrics</title><link>https://benjamin-abt.com/blog/2026/07/14/dotnet-11-meterlistener-memorycache-metrics/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/14/dotnet-11-meterlistener-memorycache-metrics/</guid><description>&lt;p&gt;.NET 11 adds a small but useful improvement to the built-in observability story: &lt;code&gt;MemoryCache&lt;/code&gt; can now publish OpenTelemetry-compatible metrics directly through &lt;code&gt;System.Diagnostics.Metrics&lt;/code&gt;. That makes cache behavior visible without adding a custom wrapper around every &lt;code&gt;Get&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt; and &lt;code&gt;Remove&lt;/code&gt; call.&lt;/p&gt;</description></item><item><title>Run Hono on Azure: Container Apps, Functions, App Service and AKS compared</title><link>https://benjamin-abt.com/blog/2026/07/12/run-hono-on-azure/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/12/run-hono-on-azure/</guid><description>&lt;p&gt;Hono is often associated with Cloudflare Workers and for good reason. Its small routing model, Web Standard API surface and direct &lt;code&gt;fetch&lt;/code&gt; integration make it a natural fit for edge runtimes. That association can obscure a more useful fact: Hono is not tied to Cloudflare. The same application core can run on Azure when the runtime-specific edge is kept separate from routes and business logic.&lt;/p&gt;</description></item><item><title>Top 10 recommendations for .NET developers working with Azure Cosmos DB</title><link>https://benjamin-abt.com/blog/2026/07/10/top-10-recommendations-dotnet-developers-azure-cosmos-db/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/10/top-10-recommendations-dotnet-developers-azure-cosmos-db/</guid><description>&lt;p&gt;Azure Cosmos DB has a habit of exposing architectural weaknesses very early. Classic data-access patterns that work perfectly fine with relational databases often become expensive, noisy and operationally awkward once request units (RUs), partitioning and cross-partition query fan-out come into play.&lt;/p&gt;</description></item><item><title>How to migrate .NET versioning from x.x.x.x to SemVer</title><link>https://benjamin-abt.com/blog/2026/07/05/migrate-dotnet-versioning-from-xxxx-to-semver/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/05/migrate-dotnet-versioning-from-xxxx-to-semver/</guid><description>&lt;p&gt;Many long-lived .NET repositories did not start with semantic versioning. They grew up with &lt;code&gt;major.minor.build.revision&lt;/code&gt;, often set in &lt;code&gt;AssemblyInfo.cs&lt;/code&gt;, sometimes mixed with wildcard auto increment, sometimes duplicated across several projects and sometimes quietly diverging over the years.&lt;/p&gt;</description></item><item><title>Modern versioning for ASP.NET Core and web apps and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/07/03/modern-versioning-aspnet-core-web-apps-idempotent-artifacts/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/03/modern-versioning-aspnet-core-web-apps-idempotent-artifacts/</guid><description>&lt;p&gt;ASP.NET Core applications are usually released often enough that versioning stops being a documentation concern and turns into delivery infrastructure. Once an application moves through CI, staging, production, containers, rollback procedures and incident response, the version number is no longer just a label. It becomes part of the operational model.&lt;/p&gt;</description></item><item><title>Modern versioning for .NET desktop apps and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/06/30/modern-versioning-dotnet-desktop-apps-idempotent-artifacts/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/30/modern-versioning-dotnet-desktop-apps-idempotent-artifacts/</guid><description>&lt;p&gt;Desktop software makes versioning visible in a way that web systems often do not. A backend can hide a surprising amount of release machinery behind its platform. A Windows executable cannot. Explorer exposes file versions, installers compare product versions, update channels make decisions based on package identity and support usually starts with a screenshot from an About dialog.&lt;/p&gt;</description></item><item><title>Modern versioning for .NET apps and libraries and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/06/26/modern-versioning-dotnet-apps-libraries-idempotent-artifacts/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/26/modern-versioning-dotnet-apps-libraries-idempotent-artifacts/</guid><description>&lt;p&gt;Versioning stays invisible right up to the point when it fails. A package has to be reissued, a support case depends on one exact binary or staging and production turn out to run artifacts from the same commit that do not quite match. At that moment the version number stops being release-note decoration and becomes engineering data.&lt;/p&gt;</description></item><item><title>Local Aspire Development with Azure Cosmos DB and the Preview Emulator</title><link>https://benjamin-abt.com/blog/2026/06/24/local-development-aspire-cosmosdb-preview-emulator/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/24/local-development-aspire-cosmosdb-preview-emulator/</guid><description>&lt;p&gt;Distributed applications tend to feel straightforward until a real cloud dependency enters the picture. Azure Cosmos DB is a good example. In Azure, the preferred model is usually clear: the application should connect without secrets and authenticate through Managed Identity. Local development has different constraints. There is no managed identity attached to a machine in the same way, but the application still needs a reachable endpoint, credentials, startup ordering and a database that exists before the first request reaches repository code.&lt;/p&gt;</description></item></channel></rss>