How To Use In-Memory Cache In An ASP.NET Core Web API

Before we can dive into the In-Memory Cache implementation, first, What is caching and when you should consider using it?

Well, caching is basically a technique of storing frequently used data in a temporary storage. Caching can significantly improve the performance and scalability of any application by reducing the time and resources required to load fresh contents. Using that technique will definitely make the end user much happier to use the app.

Types of Caching supported by ASP.Net Core

As you might already know ASP.NET Core supports different types of caching such as In-Memory Cache, Distributed Cache and Response Cache. However, in this post I will take the opportunity to introduce you to how to use In-Memory Cache in an ASP.Net Core Web API app.

How data is stored

When using the In-Memory Cache feature, the data is stored in the memory of Web Server where a web application is being hosted at. It’s good to remember that an application can be hosted on single Server or multiple Servers in a Server Farm. For those of you that have a single server, you should be just fine using In-Memory Cache with no issues because it doesn’t require much to get running, however, if those running on multiple servers on a server farm MUST ensure that the sessions are sticky.

Setting cache expiration time

When adding an item to the cache you set an expiration, this can be an absolute time, a sliding window or the combination of both. Choosing which one to use depends on your scenario.

Example of how to implement In-Memory Cache

To keep thing simple and easy to follow I am going to implement a quick sample API to retrieve the states name using state abbreviation as code. In order to get start simple create a new blank WEB API project in Visual Studio and follow the steps below to fill in the required pieces or you can download the full sample code from github here.

Injecting the dependency from the startup.cs.

    public void ConfigureServices(IServiceCollection services)

Now that the In-Memory Cache service has been added, I can access the cache from inside the controllers by simply injecting an IMemoryCache parameter in the constructors.

    private readonly IMemoryCache _cache;

    public StatesController(IMemoryCache memoryCache)
      _cache = memoryCache;

Get Method setup

Next, I need to set my cache inside the get action method which is used to get the name of the state that matches the search criteria.

   public async Task Get(string stateCode)
      string state = string.Empty;
      if (!_cache.TryGetValue("CashedStatesList", out Dictionary states))
       Console.WriteLine("Loading from database or json file into cache");

        states =
           await System.IO.File.ReadAllTextAsync("StatesList.json"));

        MemoryCacheEntryOptions options = new MemoryCacheEntryOptions
         AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(300), // cache will expire in 300 seconds or 5 minutes
         SlidingExpiration = TimeSpan.FromSeconds(60) // cache will expire if inactive for 60 seconds

        if (states != null)
        _cache.Set("CashedStatesList", states, options);
         Console.WriteLine("***Data Found in Cache...***");

      if (states != null)
         state = states.GetValueOrDefault(stateCode);

         if (string.IsNullOrEmpty(state))
           state = "Not found, please try again.";


      if (string.IsNullOrEmpty(state))
         return NoContent();
      return Ok(state);

Reading from data source

In the code snippet above as you can see the very first if condition is checking against the cache dictionary object to load the states list if exist, otherwise, it will continue and load the states from the json file. To be clear here’s the snippet of code that reads the json file and load the states list.

  states =
           await System.IO.File.ReadAllTextAsync("StatesList.json"));

Set cache expiration

Then, once the data was cached, I set some times to when it will expire which is 5 minutes and if no activity they will expire in 60 seconds. You can set these values according to your requirements.

   MemoryCacheEntryOptions options = new MemoryCacheEntryOptions
     AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(300), // cache will expire in 300 seconds or 5 minutes
     SlidingExpiration = TimeSpan.FromSeconds(60) // cache will expire if inactive for 60 seconds

Then, if you continue reading the code above you will notice where the cache is being set as expected.
Last, as you can see from this simple example, the In-Memory cache is can be very beneficial when hosting an application on a single Server. It stores data on Server and improves application performance. Don’t forget to test your app to not depend solely on cached data.
In case you would like to read more about In-Memory cache, please visit these links below.
Cache in-memory in ASP.NET Core

WordPress Installed in Sub Directory on Windows Server Not Loading

Experience with WordPress windows-server

Setting up and running a WordPress content management system on a Windows Server isn’t always as simple as its Unix counterpart. There’s always something that could go wrong and course I had a pretty interesting experience setting a blog on one of the website I am working on.
Well, I have been working on an ASP.Net Core web application, I wanted to install WordPress in a sub directory to add a blog to the site. At first I thought it would be simple to do so, but I ran into issues after I had installed and setup the whole blog.

WordPress windows-server Error

Well, the problem I was having was that when navigating to the folder which WordPress was installed, I was getting a 404 error as shown below.

This page can’t be found No webpage was found for the web address:


In order to resolve this issue I have read a few post describing the possible cause which was related to the .htaccess file that could be missing on the server. Well, since this was a Windows box, there was a web.config file instead.

