静态类同时具有如此多的请求

本文关键字:请求 静态类 | 更新日期: 2023-09-27 17:56:06

我创建了一个静态IP和日志类。IP 类找出用户的 IP 地址并记录类将其记录到文本文件中。每件事都很好,但我想知道如果同时收到这么多请求会发生什么?我的意思是这两个类都是静态的,并且基于静态类会导致问题。我该如何管理它们?这是我的 IP 类:

    public static class IP
    {
        public static string IP()
        {
            System.Web.HttpContext context = System.Web.HttpContext.Current;
            string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
            return context.Request.ServerVariables["REMOTE_ADDR"];
        }
    }
}

这是我写入文本文件的日志类的一部分:

        private static void WriteLine(string message)
    {
        string filePath = FilePath();
        CreateFile(filePath);
        try
        {
            using (StreamWriter log = File.AppendText(filePath))
                log.WriteLine(message);
        }
        catch (Exception)
        {
            //If can not access to file do nothing
            //throw;
        }
    }

静态类同时具有如此多的请求

由于类是静态的,您不会遇到争用问题。您的知识产权。IP() 方法类是纯的(即它不会改变任何内容的状态)并且不包含锁,因此不存在任何争用的可能性。

您在 WriteLine 中确实可能会遇到问题,因为您可能在执行工作时在同一线程上写入日志文件。这意味着文件写入充当锁,因为一次只能发生一次写入。

你想要的是记录到一个队列,然后将该队列写在一个单独的线程上;这是一种经典的生产者-消费者模式。

或者,您可以避免重新发明轮子,并使用现有的日志记录框架来为您处理这些事情,例如log4net

Streamwriter 的默认值为 4kb 缓冲区,如果需要,可以按以下方式进行修改:

public StreamWriter(
    Stream stream,
    Encoding encoding,
    int bufferSize
)

您的计算机(包括磁盘访问)很可能比您的互联网访问快得多。

它可以正常工作,因为您没有任何公共变量将保存在内存中并在每次访问类时更改。

因此,随着方法的结束,变量的作用域将完成。但是,如果它们在内存中,则不会受到同时使用多少用户的影响,并且不会造成混乱。