<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>
      Latest Posts  |
      Khalid Abuhakmeh 
    </title>
    <!-- Begin Jekyll SEO tag v2.7.1 -->
<meta name="generator" content="Jekyll v4.3.3" />
<meta property="og:title" content="Latest Posts" />
<meta name="author" content="Khalid Abuhakmeh" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="Khalid is a product designer, traveler, respected community member, and open source contributor." />
<meta property="og:description" content="Khalid is a product designer, traveler, respected community member, and open source contributor." />
<link rel="canonical" href="https://khalidabuhakmeh.com/" />
<meta property="og:url" content="https://khalidabuhakmeh.com/" />
<meta property="og:site_name" content="Khalid Abuhakmeh’s Blog" />
<meta property="og:image" content="https://khalidabuhakmeh.com/assets/images/authorimage.jpg" />
<link rel="next" href="https://khalidabuhakmeh.com/2/" />
<meta name="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content="https://khalidabuhakmeh.com/assets/images/authorimage.jpg" />
<meta property="twitter:title" content="Latest Posts" />
<meta name="twitter:site" content="@buhakmeh" />
<meta name="twitter:creator" content="@buhakmeh" />
<script type="application/ld+json">
{"name":"Khalid Abuhakmeh","image":"https://khalidabuhakmeh.com/assets/images/authorimage.jpg","headline":"Latest Posts","url":"https://khalidabuhakmeh.com/","sameAs":["https://twitter.com/@buhakmeh","https://github.com/khalidabuhakmeh"],"author":{"@type":"Person","name":"Khalid Abuhakmeh"},"@type":"WebSite","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://khalidabuhakmeh.com/assets/images/posts/logos/gradient-logo.png"},"name":"Khalid Abuhakmeh"},"description":"Khalid is a product designer, traveler, respected community member, and open source contributor.","@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->


<meta name="fediverse:creator" content="@khalidabuhakmeh@mastodon.social"/>

    <!-- Site Favicon -->
    <link
      rel="shortcut icon"
      href="https://khalidabuhakmeh.com//assets/images/favicon.ico"
      type="image/png"
    />

    <!-- Font Embed Code -->
    <link
      href="https://fonts.googleapis.com/css?family=Karla:400,400i,700,700i"
      rel="stylesheet"
    />

    <!-- CSS Styles -->
    <link href="/assets/css/style.css" rel="stylesheet" />
    <link href="/assets/css/prism.css" rel="stylesheet" />

    

    <script
            data-ad-client="ca-pub-3341312160428646"
            async
            src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
    </script>
    <script
        defer
        type="module"
        src="https://cdn.jsdelivr.net/npm/@micahilbery/share-on-mastodon@1.0.5/share-on-mastodon.js">
    </script>

  </head>

  

  <body class="layout-default">
    <div id="page" class="site">
       <header id="masthead" class="site-header outer">
  <div class="site-header-inside inner">
    <div class="site-branding">
      
      <p class="site-logo">
        <a href="/" rel="home">
          <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/logos/gradient-logo.png" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/logos/gradient-logo.png 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/logos/gradient-logo.png 300w" sizes="300px"   alt="Khalid Abuhakmeh" loading="lazy" width="880" height="211" crossorigin="anonymous" />          
      </a>
      </p>
      <div class="site-title screen-reader-text">
        <a href="" rel="home">Khalid Abuhakmeh's Blog</a>
      </div>
      
    </div>
    <!-- .site-branding -->
    <nav
      id="main-navigation"
      class="site-navigation"
      aria-label="Primary Navigation"
    >
      <ul class="menu">
        
        <li class="menu-item ">
          <a href="/contact/" title="Resumé">
              Resumé
          </a>
        </li>
        
        <li class="menu-item ">
          <a href="/about/" title="About">
              About
          </a>
        </li>
        
        <li class="menu-item search">
          <a href="/search/" title="🔍 Search">
              🔍 Search
          </a>
        </li>
        
      </ul>
      <button id="sidebar-show" class="sidebar-toggle">
        <span class="screen-reader-text">Open Sidebar</span
        ><span class="icon-more" aria-hidden="true"></span>
      </button>
    </nav>
    <!-- .site-navigation -->
  </div>
  <!-- .site-header-inside -->
