静态类同时具有如此多的请求
本文关键字:请求 静态类 | 更新日期: 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
)
您的计算机(包括磁盘访问)很可能比您的互联网访问快得多。
它可以正常工作,因为您没有任何公共变量将保存在内存中并在每次访问类时更改。
因此,随着方法的结束,变量的作用域将完成。但是,如果它们在内存中,则不会受到同时使用多少用户的影响,并且不会造成混乱。