{"id":1906,"date":"2024-06-16T11:23:28","date_gmt":"2024-06-16T11:23:28","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1906"},"modified":"2024-06-16T20:49:51","modified_gmt":"2024-06-16T20:49:51","slug":"optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/","title":{"rendered":"Optimizing Performance in ASP.NET Core MVC with Middleware and Custom Caching Strategies"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Optimizing the performance of web applications is crucial for providing a seamless user experience and maintaining high levels of efficiency and scalability. ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications. In this tutorial, we will explore how to optimize performance in ASP.NET Core MVC using middleware and custom caching strategies.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to ASP.NET Core MVC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core MVC is a lightweight, open-source framework for building dynamic, testable, and scalable web applications. It follows the Model-View-Controller (MVC) design pattern, which separates an application into three main components: the Model, the View, and the Controller. This separation helps manage the complexity of application development and enables a more organized and maintainable codebase.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Understanding Middleware in ASP.NET Core<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Middleware is software that is assembled into an application pipeline to handle requests and responses. Each component in the pipeline can perform operations before and after the next component in the pipeline is invoked. Middleware components can be used to handle cross-cutting concerns such as authentication, logging, and performance monitoring.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Middleware Pipeline<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The middleware pipeline in ASP.NET Core is configured in the <code>Startup<\/code> class. The <code>Configure<\/code> method of the <code>Startup<\/code> class is used to add middleware components to the pipeline.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Startup<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Configure<\/span>(<span class=\"hljs-params\">IApplicationBuilder app, IHostingEnvironment env<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (env.IsDevelopment())\n        {\n            app.UseDeveloperExceptionPage();\n        }\n        <span class=\"hljs-keyword\">else<\/span>\n        {\n            app.UseExceptionHandler(<span class=\"hljs-string\">\"\/Home\/Error\"<\/span>);\n        }\n\n        app.UseStaticFiles();\n        app.UseRouting();\n\n        app.UseAuthorization();\n\n        app.UseEndpoints(endpoints =&gt;\n        {\n            endpoints.MapControllerRoute(\n                name: <span class=\"hljs-string\">\"default\"<\/span>,\n                pattern: <span class=\"hljs-string\">\"{controller=Home}\/{action=Index}\/{id?}\"<\/span>);\n        });\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Implementing Custom Middleware<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Custom middleware can be implemented to handle specific tasks. Let&#8217;s create a simple custom middleware that logs the time taken to process a request.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating Custom Middleware<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a new class <code>RequestTimingMiddleware<\/code>.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RequestTimingMiddleware<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> RequestDelegate _next;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">RequestTimingMiddleware<\/span>(<span class=\"hljs-params\">RequestDelegate next<\/span>)<\/span>\n    {\n        _next = next;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">async<\/span> Task <span class=\"hljs-title\">InvokeAsync<\/span>(<span class=\"hljs-params\">HttpContext context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> startTime = DateTime.UtcNow;\n\n        <span class=\"hljs-keyword\">await<\/span> _next(context);\n\n        <span class=\"hljs-keyword\">var<\/span> endTime = DateTime.UtcNow;\n        <span class=\"hljs-keyword\">var<\/span> duration = endTime - startTime;\n        Console.WriteLine(<span class=\"hljs-string\">$\"Request processed in <span class=\"hljs-subst\">{duration.TotalMilliseconds}<\/span> ms\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Register the custom middleware in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Configure<\/span>(<span class=\"hljs-params\">IApplicationBuilder app, IHostingEnvironment env<\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">if<\/span> (env.IsDevelopment())\n    {\n        app.UseDeveloperExceptionPage();\n    }\n    <span class=\"hljs-keyword\">else<\/span>\n    {\n        app.UseExceptionHandler(<span class=\"hljs-string\">\"\/Home\/Error\"<\/span>);\n    }\n\n    app.UseStaticFiles();\n    app.UseRouting();\n\n    app.UseMiddleware&lt;RequestTimingMiddleware&gt;(); <span class=\"hljs-comment\">\/\/ Register custom middleware<\/span>\n\n    app.UseAuthorization();\n\n    app.UseEndpoints(endpoints =&gt;\n    {\n        endpoints.MapControllerRoute(\n            name: <span class=\"hljs-string\">\"default\"<\/span>,\n            pattern: <span class=\"hljs-string\">\"{controller=Home}\/{action=Index}\/{id?}\"<\/span>);\n    });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Introduction to Caching in ASP.NET Core<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Caching is a technique used to store frequently accessed data in memory to reduce the time it takes to retrieve it. ASP.NET Core provides several caching mechanisms to enhance the performance of web applications. These include response caching, in-memory caching, and distributed caching.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Types of Caching<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Response Caching<\/strong>: Stores the entire response of a request in cache.<\/li>\n\n\n\n<li><strong>In-Memory Caching<\/strong>: Stores data in the memory of the server.<\/li>\n\n\n\n<li><strong>Distributed Caching<\/strong>: Stores data in a distributed cache, which can be shared across multiple servers.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">6. Implementing Response Caching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Response caching can significantly improve the performance of your application by storing responses and serving them from the cache for subsequent requests.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enabling Response Caching<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the <code>ResponseCaching<\/code> middleware to the pipeline in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Configure<\/span>(<span class=\"hljs-params\">IApplicationBuilder app, IHostingEnvironment env<\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">if<\/span> (env.IsDevelopment())\n    {\n        app.UseDeveloperExceptionPage();\n    }\n    <span class=\"hljs-keyword\">else<\/span>\n    {\n        app.UseExceptionHandler(<span class=\"hljs-string\">\"\/Home\/Error\"<\/span>);\n    }\n\n    app.UseStaticFiles();\n    app.UseRouting();\n\n    app.UseResponseCaching(); <span class=\"hljs-comment\">\/\/ Enable response caching<\/span>\n\n    app.UseAuthorization();\n\n    app.UseEndpoints(endpoints =&gt;\n    {\n        endpoints.MapControllerRoute(\n            name: <span class=\"hljs-string\">\"default\"<\/span>,\n            pattern: <span class=\"hljs-string\">\"{controller=Home}\/{action=Index}\/{id?}\"<\/span>);\n    });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Configure the response caching in a controller action.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">&#91;<span class=\"hljs-meta\">HttpGet<\/span>]\n&#91;<span class=\"hljs-meta\">ResponseCache(Duration = 60)<\/span>] <span class=\"hljs-comment\">\/\/ Cache response for 60 seconds<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IActionResult <span class=\"hljs-title\">Index<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">return<\/span> View();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Implementing In-Memory Caching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In-memory caching stores data in the memory of the web server. It is useful for storing small amounts of data that need to be accessed frequently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting Up In-Memory Caching<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the <code>IMemoryCache<\/code> service to the <code>ConfigureServices<\/code> method in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConfigureServices<\/span>(<span class=\"hljs-params\">IServiceCollection services<\/span>)<\/span>\n{\n    services.AddControllersWithViews();\n    services.AddMemoryCache(); <span class=\"hljs-comment\">\/\/ Add in-memory caching<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Use the <code>IMemoryCache<\/code> service in a controller.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HomeController<\/span> : <span class=\"hljs-title\">Controller<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> IMemoryCache _cache;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">HomeController<\/span>(<span class=\"hljs-params\">IMemoryCache cache<\/span>)<\/span>\n    {\n        _cache = cache;\n    }\n\n    &#91;<span class=\"hljs-meta\">HttpGet<\/span>]\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IActionResult <span class=\"hljs-title\">Index<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> cacheKey = <span class=\"hljs-string\">\"CurrentTime\"<\/span>;\n        <span class=\"hljs-keyword\">if<\/span> (!_cache.TryGetValue(cacheKey, <span class=\"hljs-keyword\">out<\/span> DateTime cachedTime))\n        {\n            cachedTime = DateTime.UtcNow;\n            <span class=\"hljs-keyword\">var<\/span> cacheEntryOptions = <span class=\"hljs-keyword\">new<\/span> MemoryCacheEntryOptions()\n                .SetSlidingExpiration(TimeSpan.FromSeconds(<span class=\"hljs-number\">60<\/span>));\n\n            _cache.Set(cacheKey, cachedTime, cacheEntryOptions);\n        }\n\n        ViewBag.CurrentTime = cachedTime;\n        <span class=\"hljs-keyword\">return<\/span> View();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Implementing Distributed Caching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Distributed caching allows data to be stored in a cache that can be shared across multiple servers. This is useful for scaling out web applications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting Up Distributed Caching<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the <code>IDistributedCache<\/code> service to the <code>ConfigureServices<\/code> method in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConfigureServices<\/span>(<span class=\"hljs-params\">IServiceCollection services<\/span>)<\/span>\n{\n    services.AddControllersWithViews();\n    services.AddStackExchangeRedisCache(options =&gt;\n    {\n        options.Configuration = <span class=\"hljs-string\">\"localhost:6379\"<\/span>; <span class=\"hljs-comment\">\/\/ Redis configuration<\/span>\n        options.InstanceName = <span class=\"hljs-string\">\"SampleInstance\"<\/span>;\n    });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Use the <code>IDistributedCache<\/code> service in a controller.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HomeController<\/span> : <span class=\"hljs-title\">Controller<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> IDistributedCache _cache;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">HomeController<\/span>(<span class=\"hljs-params\">IDistributedCache cache<\/span>)<\/span>\n    {\n        _cache = cache;\n    }\n\n    &#91;<span class=\"hljs-meta\">HttpGet<\/span>]\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">async<\/span> Task&lt;IActionResult&gt; <span class=\"hljs-title\">Index<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> cacheKey = <span class=\"hljs-string\">\"CurrentTime\"<\/span>;\n        <span class=\"hljs-keyword\">var<\/span> cachedTime = <span class=\"hljs-keyword\">await<\/span> _cache.GetStringAsync(cacheKey);\n\n        <span class=\"hljs-keyword\">if<\/span> (cachedTime == <span class=\"hljs-literal\">null<\/span>)\n        {\n            cachedTime = DateTime.UtcNow.ToString();\n            <span class=\"hljs-keyword\">var<\/span> options = <span class=\"hljs-keyword\">new<\/span> DistributedCacheEntryOptions()\n                .SetSlidingExpiration(TimeSpan.FromSeconds(<span class=\"hljs-number\">60<\/span>));\n\n            <span class=\"hljs-keyword\">await<\/span> _cache.SetStringAsync(cacheKey, cachedTime, options);\n        }\n\n        ViewBag.CurrentTime = cachedTime;\n        <span class=\"hljs-keyword\">return<\/span> View();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">9. Custom Caching Strategies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Custom caching strategies can be implemented to meet specific application requirements. These strategies involve creating custom logic to determine when and how to cache data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementing a Custom Cache Provider<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a custom cache provider interface.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ICustomCacheProvider<\/span>\n{\n    T Get&lt;T&gt;(<span class=\"hljs-keyword\">string<\/span> key);\n    <span class=\"hljs-keyword\">void<\/span> Set&lt;T&gt;(<span class=\"hljs-keyword\">string<\/span> key, T <span class=\"hljs-keyword\">value<\/span>, TimeSpan expiration);\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Remove<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> key<\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Implement the custom cache provider.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomCacheProvider<\/span> : <span class=\"hljs-title\">ICustomCacheProvider<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> IMemoryCache _cache;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">CustomCacheProvider<\/span>(<span class=\"hljs-params\">IMemoryCache cache<\/span>)<\/span>\n    {\n        _cache = cache;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> T Get&lt;T&gt;(<span class=\"hljs-keyword\">string<\/span> key)\n    {\n        _cache.TryGetValue(key, <span class=\"hljs-keyword\">out<\/span> T <span class=\"hljs-keyword\">value<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">value<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> Set&lt;T&gt;(<span class=\"hljs-keyword\">string<\/span> key, T <span class=\"hljs-keyword\">value<\/span>, TimeSpan expiration)\n    {\n        <span class=\"hljs-keyword\">var<\/span> cacheEntryOptions = <span class=\"hljs-keyword\">new<\/span> MemoryCacheEntryOptions()\n            .SetSlidingExpiration(expiration);\n\n        _cache.Set(key, <span class=\"hljs-keyword\">value<\/span>, cacheEntryOptions);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Remove<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> key<\/span>)<\/span>\n    {\n        _cache.Remove(key);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Register the custom cache provider in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConfigureServices<\/span>(<span class=\"hljs-params\">IServiceCollection services<\/span>)<\/span>\n{\n    services.AddControllersWithViews();\n    services.AddMemoryCache();\n    services.AddSingleton&lt;ICustomCacheProvider, CustomCacheProvider&gt;(); <span class=\"hljs-comment\">\/\/ Register custom cache provider<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Use the custom cache provider in a controller.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HomeController<\/span>\n\n : <span class=\"hljs-title\">Controller<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> ICustomCacheProvider _cacheProvider;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">HomeController<\/span>(<span class=\"hljs-params\">ICustomCacheProvider cacheProvider<\/span>)<\/span>\n    {\n        _cacheProvider = cacheProvider;\n    }\n\n    &#91;<span class=\"hljs-meta\">HttpGet<\/span>]\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IActionResult <span class=\"hljs-title\">Index<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> cacheKey = <span class=\"hljs-string\">\"CurrentTime\"<\/span>;\n        <span class=\"hljs-keyword\">var<\/span> cachedTime = _cacheProvider.Get&lt;DateTime&gt;(cacheKey);\n\n        <span class=\"hljs-keyword\">if<\/span> (cachedTime == <span class=\"hljs-keyword\">default<\/span>)\n        {\n            cachedTime = DateTime.UtcNow;\n            _cacheProvider.Set(cacheKey, cachedTime, TimeSpan.FromSeconds(<span class=\"hljs-number\">60<\/span>));\n        }\n\n        ViewBag.CurrentTime = cachedTime;\n        <span class=\"hljs-keyword\">return<\/span> View();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">10. Performance Monitoring and Optimization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Monitoring and optimizing performance is an ongoing process. Tools such as Application Insights and profiling tools can help identify bottlenecks and areas for improvement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using Application Insights<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add Application Insights to the <code>ConfigureServices<\/code> method in the <code>Startup<\/code> class.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConfigureServices<\/span>(<span class=\"hljs-params\">IServiceCollection services<\/span>)<\/span>\n{\n    services.AddControllersWithViews();\n    services.AddApplicationInsightsTelemetry(Configuration&#91;<span class=\"hljs-string\">\"ApplicationInsights:InstrumentationKey\"<\/span>]);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Use the telemetry client to log custom events.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HomeController<\/span> : <span class=\"hljs-title\">Controller<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> TelemetryClient _telemetryClient;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">HomeController<\/span>(<span class=\"hljs-params\">TelemetryClient telemetryClient<\/span>)<\/span>\n    {\n        _telemetryClient = telemetryClient;\n    }\n\n    &#91;<span class=\"hljs-meta\">HttpGet<\/span>]\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IActionResult <span class=\"hljs-title\">Index<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _telemetryClient.TrackEvent(<span class=\"hljs-string\">\"Index action called\"<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> View();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Profiling Tools<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Profiling tools such as dotTrace and Visual Studio Profiler can help identify performance bottlenecks in your application. Regular profiling and performance testing can ensure that your application remains optimized as it evolves.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Optimizing the performance of ASP.NET Core MVC applications involves a combination of using middleware and implementing effective caching strategies. By understanding and leveraging these techniques, you can enhance the responsiveness and scalability of your applications. Regular monitoring and optimization efforts are essential to maintain high performance and provide a seamless user experience.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Optimizing the performance of web applications is crucial for providing a seamless user experience and maintaining high levels of efficiency and scalability. ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications. In this tutorial, we will explore how to optimize performance in ASP.NET Core MVC [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8,4],"tags":[],"class_list":["post-1906","post","type-post","status-publish","format-standard","category-csharp","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Optimizing Performance in ASP.NET Core MVC with Middleware &amp; Custom Caching Strategies<\/title>\n<meta name=\"description\" content=\"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimizing Performance in ASP.NET Core MVC with Middleware &amp; Custom Caching Strategies\" \/>\n<meta property=\"og:description\" content=\"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-16T11:23:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-16T20:49:51+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"Optimizing Performance in ASP.NET Core MVC with Middleware and Custom Caching Strategies\",\"datePublished\":\"2024-06-16T11:23:28+00:00\",\"dateModified\":\"2024-06-16T20:49:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/\"},\"wordCount\":690,\"articleSection\":[\"C#\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/\",\"name\":\"Optimizing Performance in ASP.NET Core MVC with Middleware & Custom Caching Strategies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-16T11:23:28+00:00\",\"dateModified\":\"2024-06-16T20:49:51+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Optimizing Performance in ASP.NET Core MVC with Middleware and Custom Caching Strategies\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Optimizing Performance in ASP.NET Core MVC with Middleware & Custom Caching Strategies","description":"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/","og_locale":"en_US","og_type":"article","og_title":"Optimizing Performance in ASP.NET Core MVC with Middleware & Custom Caching Strategies","og_description":"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.","og_url":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/","article_published_time":"2024-06-16T11:23:28+00:00","article_modified_time":"2024-06-16T20:49:51+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"Optimizing Performance in ASP.NET Core MVC with Middleware and Custom Caching Strategies","datePublished":"2024-06-16T11:23:28+00:00","dateModified":"2024-06-16T20:49:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/"},"wordCount":690,"articleSection":["C#","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/","url":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/","name":"Optimizing Performance in ASP.NET Core MVC with Middleware & Custom Caching Strategies","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-16T11:23:28+00:00","dateModified":"2024-06-16T20:49:51+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"ASP.NET Core MVC, being a powerful and flexible framework, provides various mechanisms to enhance the performance of web applications.","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/optimizing-performance-asp-net-core-mvc-with-middleware-custom-caching-strategies\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"Optimizing Performance in ASP.NET Core MVC with Middleware and Custom Caching Strategies"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1906"}],"version-history":[{"count":5,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1906\/revisions"}],"predecessor-version":[{"id":1911,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1906\/revisions\/1911"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}