I then updated the web.config file on the server with the following content and voila it works. Simply replace “yourdomainname” text with your actual domain.

<?xml version="1.0" encoding="UTF-8"?>
	 <rule name="WordPress:" patternSyntax="Wildcard">
	   <match url="*"/>
		  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
		  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
		<action type="Rewrite" url="index.php"/>
      <remove name="aspNetCore"/>
    <aspNetCore processPath="dotnet" arguments=".\yourdomainname.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"/>

RichTextBox Example using Free TinyMCE Editor In ASP.Net Core

In this post, I’d like to take the opportunity to explain briefly how to use the TinyMCE plugin to add Rich TextBox feature to your .Net application. For this specific example I am currently using .Net Core 2.0. Don’t worry if you’re on an earlier .Net version because the implementation is about the same.

First of all, we need a project to be created. I’ll call it TinyMCEDemo which is available on github if you would like to download.
tinymce demo project
Once the project is created, run it and make sure there’s no issues.
For this project I am adding a new Model object called “Book” and a new controller called BooksController. We’ll use the create view to add the book form.

namespace TinyMCEDemo.Models
    public class Book
        public string Title { get; set; }
        public string Author { get; set; }
        public string Description { get; set; }

After adding the new books controller, run the project and you should see the following book form as shown below.

Now, to install the plugin the simplest way to do so is to reference the CDN endpoint at this location below by adding it to the layout.cshtml file before the site.js reference file.

  <script src=''></script>

Next update the site.js file with the following scripts below.

Since TinyMCE lets you identify replaceable elements via a CSS selector, all you need to do is pass an object that contains a selector to tinymce.init().

In this example, let’s replace all ‘textarea(s)’ with a TinyMCE editor instance by passing the selector ‘textarea’ to tinymce.init() which will enable tinymce to all all textarea in the application.

