public async Task <ActionResult> Get(IpViewModel inputModel)
        {
            if (ModelState.IsValid)
            {
                IpCache cache = new IpCache();

                IpViewModel ipViewModel;

                if (cache.TryGetFromCache(inputModel.IP, out IpViewModel model))
                {
                    ipViewModel = model;

                    return(View("Index", ipViewModel));
                }


                //try ip2c Service
                int tries = 0;

                while (tries < 3)
                {
                    try
                    {
                        IService ip2cService = new Ip2cService();

                        ipViewModel = await ip2cService.TryGetIpViewModel(inputModel.IP);

                        ipViewModel.ProviderOrCacheUsed = "Ip2c";

                        return(View("Index", ipViewModel));
                    }
                    catch (TaskCanceledException)
                    {
                        tries += 1;
                    }
                    catch (HttpStatusCodeNotOKException)
                    {
                        tries += 1;
                    }
                    catch (IpIsValidButDoesNotCorrespondToAnyCountryException)
                    {
                        ViewData["ErrorMessage"] = "This Ip is valid but does not correspond to any country";
                        return(View("Index"));
                    }
                    catch (Exception)
                    {
                        tries += 1;
                    }
                }

                // try ipStack Service
                tries = 0;

                while (tries < 3)
                {
                    try
                    {
                        IService ipStackService = new IpStackService();

                        ipViewModel = await ipStackService.TryGetIpViewModel(inputModel.IP);

                        ipViewModel.ProviderOrCacheUsed = "IpStack";

                        return(View("Index", ipViewModel));
                    }
                    catch (TaskCanceledException)
                    {
                        tries += 1;
                    }
                    catch (HttpStatusCodeNotOKException)
                    {
                        tries += 1;
                    }
                    catch (IpIsValidButDoesNotCorrespondToAnyCountryException)
                    {
                        ViewData["ErrorMessage"] = "This Ip is valid but does not correspond to any country";
                        return(View("Index"));
                    }
                    catch (Exception)
                    {
                        tries += 1;
                    }
                }

                // this far all have failed so return null model
                ViewData["ErrorMessage"] = "Services Failed";
                return(View("Index"));
            }
            else
            {
                return(View("Index"));
            }
        }