iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
1
Everything on Azure

三十天.NET❤️Azure漸進式開發專案系列 第 10

三十天.NET與Azure漸進式開發專案(10):使用Azure Redis(上)-建立、使用

三十天.NET與Azure漸進式開發專案(10):使用Azure Redis(上)-建立、使用

Azure建立Redis方式

選擇Redis快取 -> 建立Redis快取
2018-10-15.22.07.38-image.png
測試使用C0專案就可以,接著等待一段時間建立完成
2018-10-15.22.07.42-image.png

.NET Core使用Azure Redis

需要使用 Microsoft.Extensions.Caching.Redis NuGet套件
2018-10-15.22.07.47-image.png
存取金鑰複製連接字串,貼在appsettings.json建立的connectionStrings屬性內
2018-10-15.22.07.52-image.png
並在Startup.cs添加使用AddDistributedRedisCache讀取Configuration.GetConnectionString取出的連接字串註冊服務

            services.AddDistributedRedisCache(option =>  
            {  
                option.Configuration = Configuration.GetConnectionString("RedisConnection");  
                option.InstanceName = "master";  
            });  

做完以上步驟,接著使用Redis功能,以下為舉例
1.藉由簡單GetString、SetString示範總瀏覽數
2.接著進階示範做出:當使用者一分鐘內送出10個請求,警告使用者**"你已經被禁止瀏覽本網頁一分鐘"**
需要使用到Json(反)序列化,將Redis讀取到的字串轉回物件方便使用。
並藉由SetSlidingExpiration設定生命週期,這邊設為一分鐘壽命,達到使用者一分鐘限制功能。

    public class HomeController : Controller  
    {  
        private IDistributedCache _cache;  
  
        public HomeController(IDistributedCache cache)  
        {  
            _cache = cache;  
        }  
  
        public IActionResult Index()  
        {  
            //====示範儲存資料,每一次使用者進來網頁點閱數+1====  
            string clickCount = _cache.GetString("ReqeustCount") ?? "0";  
            _cache.SetString("ReqeustCount", AddOneClick(clickCount));  
            ViewData["ReqeustCount"] = clickCount;  
  
            //====示範:瀏覽使用者IP瀏覽次數,當使用者短時間瀏覽次數多送出請告,使用JSON(反)序列化集合物件====  
            var ip = GetClientUserIp(HttpContext);  
            var userIP = _cache.GetString($"userIP_{ip}") ==null ? new UserIP()  
            {  
                IP = ip,ReqeustCount=0  
            }: Newtonsoft.Json.JsonConvert.DeserializeObject<UserIP>(_cache.GetString($"userIP_{ip}"));  
            userIP.ReqeustCount = userIP.ReqeustCount + 1;  
  
            //如果1分鐘內送出10次請求,列為黑名單  
            if(userIP.ReqeustCount > 10)  
            {  
                return Content("你已經被禁止瀏覽本網頁一分鐘");  
            }                 
            var options = new DistributedCacheEntryOptions();  
            options.SetSlidingExpiration(TimeSpan.FromMinutes(1));  
            _cache.SetString($"userIP_{ip}", Newtonsoft.Json.JsonConvert.SerializeObject(userIP), options);  
            ViewData["userIP"] = userIP;  
            return View();  
        }  
  
  
        private string AddOneClick(string clickCount)  
        {  
            clickCount = $"{(int.Parse(clickCount) + 1)}";  
            return clickCount;  
        }  
  
        private string GetClientUserIp(HttpContext context)  
        {  
            var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();  
            if (string.IsNullOrEmpty(ip))  
            {  
                ip = context.Connection.RemoteIpAddress.ToString();  
            }  
            return ip;  
        }  
    }  
  

效果圖

正常請求畫面
2018-10-15.22.08.02-image.png
超過十次請求後畫面
2018-10-15.22.08.07-image.png


上一篇
三十天.NET與Azure漸進式開發專案(9):"輕量級Azure需求"的階段性總結
下一篇
三十天.NET與Azure漸進式開發專案(11):使用Azure Redis(下) - 為甚麼要使用
系列文
三十天.NET❤️Azure漸進式開發專案30

尚未有邦友留言

立即登入留言