</header>
<!-- .site-header -->
 

      



<!-- Featured-->
<div class="featured-posts outer">
   <article class=" post-featured inner">
    <header class="post-header">
        <div class="post-meta">
            <span class="featured-badge">Featured</span> : &nbsp;
            <time class="published" datetime="2025-04-22">April 22, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/server-sent-events-in-aspnet-core-and-dotnet-10" rel="bookmark">Server-Sent Events in ASP.NET Core and .NET 10</a>
        </h2>
    </header><!-- .post-header -->
            
    <div class="post-thumbnail">
        <a href="/server-sent-events-in-aspnet-core-and-dotnet-10">
            <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_800/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_320/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 320w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_540/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 540w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_760/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 760w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_980/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 980w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_1200/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 1200w" sizes="100vw" class="featured-image img-fluid"  alt="Server-Sent Events in ASP.NET Core and .NET 10" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
        </a>
        
            
                <small>Photo by <a href="https://unsplash.com/photos/cheese-burger-on-a-wooden-surface-9G_oJBKwi1c" target="_blank">Allen Rad</a></small>
            
                 
    </div>
    
    <div class="post-content">
         <p>Like many .NET developers, I’m starting to look at the features coming in .NET 10, C# 14, and specifically ASP.NET Core. To my surprise, ASP.NET Core Minimal APIs now support Server-Sent Events (SSE). For folks who don’t know what Server-Sent Events are, they are a unidirectional channel from the server to a client where a client can subscribe to events. SSE is handy for building live news feeds, stock ticker applications, or any system that has real-time information.</p>

<p>Inevitably, folks will ask, what’s the difference between SSE and SignalR? The difference is that SSE is lighter than WebSockets, and you can implement an SSE solution using the HTTP protocol. Whereas WebSockets, SignalR’s default operating mode, is a different protocol entirely. WebSockets are great, but the bidirectional communication between server and client adds additional costs that are typically unnecessary for the systems I mentioned previously.</p>

<p>In this post, I’ll show you how to implement a straightforward SSE example using ASP.NET Core Minimal APIs, a background service, and some basic JavaScript.</p>


        <p class="post-tags">
                                
                   
                <a href='/tag/dotnet/'>dotnet</a>
                                
                   
                <a href='/tag/aspnet/'>aspnet</a>
                
            </p>
        <p class="read-more">
            <a class="button more-link" href="/server-sent-events-in-aspnet-core-and-dotnet-10">Continue Reading</a>
        </p>
        
    </div><!-- .post-content -->
</article><!-- .post --> 
</div>
<!-- Posts Index -->

