Почему запись в файл в папке / bin / очищает MemoryCache? (C# ASP. NET) - PullRequest
0 голосов
/ 25 февраля 2020

Я столкнулся с интересным взаимодействием с записью в файл и 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();
    %>

...