Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sulmar/altkom-orange-dotnet-core-web
Przykłady ze szkolenia Tworzenie aplikacji webowych w .NET Core 3.1
https://github.com/sulmar/altkom-orange-dotnet-core-web
dotnet-core3
Last synced: 16 days ago
JSON representation
Przykłady ze szkolenia Tworzenie aplikacji webowych w .NET Core 3.1
- Host: GitHub
- URL: https://github.com/sulmar/altkom-orange-dotnet-core-web
- Owner: sulmar
- Created: 2020-04-20T09:14:53.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-12-08T10:14:35.000Z (about 2 years ago)
- Last Synced: 2024-11-08T21:14:12.577Z (2 months ago)
- Topics: dotnet-core3
- Language: CSS
- Homepage: http://www.sulmar.pl
- Size: 1.24 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# altkom-orange-dotnet-core-web
## EF Core
### Przydatne komendy CLI
- ``` dotnet ef ``` - weryfikacja instalacji
- ``` dotnet ef migrations add {migration} ``` - utworzenie migracji
- ``` dotnet ef migrations remove ``` - usunięcie ostatniej migracji
- ``` dotnet ef migrations list ``` - wyświetlenie listy wszystkich migracji
- ``` dotnet ef migrations script ``` - wygenerowanie skryptu do aktualizacji bazy danych do najnowszej wersji
- ``` dotnet ef database update ``` - aktualizacja bazy danych do najnowszej wersji
- ``` dotnet ef database update -verbose ``` - aktualizacja bazy danych do najnowszej wersji + wyświetlanie logu
- ``` dotnet ef database update {migration} ``` - aktualizacja bazy danych do podanej migracji
- ``` dotnet ef database drop ``` - usunięcie bazy danych
- ``` dotnet ef dbcontext info ``` - wyświetlenie informacji o DbContext (provider, nazwa bazy danych, źródło)
- ``` dotnet ef dbcontext list ``` - wyświetlenie listy DbContextów
- ``` dotnet ef dbcontext scaffold {connectionstring} Microsoft.EntityFrameworkCore.SqlServer -o Models ``` - wygenerowanie modelu na podstawie bazy danych### Przydatne polecenia PMC
- ``` Add-Migration {migration} ``` - utworzenie migracji
- ``` Remove-Migration ``` - usunięcie ostatniej migracji
- ``` Script-Migration ``` - wygenerowanie skryptu do aktualizacji bazy danych do najnowszej wersji
- ``` Update-Database ``` - aktualizacja bazy danych do najnowszej wersji
- ``` Update-Database -verbose ``` - aktualizacja bazy danych do najnowszej wersji + wyświetlanie logu
- ``` Update-Database -migration {migration} ``` - aktualizacja bazy danych do podanej
- ``` Scaffold-DbContext {connectionstring} Microsoft. Models ``` - wygenerowanie modelu na podstawie bazy danych## WebHost.CreateDefaultBuilder
Co się kryje pod metodą WebHost.CreateDefaultBuilder?
https://github.com/sulmar/altkom-dotnet-core-201910/issues/1## Signal-R
Javascript Signal-R client
https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr## Autentykacja
### Basic Authentication### Windows Authentication
https://www.c-sharpcorner.com/article/configure-windows-authentication-in-asp-net-core/### OAuth 2.0
### JWT Token
https://jwt.ioPrzykład implementacji:
https://github.com/sulmar/dotnet-core-jwt## Logowanie zdarzeń (Serilog)
Serilog umożliwia zbieranie informacji o działaniu naszej aplikacji podobnie jak NLog lub log4net.
Serilog ma jednak tą zaletę, że umożliwia zapisywanie informacji w sposób strukturalny (json, xml) a nie tylko płaskiego pliku tekstowego. Dzięki temu można łatwo odczytać zmienne wartości i na ich podstawie definiować miary.- Instalacja
~~~ bash
dotnet add package Serilog.AspNetCore
~~~### Konfiguracja za pomocą metod
~~~ csharp
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
.WriteTo.File(new CompactJsonFormatter(), "logs/log.json")
.CreateLogger();try
{
Log.Information("Application starting");CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "The application failed to start correctly.");
}
finally
{
Log.CloseAndFlush();
}
}
~~~- Dodaj *UseSerilog()*
~~~ csharp
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
})
.UseSerilog();~~~
### Konfiguracja za pomocą pliku konfiguracyjnego
- Dodaj konfigurację Serilog do pliku _appsettings.json_
~~~ json
{
"Serilog": {"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},"Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId"],
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs\\log.txt",
"outputTemplate": "{Timestamp:G} {Message}{NewLine:1}{Exception:1}"
}
},{
"Name": "File",
"Args": {
"path": "logs\\log.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
}
}
]
},
}
~~~### Logowanie własnych informacji
~~~ csharp
public class IndexModel : PageModel
{
private readonly ILogger _logger;public IndexModel(ILogger logger)
{
_logger = logger;
}public void OnGet()
{
_logger.LogInformation("You requested the Index page");
}
}
~~~- Rezultat
~~~
[11:49:12 INF] You requested the Index page
~~~### Logowanie informacji o żądaniach (requests)
~~~ csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSerilogRequestLogging();
}
~~~- Rezultat
~~~
[11:45:50 INF] HTTP GET / responded 200 in 243.4293 ms
[11:45:57 INF] HTTP GET /documents/dokumenty/ responded 200 in 1611.0590 ms
[11:57:20 INF] HTTP GET /customers/ responded 200 in 167.5039 ms
~~~### Sinks
Serilog umożliwia wysyłanie informacji o logach do różnych miejsc i nazywane są **Sinks**
- Dostępne pakiety
https://github.com/serilog/serilog/wiki/Provided-Sinks### Enrich
Serilog umożliwia wzbogacanie logowanych informacji o dodatkowe informacje, np. nazwa maszyny, identyfikator procesu, nazwa środowiska lub nazwa użytkownika.- Dostępne pakiety
https://github.com/serilog/serilog/wiki/Enrichment## Wizualizacja za pomocą **Seq**
Ręczna analiza tekstowych logów może być trudna zwłaszcza jeśli chcemy uzyskać średnie w czasie, np. ilość requestów na minutę. Z pomocą przychodzi webowe narzędzie Seq.
Seq umożliwia zbieranie danych w czasie rzeczywistym i prezentację ich w postaci tabel i wykresów.https://datalust.co/seq
1. Instalacja Seq
- Windows
https://datalust.co/download- Docker
~~~ bash
docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest
~~~
2. Instalacja biblioteki do Serilog
~~~ bash
dotnet add package Serilog.Sinks.Seq
~~~3. Wpis do pliku konfiguracyjnego w appsettings.json
~~~ json
{
"Name": "Seq",
"Args": {
"serverUrl": "http://localhost:5341"
}
}
~~~5. Uruchom swoją aplikację i przejdź do adresu http://localhost:5341, aby śledzić statystyki.
![Seq](docs/seq.png "Seq")
## SignalR
### Utworzenie Huba
~~~ csharp
public class CustomersHub : Hub
{
public override async Task OnConnectedAsync()
{
if (this.Context.GetHttpContext().Request.Headers.TryGetValue("Grupa", out StringValues groups))
{
foreach (var group in groups)
{
await this.Groups.AddToGroupAsync(Context.ConnectionId, group);
}
}
}public async Task CreatedCustomer(Customer customer)
{
// Wysłanie wiadomości "Created" do grupy GrupaA
await this.Clients.Group("GrupaA").SendAsync("Created", customer);
}
}
~~~### Utworzenie klienta
- Wraz z dodaniem własnego nagłówka
~~~ csharp
HubConnection connection = new HubConnectionBuilder()
.WithUrl(url, options =>
{
options.Headers.Add("Grupa", "GrupaA");
})
.Build();_logger.LogInformation("Connecting...");
await connection.StartAsync();
~~~