Я столкнулся с интересным взаимодействием с записью в файл и MemoryCache. Я создал проект, чтобы продемонстрировать это взаимодействие. Код здесь
Когда вы посещаете страницу test.aspx
, она либо устанавливает, либо изменяет содержимое MemoryCache.Default
и печатает его в json. Вы можете постоянно обновлять, чтобы увидеть счетчик go, и он будет записывать в текстовый файл в каталоге проекта. Если вы go до test.aspx?action=break
, журнал записывается в папку bin
на сервере, где находятся все двоичные файлы. Когда это происходит, содержимое MemoryCache.Default
очищается. При следующей загрузке страницы в кэш будут напечатаны инициализированные значения. Почему сохранение в папку binaries очищает кеш? Соответствующий код:
public class RequestHandler
{
public static string Handle( HttpRequest request ) {
try {
GlobalCache.IncreaseInt();
GlobalCache.AppendHistory();
GlobalCache.Set("RequestType", request.RequestType);
string cacheJson = GlobalCache.ToJson();
string action = "write";
if (request.QueryString.AllKeys.Contains("action")) {
action = request.QueryString["action"];
}
if (action == "break") {
Logger.WriteButBreakCache(cacheJson);
} else {
Logger.Write(cacheJson);
}
return cacheJson;
} catch (Exception e) {
Dictionary<string, string> returnDict = new Dictionary<string, string> {
{ "error", "Woops" },
{ "Exception", e.ToString() }
};
return JsonConvert.SerializeObject(returnDict);
}
}
}
public class GlobalCache
{
public static MemoryCache Cache = MemoryCache.Default;
public static void Set (string key, object value) {
Cache.Set(key, value, DateTime.Now.AddMinutes(5));
}
public static void IncreaseInt() {
string key = "Int";
if (Cache.Contains(key)) {
int number = (int) Cache.Get(key);
Cache.Set(key, ++number, DateTime.Now.AddMinutes(5));
} else {
Cache.Set(key, 0, DateTime.Now.AddMinutes(5));
}
}
public static void AppendHistory() {
if (Cache.Contains("History")) {
var history = (List<object>) Cache.Get("History");
history.Add(DateTime.Now);
Cache.Set("History", history, DateTime.Now.AddMinutes(5));
} else {
Cache.Set("History", new List<object>() { DateTime.Now }, DateTime.Now.AddMinutes(5));
}
}
public static string ToJson() {
var dict = new Dictionary<string, object>();
foreach (var item in Cache) {
dict.Add(item.Key, item.Value);
}
return JsonConvert.SerializeObject(dict);
}
}
public class Logger
{
public static void Write(string text) {
string directory = AppDomain.CurrentDomain.BaseDirectory; //Project directory.
string fileLocation = directory + "/Log.txt";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileLocation, true)) {
file.WriteLine(text);
}
}
public static void WriteButBreakCache(string text) {
string directory = AppDomain.CurrentDomain.BaseDirectory + "\\bin\\"; //Project directory.
string fileLocation = directory + "/Log.txt";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileLocation, true)) {
file.WriteLine(text);
}
}
}
И страница для запуска это просто печать, вызывающая RequestHandler.Handle ().
<%@ Page Language="C#"%>
<%
string response = MemoryCacheDemo.RequestHandler.Handle(Request);
Response.ContentType = "application/json";
Response.Write(response);
//Response.End();
this.ApplicationInstance.CompleteRequest();
%>