关于这个主题的几个问题/答案(仅列出我发现的一对。还有更多)。
感谢他们中的许多人,我想出了我希望能解决我问题的方法。我也可能是在思考它。我有一个api需要写入文本文件以进行日志记录。现在api被称为N +次,并且在每次调用期间,它需要记录请求。我不想做的是停止请求在返回所请求的数据之前必须等待记录日志。现在,日志不能只是被丢弃,因此如果文件当前正在使用,它必须也堆叠在每个请求上,使用ReaderWriterLock。然后,当文件没有被锁定时,我想写堆积的日志。
我已经想到它会满足要求,但我认为它仍会导致等待。
var wid = WindowsIdentity.GetCurrent().Token;
//add new log items
logs.Enqueue(helpers.createNewLog(requests));
string op;
while (logs.TryDequeue(out op))
{
using (WindowsIdentity.Impersonate(wid))
{
//write to text file, location on shared drive
var wrote = writers.WriteLog(op);
//item cannot be written since file locked, add back to queue to try again
if (!wrote)
{
logs.Enqueue(op);
}
}
}
日志是全球性的
private static ConcurrentQueue<string> logs = new ConcurrentQueue<string>();
我觉得有些事情是对的,但我正在努力解决这个问题,这将是满足要求并在网络服务器场中工作的最佳方式。
答案 0 :(得分:1)
在我看来,你应该使用BlockingCollection而不是ConcurrentQueue,这里有一个如何使用它作为Producer-Consumer的例子,你正在尝试做同样的事情。
现在使用ASP.Net可以插入模块来拦截每个请求,如果你想保存日志,我建议你注册一个模块,而不是按照你的方法。在Global.asax.cs上有一个Register方法
public class MvcApplication : System.Web.HttpApplication
{
public static void Register()
{
//registering an HttpModule
HttpApplication.RegisterModule(typeof(LogModule));
}
....
}
public class LogModule: IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.LogRequest += LogEvent;
}
private void LogEvent(object src, EventArgs args)
{
if (HttpContext.Current.CurrentNotification == RequestNotification.LogRequest)
{
if ((MvcHandler)HttpContext.Current.Handler != null)
{
Debug.WriteLine("This was logged!");
//Save the information to your file
}
}
}
}
希望这有帮助