1.web.dll缓存替换(解决某些情况下无限发送给客户推送消息)坑
2.屏蔽微信更新窗口关闭 3.优化url检测 4.其他
This commit is contained in:
parent
9d7a615a7f
commit
34057c91dd
|
@ -0,0 +1,156 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace System.Windows.Forms
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public static class ControlExtension
|
||||||
|
{
|
||||||
|
//private static NLog.ILogger log = NLog.LogManager.GetLogger("ControlExtension");
|
||||||
|
/// <summary>
|
||||||
|
/// 控件跨线程访问
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiElement"></param>
|
||||||
|
/// <param name="updater"></param>
|
||||||
|
/// <param name="forceSynchronous"></param>
|
||||||
|
/// <param name="isOutputLog"></param>
|
||||||
|
public static void SafeInvoke(this Control uiElement, Action updater, bool forceSynchronous = true,bool isOutputLog=true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (uiElement == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("uiElement");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uiElement.InvokeRequired)
|
||||||
|
{
|
||||||
|
if (forceSynchronous)
|
||||||
|
{
|
||||||
|
uiElement.Invoke((Action)delegate { SafeInvoke(uiElement, updater, forceSynchronous); });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uiElement.BeginInvoke((Action)delegate { SafeInvoke(uiElement, updater, forceSynchronous); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (uiElement.IsDisposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
throw new ObjectDisposedException("Control is already disposed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
updater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (isOutputLog)
|
||||||
|
{
|
||||||
|
//log.Error(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 控件跨线程访问
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="uiElement"></param>
|
||||||
|
/// <param name="updater"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <param name="forceSynchronous"></param>
|
||||||
|
/// <param name="isOutputLog"></param>
|
||||||
|
public static void SafeInvoke<T>(this Control uiElement, Action<T> updater, T data, bool forceSynchronous = true, bool isOutputLog = true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (uiElement == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("uiElement");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uiElement.InvokeRequired)
|
||||||
|
{
|
||||||
|
if (forceSynchronous)
|
||||||
|
{
|
||||||
|
uiElement.Invoke(updater, data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uiElement.BeginInvoke(updater, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (uiElement.IsDisposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
throw new ObjectDisposedException("Control is already disposed.");
|
||||||
|
}
|
||||||
|
updater(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (isOutputLog)
|
||||||
|
{
|
||||||
|
//log.Error(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自动禁止启动执行
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiElement"></param>
|
||||||
|
/// <param name="updater"></param>
|
||||||
|
/// <param name="hintText"></param>
|
||||||
|
public static void SafeEnabledInvoke(this ToolStripItem uiElement, Action updater, string hintText = "正在执行.")
|
||||||
|
{
|
||||||
|
string value = uiElement.Text;
|
||||||
|
uiElement.Enabled = false;
|
||||||
|
uiElement.Text = hintText;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
updater();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//log.Error(ex);
|
||||||
|
}
|
||||||
|
uiElement.Text = value;
|
||||||
|
uiElement.Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自动禁止启动控件执行
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiElement"></param>
|
||||||
|
/// <param name="updater"></param>
|
||||||
|
/// <param name="hintText"></param>
|
||||||
|
public static void SafeEnabledInvoke(this Control uiElement, Action updater,string hintText= "正在执行.")
|
||||||
|
{
|
||||||
|
uiElement.Enabled = false;
|
||||||
|
string value = uiElement.Text;
|
||||||
|
uiElement.Text = hintText;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
updater();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//log.Error(ex);
|
||||||
|
}
|
||||||
|
uiElement.Text = value;
|
||||||
|
uiElement.Enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -156,6 +156,7 @@
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="ControlExtension.cs" />
|
||||||
<Compile Include="EasySoc_.cs" />
|
<Compile Include="EasySoc_.cs" />
|
||||||
<Compile Include="Entitys\Display_Real.cs" />
|
<Compile Include="Entitys\Display_Real.cs" />
|
||||||
<Compile Include="Entitys\Enterprise\CreateGroupInfo.cs" />
|
<Compile Include="Entitys\Enterprise\CreateGroupInfo.cs" />
|
||||||
|
|
|
@ -817,7 +817,30 @@ namespace PCRobot
|
||||||
//刷新机器人列表
|
//刷新机器人列表
|
||||||
private void RefUserMethod(WechatUser user)
|
private void RefUserMethod(WechatUser user)
|
||||||
{
|
{
|
||||||
this.Invoke(new Action(delegate
|
//this.Invoke(new Action(delegate
|
||||||
|
//{
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// this.listView1.Items.Clear();
|
||||||
|
// int i = 1;
|
||||||
|
// foreach (var item in WechatClient.Users.Values.ToList())
|
||||||
|
// {
|
||||||
|
// var view = new ListViewItem(new string[] { i.ToString(), item.Wxid, item.Nickname, item.Type == WechatType.Xiaoxie_QY ? "企业" : "个人", WechatClient.GetApi(item.Wxid).GetVersion(), "正式" });
|
||||||
|
// view.Tag = item;
|
||||||
|
// this.listView1.Items.Add(view);
|
||||||
|
// i++;
|
||||||
|
// //if (item.Type == WechatType.Xiaoxie)
|
||||||
|
// // //BakWechatInfo(item.Wxid, item.Nickname);
|
||||||
|
// // WechatLoginHelper.EndbeginLogin(item.Wxid, item.Nickname);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// LogHelper.GetSingleObj().Error("RefUserMethod", ex.Message + " " + ex.StackTrace);
|
||||||
|
// }
|
||||||
|
//}));
|
||||||
|
|
||||||
|
this.SafeInvoke(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -838,7 +861,8 @@ namespace PCRobot
|
||||||
{
|
{
|
||||||
LogHelper.GetSingleObj().Error("RefUserMethod", ex.Message + " " + ex.StackTrace);
|
LogHelper.GetSingleObj().Error("RefUserMethod", ex.Message + " " + ex.StackTrace);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///// <summary>
|
///// <summary>
|
||||||
|
|
|
@ -2189,6 +2189,8 @@ namespace PCRobot.PCWechat.Enterprise
|
||||||
var path = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}");
|
var path = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}");
|
||||||
LogHelper.GetSingleObj().Debug("注入前", $"DPath = {DllPath},Path = {path}");
|
LogHelper.GetSingleObj().Debug("注入前", $"DPath = {DllPath},Path = {path}");
|
||||||
return InjectWxWorkMultiOpen(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes(path));
|
return InjectWxWorkMultiOpen(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes(path));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1171,6 +1171,7 @@ namespace PCRobot.PCWechat.Routine
|
||||||
{
|
{
|
||||||
//if (CheckUrlCache.Count > 500) CheckUrlCache.Clear();
|
//if (CheckUrlCache.Count > 500) CheckUrlCache.Clear();
|
||||||
//{"data":{"status":-2005,"url":"https://ycs9d.kuaizhan.com/?id=07E4060844959"},"type":11123}
|
//{"data":{"status":-2005,"url":"https://ycs9d.kuaizhan.com/?id=07E4060844959"},"type":11123}
|
||||||
|
//{"data":{"real_url":"https://weixin110.qq.com/cgi-bin/mmspamsupport-bin/newredirectconfirmcgi?bancode=8ccb2264069bef5fdcc9c0719ad3798c5b88335ea2a12377abf9bd215e65cc76&click=4ae1648419d4a13e24536fa01e1ce6b4&bankey=114c01a82dc3cdd5885ea6c46628840d&midpagecode=e2faa0ee03e19e6efecf869b7f9ca052b990cded1c952f94349a5a44c082fae8e21c2209712a3ef61136eb6e471da12e&exportkey=n_ChQIAhIQ1tFi%2F1uM69z6NizdOhCl4xKMAgIE97dBBAEAAAAAAE6mNsznB%2BEAAAAOpnltbLcz9gKNyK89dVj0z8ETSi%2B0H%2BUFvmE6zliXCF5w8wK3uPU6uGcyAwcnqGEuj72wh8nSZ0yiZpu9ekd0%2F6b9880eC8%2BTQTRbNK%2Ft%2BSSQN5o517dJqrslUSNkuIfeaS7rvIMeBLf48eQCTjnPS6Bys93eks%2Bt0cNXGWqr4%2F9UCknIlhrDJyFq3jzUM2sfs5oJvLRx8sAKIRv84ENcYx2%2BduSZ3Ob7F2ZFyL43YTsbGs5%2Fkltid6uRi0PyeMT4hg3LzYcutcbh%2FNv1mSoIV2rvPguuNEtul%2BP1TRx9MMuRc9O%2B6dAeiVoXDq%2B1oYPtbthI6GE%3D&pass_ticket=m%2BTP5b10sYur0Fh%2BN4BeHqCfQCdC1ZHjLcceEAEikUhmhZGDPdAjv1ZY2xgZzlCvUDFrvY25t%2FNi4cBH8DffhA%3D%3D&wechat_real_lang=zh_CN&wx_header=0","status":-2005,"url":"http://6k7c8.kuaizhan.com"},"type":11123}
|
||||||
if (data["status"] != null)
|
if (data["status"] != null)
|
||||||
{
|
{
|
||||||
var url = data["url"]?.ToString();
|
var url = data["url"]?.ToString();
|
||||||
|
|
|
@ -1275,7 +1275,9 @@ namespace PCRobot.PCWechat.Routine
|
||||||
|
|
||||||
if (CacheHelper.Exist(url))
|
if (CacheHelper.Exist(url))
|
||||||
{
|
{
|
||||||
return CacheHelper.Get<int>(url);
|
var status = CacheHelper.Get<int>(url);
|
||||||
|
CacheHelper.Remove(url);
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
} while (awaitTime >= DateTime.Now);
|
} while (awaitTime >= DateTime.Now);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -75,7 +75,7 @@ namespace PCRobot.PCWechat
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取用户
|
/// 获取用户
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -138,7 +138,10 @@ namespace PCRobot.PCWechat
|
||||||
{
|
{
|
||||||
Users.Remove(user.Wxid);
|
Users.Remove(user.Wxid);
|
||||||
}
|
}
|
||||||
RefUserEvent?.Invoke(user);
|
|
||||||
|
Task.Run(() => { RefUserEvent?.Invoke(user); });
|
||||||
|
|
||||||
|
//RefUserEvent?.Invoke(user);
|
||||||
|
|
||||||
if ((IntPtr)user.Pid != IntPtr.Zero && kill)
|
if ((IntPtr)user.Pid != IntPtr.Zero && kill)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace PCRobot.Utils
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 本地缓存
|
||||||
|
/// </summary>
|
||||||
|
public class CacheHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
private static DateTime _nextRemoveDatetime = DateTime.Now.AddMinutes(30);
|
||||||
|
/// <summary>
|
||||||
|
/// 删除 过期
|
||||||
|
/// </summary>
|
||||||
|
private static void RemoveTimeOut()
|
||||||
|
{
|
||||||
|
if (DateTime.Now < _nextRemoveDatetime)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var array = _caches.Values.ToArray().Where(w => w.ExpirationTime < DateTime.Now).ToArray();
|
||||||
|
foreach (var v in array)
|
||||||
|
{
|
||||||
|
_caches.TryRemove(v.Key, out _);
|
||||||
|
}
|
||||||
|
_nextRemoveDatetime = DateTime.Now.AddMinutes(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class CacheItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存KEY
|
||||||
|
/// </summary>
|
||||||
|
public string Key { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 过期时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ExpirationTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 对象
|
||||||
|
/// </summary>
|
||||||
|
public object Object { get; set; }
|
||||||
|
}
|
||||||
|
private static readonly ConcurrentDictionary<string, CacheItem> _caches = new ConcurrentDictionary<string, CacheItem>();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置缓存,让这个程序的缓存全部失效
|
||||||
|
/// </summary>
|
||||||
|
public static void ResetCache()
|
||||||
|
{
|
||||||
|
_caches.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 增加缓存
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">key</param>
|
||||||
|
/// <param name="value">值</param>
|
||||||
|
/// <param name="time">值(秒)</param>
|
||||||
|
public static bool Add(string key, object value, int time = 60)
|
||||||
|
{
|
||||||
|
_caches.AddOrUpdate(key, (k) =>
|
||||||
|
{
|
||||||
|
return new CacheItem()
|
||||||
|
{
|
||||||
|
Key = k,
|
||||||
|
Object = value,
|
||||||
|
ExpirationTime = time < 0 ? DateTime.MaxValue : DateTime.Now.AddSeconds(time)
|
||||||
|
};
|
||||||
|
}, (k, v) =>
|
||||||
|
{
|
||||||
|
v.Object = value;
|
||||||
|
v.ExpirationTime = time < 0 ? DateTime.MaxValue : DateTime.Now.AddSeconds(time);
|
||||||
|
return v;
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取缓存数据(如果不存在返回默认值)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static T Get<T>(string key)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(key))
|
||||||
|
{
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
if (_caches.TryGetValue(key, out var result))
|
||||||
|
{
|
||||||
|
if (result.ExpirationTime < DateTime.Now)
|
||||||
|
{
|
||||||
|
_caches.TryRemove(key, out _);
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
return (T)result.Object;
|
||||||
|
}
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取缓存
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">key</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static object GetValue(string key)
|
||||||
|
{
|
||||||
|
RemoveTimeOut();
|
||||||
|
if (string.IsNullOrWhiteSpace(key))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (_caches.TryGetValue(key, out var result))
|
||||||
|
{
|
||||||
|
if (result.ExpirationTime < DateTime.Now)
|
||||||
|
{
|
||||||
|
_caches.TryRemove(key, out _);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return result.Object;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取缓存,不存在则新增
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="defFunc"></param>
|
||||||
|
/// <param name="time"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
public static T GetValueOrAdd<T>(string key, Func<T> defFunc, int time = 60) where T : class
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(key))
|
||||||
|
{
|
||||||
|
throw new Exception("缓存key不能为空");
|
||||||
|
}
|
||||||
|
if (string.IsNullOrWhiteSpace(key))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (_caches.TryGetValue(key, out var result))
|
||||||
|
{
|
||||||
|
if (result.ExpirationTime > DateTime.Now)
|
||||||
|
{
|
||||||
|
_caches.TryRemove(key, out _);
|
||||||
|
var obj = defFunc();
|
||||||
|
Add(key, obj, time);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
return (T)result.Object;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var obj = defFunc();
|
||||||
|
Add(key, obj, time);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
///移除缓存
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
public static void Remove(string key)
|
||||||
|
{
|
||||||
|
_caches.TryRemove(key, out _);
|
||||||
|
}
|
||||||
|
public static bool Exist(string key)
|
||||||
|
{
|
||||||
|
return _caches.ContainsKey(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -347,7 +347,7 @@ namespace PCRobot.Utils
|
||||||
ShieldingWeChatUpdateFunction();
|
ShieldingWeChatUpdateFunction();
|
||||||
|
|
||||||
//开启自动关闭微信更新进程
|
//开启自动关闭微信更新进程
|
||||||
StartCheckUpdateThread();
|
//StartCheckUpdateThread();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue