.NET 6中读写txt文件内容实现企业微信Token缓存

142 阅读1分钟

企业微信token有效期是两个小时,获取token之后存缓存,如果缓存没有了就需要重新获取;下面我们来看下如何使用txt本地文件实现这个功能点。

定义写入文件的方法

 #region 写入文件 如果存在该文件就递加,如果不存在就新建

        /// <summary>
        /// 写入文件
        /// </summary>
        /// <param name="Path">文件路径</param>
        /// <param name="content">文件内容</param>
        //调用示例
        //string webRootPath = _hostingEnvironment.WebRootPath;  //获取相对路径
        //string strUploadPath = webRootPath + "/Document/";
        //string fileLogName = "错误日志" + DateTime.Now.ToLongDateString() + "Log.txt";
        //WriteFile(strUploadPath + fileLogName, "测试内容");
        private static void WriteFile(string path, string content)
        {
            if (!System.IO.File.Exists(path))
            {
                System.IO.FileStream f = System.IO.File.Create(path);
                f.Close();
            }
            System.IO.StreamWriter f2 = new System.IO.StreamWriter(path, false, System.Text.Encoding.GetEncoding("gb2312"));
            f2.WriteLine(content);
            f2.Close();
            f2.Dispose();
        }

        #endregion 写入文件 如果存在该文件就递加,如果不存在就新建

读取txt内容,并且判断有效期

 

        private static string gettoken()
        {
            var filePath = $"/App_Data/";
            string applicationRoot = AppContext.BaseDirectory;
            var provider = new PhysicalFileProvider(applicationRoot);
            var completeFilePath = Path.Combine(filePath, "token.txt");
            if (!System.IO.File.Exists(AppContext.BaseDirectory + completeFilePath))
            {
                return "-1";
            }
            var formFile = provider.GetFileInfo(completeFilePath);
            var stream = formFile.CreateReadStream();
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            Encoding encoding = Encoding.GetEncoding("gb2312");
            using var reader = new StreamReader(stream, encoding);
            var r = JsonConvert.DeserializeObject<GettokenRoot>(reader.ReadToEnd());
          

有效期过了,需要重新获取,然后再重新写入

  if (r.expiresDateTime > DateTime.Now)
            {
                Senparc.Weixin.WeixinTrace.SendApiLog("读取token", "现有的");

                return r.access_token;
            }
            else
            {
                var client = new RestClient("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CorpId + "&corpsecret=" + corpsecret);
                client.Timeout = -1;
                var request = new RestRequest(Method.GET);
                IRestResponse response = client.Execute(request);
                Console.WriteLine(response.Content);
                var result = JsonConvert.DeserializeObject<GettokenRoot>(response.Content);
                result.expiresDateTime = DateTime.Now.AddSeconds(7100);

                Senparc.Weixin.WeixinTrace.SendApiLog("读取token", "新的");

                string path = AppContext.BaseDirectory + $"/App_Data/token.txt";
                WriteFile(path, JsonConvert.SerializeObject(result));

                return result.access_token;
            }

            return "-1";
        }

这里需要注意的是需要防止多线程并发导致的击穿问题,这里可以使用lock解决

private static readonly object lockObj= new object();

public string Test()
{
    lock (lockObj)
    {
    //互斥内容
    //...
    }
}