<div class="outer">
  <div class="post-feed-title inner">
    <h1>Latest Posts</h1>
  </div>
  <div class="post-feed inner-wide">
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-03-04">March 4, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/generic-csharp-methods-with-enum-constraints-for-dotnet" rel="bookmark">Generic C# Methods with Enum Constraints for .NET</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/generic-csharp-methods-with-enum-constraints-for-dotnet">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 500w" sizes="100vw"   alt="Generic C# Methods with Enum Constraints for .NET" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>Every couple of years, I tend to write the same variation of an enum helper that reads metadata from an enumeration using reflection. Almost any .NET developer with a few years of experience has done the same. The implementation uses... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/generic-csharp-methods-with-enum-constraints-for-dotnet">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/dotnet/'>dotnet</a>
                            
               
            <a href='/tag/csharp/'>csharp</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-02-25">February 25, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/strongly-typed-markdown-for-aspnet-core-content-apps" rel="bookmark">Strongly-Typed Markdown for ASP.NET Core Content Apps</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/strongly-typed-markdown-for-aspnet-core-content-apps">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 500w" sizes="100vw"   alt="Strongly-Typed Markdown for ASP.NET Core Content Apps" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>Every development career has milestone moments. One we all likely share is building a custom content management system, or CMS, as developers like to refer to it. A common approach to melding metadata and content is utilizing the old reliable... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/strongly-typed-markdown-for-aspnet-core-content-apps">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/aspnet/'>aspnet</a>
                            
               
            <a href='/tag/markdown/'>markdown</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-02-18">February 18, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/the-curious-case-of-dotnet-concurrentdictionary-and-closures" rel="bookmark">The Curious Case of .NET ConcurrentDictionary and Closures</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/the-curious-case-of-dotnet-concurrentdictionary-and-closures">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/dotnet-concurrentdictionary-getoradd-closures.jpg 500w" sizes="100vw"   alt="The Curious Case of .NET ConcurrentDictionary and Closures" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>I was recently looking at the Duende Software codebase, and I kept seeing the same suggestion offered by the IDE tooling whenever I encountered a ConcurrentDictionary: “Closure can be eliminated: method has overload to avoid closure creation.”
 </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/the-curious-case-of-dotnet-concurrentdictionary-and-closures">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/dotnet/'>dotnet</a>
                            
               
            <a href='/tag/csharp/'>csharp</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-02-11">February 11, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/aspnet-core-and-chunking-http-cookies" rel="bookmark">ASP.NET Core and Chunking HTTP Cookies</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/aspnet-core-and-chunking-http-cookies">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-http-cookies-chunking.jpg 500w" sizes="100vw"   alt="ASP.NET Core and Chunking HTTP Cookies" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>If you’ve spent time around web development or your grocery store’s baked goods aisle, you’ve probably dealt with cookies. Let’s discuss the web kind today. A cookie is a header key-value pair that is set on the server using the... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/aspnet-core-and-chunking-http-cookies">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/aspnet/'>aspnet</a>
                            
               
            <a href='/tag/http/'>http</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-02-04">February 4, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/vogen-and-value-objects-with-csharp-and-dotnet" rel="bookmark">Vogen and Value Objects with C# and .NET</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/vogen-and-value-objects-with-csharp-and-dotnet">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/vogen-value-objects-csharp-dotnet.jpg 500w" sizes="100vw"   alt="Vogen and Value Objects with C# and .NET" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>When it comes to programming, correctness is the name of the game. Every developer aims to understand, model, and limit potential outliers when executing code because those unknown variables can lead to exceptions and critical failures. There are many techniques... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/vogen-and-value-objects-with-csharp-and-dotnet">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/csharp/'>csharp</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-01-14">January 14, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/initialize-aspnet-core-taghelpers-with-shared-data" rel="bookmark">Initialize ASP.NET Core TagHelpers with Shared Data</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/initialize-aspnet-core-taghelpers-with-shared-data">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/aspnet-core-shared-data-tag-helpers-initialize.jpg 500w" sizes="100vw"   alt="Initialize ASP.NET Core TagHelpers with Shared Data" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>ASP.NET Core has a superpower that few other frameworks have, largely thanks to the Razor engine. Razor syntax is a mix of HTML and C#, and most Razor syntax implementations will skew heavily towards HTML over C#. However, C# syntax... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/initialize-aspnet-core-taghelpers-with-shared-data">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/aspnet/'>aspnet</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2025-01-07">January 7, 2025</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/writing-a-string-numeric-comparer-with-dotnet-9" rel="bookmark">Writing a String Numeric Comparer with .NET 9</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/writing-a-string-numeric-comparer-with-dotnet-9">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/string-numeric-comparer-dotnet-9.jpg 500w" sizes="100vw"   alt="Writing a String Numeric Comparer with .NET 9" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>I recently saw that .NET 10 adds a numeric comparer, allowing you to sort string elements that may contain numeric values at the end of a string. Think movie sequels or number versions of an operating system. To my surprise,... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/writing-a-string-numeric-comparer-with-dotnet-9">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/dotnet/'>dotnet</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2024-12-31">December 31, 2024</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/great-dotnet-documentation-with-astro-starlight-and-markdownsnippets" rel="bookmark">Great .NET Documentation with Astro, Starlight, and MarkdownSnippets</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/great-dotnet-documentation-with-astro-starlight-and-markdownsnippets">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/astro-starlight-dotnet-markdownsnippets-documentation.jpg 500w" sizes="100vw"   alt="Great .NET Documentation with Astro, Starlight, and MarkdownSnippets" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>The hallmark of every great project is equally great documentation, but it can be increasingly difficult for developers to keep both in sync. Luckily, I’ve been experimenting again with a combination of Starlight and MarkdownSnippets to make maintaining code samples... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/great-dotnet-documentation-with-astro-starlight-and-markdownsnippets">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/astro/'>astro</a>
                            
               
            <a href='/tag/javascript/'>javascript</a>
                            
               
            <a href='/tag/dotnet/'>dotnet</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
     
      <article class="post">
    <header class="post-header">
        <div class="post-meta">
            <time class="published" datetime="2024-12-24">December 24, 2024</time>
        </div><!-- .post-meta -->
        <h2 class="post-title">
            <a href="/alpinejs-polling-aspnet-core-apis-for-updates" rel="bookmark">Alpine.Js Polling ASP.NET Core APIs For Updates</a>
        </h2>
    </header><!-- .post-header -->
    
    
    <a class="post-thumbnail" href="/alpinejs-polling-aspnet-core-apis-for-updates">
        <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/alpinejs-aspnet-core-api-updates-polling.jpg 500w" sizes="100vw"   alt="Alpine.Js Polling ASP.NET Core APIs For Updates" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
    </a>
    
    
    <div class="post-content">
        <p>Building dynamic JavaScript experiences has come a long in the 20 years since I first started software development, but updating the document object model (DOM) can still be a real pain in the butt. That’s why we’ve seen single-page application... </p>
        <p class="read-more" style="float:right">
            <a class="button more-link" href="/alpinejs-polling-aspnet-core-apis-for-updates">Continue Reading</a>
        </p>
        <p class="post-tags">
                            
               
            <a href='/tag/aspnetcore/'>aspnetcore</a>
                            
               
            <a href='/tag/javascript/'>javascript</a>
                            
               
            <a href='/tag/csharp/'>csharp</a>
            
        </p>

    </div><!-- .post-content -->
    
