企业微信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)
{
//互斥内容
//...
}
}