.NET Core 3.1 (grudzień 2020)

Seria pytań uczestników, które pojawiły się podczas szkolenia .NET Core 3.1 realizowanego w dniach 7-11.12.2020 r.



W jaki sposób wykrywać zmiany plików w katalogu?

Do śledzenia plików służy klasa FileSystemWatcher z przestrzeni System.IO.

Wystarczy utworzyć instancję tej klasy oraz podpiąć się pod zdarzenia:

Created - plik został utworzony
Changed - zawartość pliku została zmieniona
Renamed - nazwa pliku uległa zmianie
Deleted - pliku został usunięty

Uwaga: należy włączyć obsługę tych zdarzeń:

EnableRaisingEvents = true;

gdyż w przeciwnym przypadku nie będzie działać.

Dodatkowo możemy filtrować pliki, które nas interesują, np. txt i bmp

Przykład:

private static void MonitorDirectory(string directory)
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
fileSystemWatcher.Path = directory;
// fileSystemWatcher.Filter = "*.txt";

fileSystemWatcher.Filters.Add("*.txt");
fileSystemWatcher.Filters.Add("*.bmp");

fileSystemWatcher.Created += FileSystemWatcher_Created;
fileSystemWatcher.Changed += FileSystemWatcher_Changed;
fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

fileSystemWatcher.EnableRaisingEvents = true;

}

private static void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();

}

private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();

}

private static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();

}

private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();

}

W jaki sposób ograniczyć ruch przychodzący?

Można zaimplementować własny Middleware lub skorzystać z gotowej biblioteki AspNetCoreRateLimit.

Liczniki można przechowywać w pamięci, albo w bazie danych REDIS dzięki czemu nasze rozwiązanie będzie bardziej skalowalne.

Biblioteka AspNetCoreRateLimit wspiera REDIS:
https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/Using-Redis-as-a-distributed-counter-store

Więcej na temat samego REDIS'a można przeczytać tutaj.

W jaki sposób rozesłać informację z SQLServer na podstawie warunku?

Proponuję skorzystać z klasy SqlDependency:

https://docs.microsoft.com/pl-pl/dotnet/framework/data/adonet/sql/detecting-changes-with-sqldependency

Należy włączyć Service Broker w SQL Server
ALTER DATABASE MyDatabase SET ENABLE_BROKER
http://elvanydev.com/SignalR-Core-SqlDependency-part2/