</article><!-- .post --> 
    
  </div>
</div>
<!-- Pagination-->

<nav class="pagination inner">
  <div class="nav-links">
    
    <span class="page-number"> Page 1 of 36 </span>
    
    <a class="older-posts" href="/2/"><span
        class="screen-reader-text">Older Posts</span> <span class="icon-arrow-right" aria-hidden="true"></span></a>
    
  </div>
</nav><!-- .pagination -->
 




 

       

      <footer id="colophon" class="site-footer outer">
        <div class="site-footer-inside">
          <p class="social-links">
    
    <a rel="me" href="https://mastodon.social/@khalidabuhakmeh" target="_blank" class="mastodon">
        <img src="/assets/images/mastodon.svg" alt="mastodon logo" class="fa-mastodon" />
        <span class="screen-reader-text">Mastodon</span>
    </a>
    
    
    
    <a href="https://github.com/khalidabuhakmeh" target="_blank" rel="noopener">
        <span class="fa-github fa" aria-hidden="true"></span>
        <span class="screen-reader-text">GitHub</span>
    </a>
    
    
    
    
    
    
    
    
    
    <a href="/feed.xml" target="_blank" rel="noopener">
        <span class="fa-rss fa" aria-hidden="true"></span>
        <span class="screen-reader-text">RSS Feed</span>
    </a>
    
</p>
          <p class="site-info">
            <a href="#">Khalid Abuhakmeh</a> &copy;
            2026 .<br />
            Powered by
            <a target="_blank" href="https://jekyllrb.com/" rel="noopener">Jekyll</a>.
          </p>
          <p class="back-to-top">
            <a id="top-button" class="top-button" href="#page">
              <span class="icon-arrow-up" aria-hidden="true"></span>
              <span class="screen-reader-text">Back to top</span>
            </a>
          </p>
        </div>
        <!-- .site-footer-inside -->
      </footer>
      <!-- .site-footer -->
    </div>
    <!-- .site -->
    <div id="site-overlay" class="site-overlay"></div>
    <aside id="sidebar" class="sidebar">
	<div class="sidebar-scrollable">
		<div class="sidebar-inside">
			<button id="sidebar-hide" class="sidebar-toggle"><span class="screen-reader-text">Close Sidebar</span><span
				    aria-hidden="true" class="icon-close"></span></button>
			<nav id="sidebar-navigation" class="widget site-navigation">
				<h2 class="widget-title">Explore Site</h2>
				<ul class="menu">
					
						<li class="menu-item"><a href="/contact/">Resumé</a></li>
					
						<li class="menu-item"><a href="/about/">About</a></li>
					
						<li class="menu-item"><a href="/search/">🔍 Search</a></li>
					
				</ul>
			</nav>
			
