使用静态字典时,我在 ASP.NET 中收到错误“项目已添加”

本文关键字:错误 项目 项目已添加 添加 字典 静态 NET ASP 我在 | 更新日期: 2023-09-27 18:31:05

当我使用 f10 调试代码时,它可以正常工作!但是在运行时我收到此错误:"已添加具有相同键的项目"

请帮忙

我的字典 :

public static Dictionary<string, string> ImageFilePath
        = new Dictionary<string, string>();

在同一个 Glob 中使用.cs我的函数:

public static Image ShowImageOnColumn(string Value,byte ImageHeigth,byte ImageWidth)
{
   .
   .
   .
    string FilePath = "",ImgId = "";

    Image img_ = new Image();
    Random rnd = new Random();
    ImgId = rnd.Next(100000000).ToString();
    img_.ImageUrl = "ShowImageInRuntime.aspx?FileName=" + ImgId;
    ImageFilePath.Add(ImgId, FilePath);

    img_.Height = Unit.Pixel(ImageHeigth);
    img_.Width = Unit.Pixel(ImageWidth);
    return img_;
   }

使用静态字典时,我在 ASP.NET 中收到错误“项目已添加”

你没有保护你的ImageFilePath.Add呼叫。如果密钥已经存在,您将收到一个异常,说明同样多。

您可以检查密钥:

if (ImageFilePath.ContainsKey(ImgId))
{
    ImageFilePath[ImgId] = FilePath;
}

或者您可以在索引上设置,如果缺少索引,这将添加,如果存在,则更新:

ImageFilePath[ImgId] = FilePath;

而不是调用添加。

但请注意,当 IIS 回收工作进程时,静态成员可能会丢失。因此,它们往往被避免。还存在多线程问题,因为静态成员在整个进程中可见。

如果您需要随机文件名,请尝试DateTime.ToString("ddMMyyyyhhmmssfff")Guid.NewGuid(),而不是保持Random实例处于活动状态。

Path还具有GetTempFileName方法。

这是因为每次使用函数并重新启动随机种子时都会实例化Random类。在单例中实例化Random,可能在类构造函数中,每次调用时都会有一个有效的 uniq(ish) 号码。

我还建议,随机不是唯一的,对于唯一值,您很可能希望使用哈希算法。

使用 Guid.NewGuid().ToString("N") 而不是 Random 数。这将确保没有碰撞。此外,给出有关静态成员使用的思考过程。它们在多个线程之间共享,当多个用户同时访问您的网站时,您可能会遇到线程安全问题。

在将密钥添加到字典之前检查密钥是否已存在

if (!ImageFilePath.ContainsKey(ImgId))                     
{
    ImageFilePath.Add(ImgId,FilePath); 
}