(function ($) {
    "use strict";
    $(document).ready(function () {
            selector: 'textarea'


Run the project now and the description should now render the Rich Text format as shown below. If you have any issues please let me know and I’ll try my best to help.

Download TinyMCEDemo Project Here

The current CSharpHelper cannot scaffold literals of type ‘Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding’. Configure your services to use one that can

I am working on a .Net Core 2 application today and tried to apply Add-Migration after I had rollback to an earlier version. Something I’ve done many times with no issues and all the sudden I started seeing this error message below. After researching it for a few minutes, I was able to resolve it pretty quickly. Below are the error message and what was done to rectify it.

      No migrations were applied. The database is already up to date.
System.InvalidOperationException: The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding'. Configure your services to use one that can.
   at Microsoft.EntityFrameworkCore.Design.Internal.CSharpHelper.UnknownLiteral(Object value)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateAnnotation(IAnnotation annotation, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityTypeAnnotations(String builderName, IEntityType entityType, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityType(String builderName, IEntityType entityType, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityTypes(String builderName, IReadOnlyList`1 entityTypes, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.Generate(String builderName, IModel model, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGenerator.GenerateMetadata(String migrationNamespace, Type contextType, String migrationName, String migrationId, IModel targetModel)
   at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(String migrationName, String rootNamespace, String subNamespace)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding'. Configure your services to use one that can.

Below is the solution which I have applied. Simply install this package below

Install-Package Microsoft.EntityFrameworkCore.Design

Once done, I was able to run add-migration with no problem as seen below.

      Entity Framework Core 2.1.4-rtm-31024 initialized 'ApplicationDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
      Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'__EFMigrationsHistory');
      Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'__EFMigrationsHistory');
      Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT [MigrationId], [ProductVersion]
      FROM [__EFMigrationsHistory]
      ORDER BY [MigrationId];
      No migrations were applied. The database is already up to date.
To undo this action, use Remove-Migration.

Microsoft Azure: Services Still Down, What’s Going On?

I woke up today to check one of my websites hosted on Microsoft Azure to see a blank page staring at me. I did some preliminary check to make sure I did not break the site over night. Then, I turned to Twitter to see if there’s anything trending about Azure, of course there I found all production services and websites hosted on Azure in the South Central US were down. I tried to access the Azure portal that did not work either, so I could try out anything to remedy the problem.

Below are the updates on the progress for the issue:

Microsoft Azure – Impacted service(s)

Network Infrastructure; Azure Active Directory; SQL Database; Storage; App Service
Impacted region(s)
South Central US; Global
Last update (59 min ago)
CUSTOMER IMPACT: There are currently three identified impact workstreams:

1) Customers with resources in South Central US may experience difficulties connecting to resources hosted in this region. A complete list of impacted services can be found below.
2) Customers using non-regional services, such as Azure Active Directory, may experience intermittent authentication failures in any region.
3) Customers may encounter errors when provisioning new subscriptions.


1) A severe weather event, including lightning strikes, occurred near one of the South Central US datacenters. This resulted in a power voltage increase that impacted cooling systems. Automated datacenter procedures to ensure data and hardware integrity went into effect and critical hardware entered a structured power down process.
2) As a result, non-regional services, such as Azure Active Directory, encountered an operational threshold for processing requests through the South Central US datacenter. Initial attempts to fail over into other datacenters resulted in temporary traffic congestion for those regions.

ENGINEERING STATUS: Engineers continue to implement the necessary mitigation steps. They have outlined a tentative mitigation workflow:

1) Restore power to the South Central US datacenter (COMPLETED)
2) Recover software load balancers for Azure Storage scale units in South Central US (COMPLETED)
3) Recover impacted Azure Storage scale units in South Central US (In Progress)
4) Recover the remaining Storage-dependent services in South Central US (In Progress)

This mitigation workflow is tentative and subject to change as events develop.

NEXT UPDATE: The next update will be provided by 02:00 UTC 05 Sep 2018 or as events warrant.

Last, I thought I’d share this tweet sent by someone who is also affected by this outage.

How to consume a RESTful API in C#

As a developer you will find yourself in need to consume complex RESTful API as you move forward in your career, so understanding a very basic on might help you get a step ahead. In this short post I will take the opportunity to share how to use the HttpClient class to consume RESTFUL APIs in a C# projects.

What is RESTful API?

Before I proceed into coding, I figured it would be best to describe briefly what exactly is a RESTful API, especially if you just started in web development.
I will try to keep it as simple as possible, so a RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. For instance, most of the services provided by companies such as Google, Facebook, Twitter have their own API which they expose to other third party companies to get information.

HttpClient Class

HttpClient provides a flexible and extensible API for accessing things exposed through HTTP, which fits perfectly a RESTful API.
Make sure to avoid coding your httpClient call as followed, because you run the risk of having System.Net.Sockets.SocketException due to the connection that is being disposed.

using(var client = new HttpClient())

Make sure to create a single instance of HttpClient in your program since that will help reduce waste of sockets.

Below is a simple console application I’ve put together to read data out of a RESTFUL API for managing a list of country data, such as capital, language, flag image, and currencies which you can download from github and test it yourself.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Web;

namespace ReadCountryData
class Program
public class Currency
public string Code { get; set; }

public string Name { get; set; }

public string Symbol { get; set; }

public class Country
public List Currencies { get; set; }

public string Name { get; set; }

public string Capital { get; set; }

static void Main(string[] args)
HttpClient http = new HttpClient();

string baseUrl = "";

string queryFilter = "?fields=name;capital;currencies";

Console.WriteLine("Enter your country name:");

string searchTerm = Console.ReadLine();

string url = baseUrl + searchTerm + queryFilter;

HttpResponseMessage response = http.GetAsync(new Uri(url)).Result;

string responseBody = response.Content.ReadAsStringAsync().Result;

var countries = JsonConvert.DeserializeObject>(responseBody);


public static void PrintCountryInfo(List countries)
int counter = 0;

foreach (var country in countries)

Console.WriteLine("#" + counter);

Console.WriteLine("Country Name:" + country.Name);

Console.WriteLine("Country Capital:" + country.Capital);

foreach (var currency in country.Currencies)
Console.WriteLine("Country Currency:" + currency.Name);

Console.WriteLine("Country Code:" + currency.Code);

Console.WriteLine("Country Symbol:" + currency.Symbol);



So, I hope this post help clear some of doubts you had when it comes to consuming a simple RESTful API in C#.

Testing a resful Web API Using Postman

Recently I have worked on how to create a simple Web API service to manage a list of country capitals. I thought it would be beneficial to some if I put together a quick post to show how to test it using postman.

What is Postman?
Postman is a free API debugging tool which makes working with APIs faster and a bit easier. If you don’t already have it installed, feel free to download it so you can follow along.

How do you get Postman?
Postman is free and you can download it at ““. Simple download it and following the instructions for the installation. After successful installation, open it and select HTTP Method and enter the URL of the Web API as shown below.

We’ll test the following commands:


HTTP Verbs

















Get all countries

Get a specific country by ID

Add a new country

Update an existing country

Delete a country


POST API/Countries

Let’s add a few countries to the list.

"name": "Afghanistan",


GET API/Countries

I have submitted 6 countries. Let’s get the list of countries that were submitted using the GET verb in Postman.

GET API/Countries/{id}

To find a specific country I need to fetch it by sending the ID in the URL. See below for more.

PUT API/Countries/{id}

Let say I want to change the first country information because of an typo or maybe I just want to change it to a whole different country.
I need to send a PUT to do so.

Let’s verify to see if the first country in the list has been changed.

DELETE API/Countries/{id}

Now let’s try the delete to see what happens.

After deleting country 1, 2, 3,and 4 we now have 2 countries left.