<section class="widget widget-text">
    <h2 class="widget-title">About Khalid Abuhakmeh</h2>
    <p>Khalid is a product designer, traveler, respected community member, and open source contributor.</p>
    <script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="khalidabuhakmeh" data-color="#d20069" data-emoji="" data-font="Lato" data-text="Buy me a coffee" data-outline-color="#ffffff" data-font-color="#ffffff" data-coffee-color="#FFDD00" ></script>
</section>


<section class="widget widget-recent-posts">
    <h2 class="widget-title">Recent Articles</h2>
    <ul>
        
        <li>
            <div class="post-header">
                <div class="post-meta">
                    <time class="published" datetime="2025-04-22">April 22, 2025</time>
                </div>
                <div class="post-title">
                    <a href="/server-sent-events-in-aspnet-core-and-dotnet-10">Server-Sent Events in ASP.NET Core and .NET 10</a>
                </div>
            </div>
            
            <a class="post-thumbnail" href="/server-sent-events-in-aspnet-core-and-dotnet-10">
                <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/server-sent-events-dotnet-10-aspnetcore-minimal-apis.jpg 500w" sizes="100vw"   alt="Server-Sent Events in ASP.NET Core and .NET 10" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
            </a>
            
        </li>
        
        <li>
            <div class="post-header">
                <div class="post-meta">
                    <time class="published" datetime="2025-03-04">March 4, 2025</time>
                </div>
                <div class="post-title">
                    <a href="/generic-csharp-methods-with-enum-constraints-for-dotnet">Generic C# Methods with Enum Constraints for .NET</a>
                </div>
            </div>
            
            <a class="post-thumbnail" href="/generic-csharp-methods-with-enum-constraints-for-dotnet">
                <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/generic-csharp-methods-enums-dotnet.jpg 500w" sizes="100vw"   alt="Generic C# Methods with Enum Constraints for .NET" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
            </a>
            
        </li>
        
        <li>
            <div class="post-header">
                <div class="post-meta">
                    <time class="published" datetime="2025-02-25">February 25, 2025</time>
                </div>
                <div class="post-title">
                    <a href="/strongly-typed-markdown-for-aspnet-core-content-apps">Strongly-Typed Markdown for ASP.NET Core Content Apps</a>
                </div>
            </div>
            
            <a class="post-thumbnail" href="/strongly-typed-markdown-for-aspnet-core-content-apps">
                <img src="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg" srcset="https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_100/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 100w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_200/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 200w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_300/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 300w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_400/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 400w,
https://res.cloudinary.com/abuhakmeh/image/fetch/c_limit,f_auto,q_auto,w_500/https://khalidabuhakmeh.com/assets/images/posts/misc/strongly-typed-markdown-aspnetcore-content-apps.jpg 500w" sizes="100vw"   alt="Strongly-Typed Markdown for ASP.NET Core Content Apps" loading="lazy" width="1366" height="768" crossorigin="anonymous" />
            </a>
            
        </li>
        
    </ul>
</section>

<!-- Create a sorted array of tags -->


