我有图片上传洪水限制器:结构不缓存,但该类不
public class FloodLimiter
{
public static void OnImageUploaded(string ipAddress, int sizeBytes)
{
var dict = GetImageUploadFloodLimitDict();
if (!dict.ContainsKey(ipAddress))
{
dict.Add(ipAddress, new ImageUploadLimits());
}
dict[ipAddress].OnFileUploaded(sizeBytes);
}
public static bool CanUploadImages(string ipAddress)
{
var dict = GetImageUploadFloodLimitDict();
if (!dict.ContainsKey(ipAddress)) return true;
return dict[ipAddress].BelowLimits;
}
private static readonly object FloodLimitLock = new object();
/// <summary>
/// Dictionary of IP's, and total images uploaded + total image size uploaded
/// </summary>
private static Dictionary<string, ImageUploadLimits> GetImageUploadFloodLimitDict()
{
const string cacheIndex = Settings.CachePrefix + "ImageUploadFloodLimiter";
var context = HttpContext.Current;
if (context.Cache[cacheIndex] == null)
{
lock (FloodLimitLock)
{
if (context.Cache[cacheIndex] == null)
{
var dict = new Dictionary<string, ImageUploadLimits>();
context.Cache.Add(cacheIndex, dict, null, DateTime.Now.AddMinutes(Settings.ImageUpload.FloodLimitRecycleMinutes), Cache.NoSlidingExpiration, CacheItemPriority.AboveNormal, null);
}
}
}
return (Dictionary<string, ImageUploadLimits>)context.Cache[cacheIndex];
}
}
如果ImageUploadLimits
被定义为:
private struct ImageUploadLimits
{
private int _totalImagesUploaded;
private int _totalBytesUploaded;
public bool BelowLimits { get {
return _totalImagesUploaded < Settings.ImageUpload.MaximumImagesCanUploadInPeriod && _totalBytesUploaded < (Settings.ImageUpload.MaximumImageUploadMbInPeriod * 1000000);
}}
public void OnFileUploaded(int sizeBytes)
{
_totalImagesUploaded ++;
_totalBytesUploaded += sizeBytes;
}
}
缓存从不更新(它总是返回1图片上传)。
如果我定义为ImageUploadLimits
:
private class ImageUploadLimits
{
private int _totalImagesUploaded;
private int _totalBytesUploaded;
public bool BelowLimits { get {
return _totalImagesUploaded < Settings.ImageUpload.MaximumImagesCanUploadInPeriod && _totalBytesUploaded < (Settings.ImageUpload.MaximumImageUploadMbInPeriod * 1000000);
}}
public void OnFileUploaded(int sizeBytes)
{
_totalImagesUploaded++;
_totalBytesUploaded += sizeBytes;
}
}
它工作得很好!
为什么struct
版本不缓存?这是否与Structs
通过Val和Classes
byRef有关?
你刚刚发现为什么制作可变结构是一个不好的做法。 –