<section class="widget widget-tagcloud">
    <h2 class="widget-title">Tags</h2>
    <div class="tagcloud">
        
         
        <a href='/tag/11ty/'>11ty</a>
        
         
        <a href='/tag/Blazor/'>Blazor</a>
        
         
        <a href='/tag/HTML/'>HTML</a>
        
         
        <a href='/tag/JavaScript/'>JavaScript</a>
        
         
        <a href='/tag/MAUI/'>MAUI</a>
        
         
        <a href='/tag/OpenAPI/'>OpenAPI</a>
        
         
        <a href='/tag/TypeScript/'>TypeScript</a>
        
         
        <a href='/tag/aspire/'>aspire</a>
        
         
        <a href='/tag/aspnet/'>aspnet</a>
        
         
        <a href='/tag/aspnetcore/'>aspnetcore</a>
        
         
        <a href='/tag/astro/'>astro</a>
        
         
        <a href='/tag/avalonia/'>avalonia</a>
        
         
        <a href='/tag/azure/'>azure</a>
        
         
        <a href='/tag/beginners/'>beginners</a>
        
         
        <a href='/tag/blazor/'>blazor</a>
        
         
        <a href='/tag/blog/'>blog</a>
        
         
        <a href='/tag/console/'>console</a>
        
         
        <a href='/tag/csharp/'>csharp</a>
        
         
        <a href='/tag/css/'>css</a>
        
         
        <a href='/tag/database/'>database</a>
        
         
        <a href='/tag/development/'>development</a>
        
         
        <a href='/tag/docker/'>docker</a>
        
         
        <a href='/tag/dotnet/'>dotnet</a>
        
         
        <a href='/tag/efcore/'>efcore</a>
        
         
        <a href='/tag/entity-framework/'>entity-framework</a>
        
         
        <a href='/tag/fsharp/'>fsharp</a>
        
         
        <a href='/tag/general/'>general</a>
        
         
        <a href='/tag/github/'>github</a>
        
         
        <a href='/tag/html/'>html</a>
        
         
        <a href='/tag/htmx/'>htmx</a>
        
         
        <a href='/tag/http/'>http</a>
        
         
        <a href='/tag/javascript/'>javascript</a>
        
         
        <a href='/tag/jekyll/'>jekyll</a>
        
         
        <a href='/tag/jetbrains/'>jetbrains</a>
        
         
        <a href='/tag/json/'>json</a>
        
         
        <a href='/tag/kotlin/'>kotlin</a>
        
         
        <a href='/tag/macOS/'>macOS</a>
        
         
        <a href='/tag/machine-learning/'>machine-learning</a>
        
         
        <a href='/tag/markdown/'>markdown</a>
        
         
        <a href='/tag/maui/'>maui</a>
        
         
        <a href='/tag/mobile/'>mobile</a>
        
         
        <a href='/tag/mvc/'>mvc</a>
        
         
        <a href='/tag/nuget/'>nuget</a>
        
         
        <a href='/tag/oss/'>oss</a>
        
         
        <a href='/tag/playwright/'>playwright</a>
        
         
        <a href='/tag/question/'>question</a>
        
         
        <a href='/tag/razor/'>razor</a>
        
         
        <a href='/tag/regex/'>regex</a>
        
         
        <a href='/tag/ruby/'>ruby</a>
        
         
        <a href='/tag/rust/'>rust</a>
        
         
        <a href='/tag/search/'>search</a>
        
         
        <a href='/tag/security/'>security</a>
        
         
        <a href='/tag/sql/'>sql</a>
        
         
        <a href='/tag/static/'>static</a>
        
         
        <a href='/tag/style/'>style</a>
        
         
        <a href='/tag/terminal/'>terminal</a>
        
         
        <a href='/tag/tips/'>tips</a>
        
         
        <a href='/tag/twitter/'>twitter</a>
        
         
        <a href='/tag/typescript/'>typescript</a>
        
         
        <a href='/tag/vite/'>vite</a>
        
         
        <a href='/tag/wasm/'>wasm</a>
        
         
        <a href='/tag/web/'>web</a>
        
         
        <a href='/tag/xamarin/'>xamarin</a>
        
         
        <a href='/tag/xunit/'>xunit</a>
        
    </div>
</section>


		</div><!-- .sidebar-inside -->
	</div><!-- .sidebar-scrollable -->
</aside><!-- .sidebar --> 
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-44445129-1"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'UA-44445129-1', { 'anonymize_ip': true });
  </script>


    <!-- Javascript Assets -->
    <script src="/assets/js/zepto.min.js"></script>
    <script src="/assets/js/prism.js"></script>
    
    <script src="/assets/js/custom.js"></script>
    <script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="khalidabuhakmeh" data-description="Support me on Buy me a coffee!" data-message="" data-color="#BD5FFF" data-position="Right" data-x_margin="18" data-y_margin="18"></script>
  </body>
</html>
