Fejlesztés az Azure Files szolgáltatáshoz a .NET-keretrendszerrel
Megismerheti az adatok tárolására Azure Files használó .NET-alkalmazások fejlesztésének alapjait. Ez a cikk bemutatja, hogyan hozhat létre egyszerű konzolalkalmazást a .NET és a Azure Files használatához:
- Fájl tartalmának lekérése.
- Fájlmegosztás maximális méretének vagy kvótájának beállítása.
- Közös hozzáférésű jogosultságkód (SAS) létrehozása egy fájlhoz.
- Fájl másolása másik fájlba egy tárfiókon belül.
- Fájl másolása blobba egy tárfiókon belül.
- Pillanatkép létrehozása egy fájlmegosztásról.
- Fájl visszaállítása megosztási pillanatképből.
- Hibaelhárításhoz használja az Azure Storage-metrikákat.
A Azure Files kapcsolatos további információkért lásd: Mi az a Azure Files?
Tipp
Az Azure Storage kódmintatár megtekintése
Letölthető és futtatható, könnyen használható teljes körű Azure Storage-kódmintákért tekintse meg az Azure Storage-minták listáját.
A következőre érvényes:
Fájlmegosztás típusa | SMB | NFS |
---|---|---|
Standard szintű fájlmegosztások (GPv2), LRS/ZRS | ||
Standard szintű fájlmegosztások (GPv2), GRS/GZRS | ||
Prémium fájlmegosztások (FileStorage), LRS/ZRS |
A .NET API-k ismertetése
Az Azure Files két széleskörű megközelítést nyújt az ügyfélalkalmazásokhoz: az SMB protokollt és a REST-et. A .NET-en belül a és Azure.Storage.Files.Shares
az System.IO
API-k elvonják ezeket a megközelítéseket.
API | A következő esetekben használja | Megjegyzések |
---|---|---|
System.IO | Az alkalmazás/alkalmazásnak:
|
A Azure Files SMB-en keresztül implementált fájl I/O általában megegyezik az I/O-val bármely hálózati fájlmegosztással vagy helyi tárolóeszközzel. A .NET számos funkciójának , köztük a fájl I/O-jának ismertetését a Konzolalkalmazás oktatóanyagában tekintheti meg. |
Azure.Storage.Files.Shares | Az alkalmazás/alkalmazásnak:
|
Ez a cikk bemutatja, hogy a fájl I/O-jának Azure.Storage.Files.Shares használata REST-et használ az SMB helyett és a fájlmegosztás kezelését. |
A konzolalkalmazás létrehozása és az összeállítás elérése
A Azure Files ügyfélkódtárat bármilyen típusú .NET-alkalmazásban használhatja. Ezek az alkalmazások közé tartoznak az Azure-felhő- és webes, asztali és mobilalkalmazások. Ebben az útmutatóban egy konzolalkalmazást hozunk létre az egyszerűség kedvéért.
Hozzon létre egy új Windows-konzolalkalmazást a Visual Studióban. Az alábbi lépések bemutatják, hogyan hozhat létre konzolalkalmazást a Visual Studio 2019-ben. A lépések a Visual Studio más verziói esetén is hasonlók.
- Indítsa el a Visual Studiót, és válassza az Új projekt létrehozása lehetőséget.
- Az Új projekt létrehozása területen válassza a C# konzolalkalmazás (.NET-keretrendszer) elemét, majd kattintson a Tovább gombra.
- Az Új projekt konfigurálása területen adja meg az alkalmazás nevét, majd válassza a Létrehozás lehetőséget.
Adja hozzá a cikkben szereplő összes példakódot a Program
Program.cs fájl osztályához.
A szükséges csomagok telepítése a NuGettel
Tekintse meg ezeket a csomagokat a projektben:
- .NET-hez készült Azure Core-kódtár: Ez a csomag az Azure-ügyfélfolyamat implementációja.
- Azure Storage Blob ügyfélkódtár a .NET-hez: Ez a csomag programozott hozzáférést biztosít a tárfiók bloberőforrásaihoz.
- Azure Storage Files ügyfélkódtár a .NET-hez: Ez a csomag programozott hozzáférést biztosít a tárfiókban található fájlerőforrásokhoz.
- System Configuration Manager könyvtár a .NET-hez: Ez a csomag egy osztályt biztosít az értékek konfigurációs fájlban való tárolásához és lekéréséhez.
A nuGet használatával beszerezheti a csomagokat. Kövesse az alábbi lépéseket:
A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.
A NuGet-csomagkezelőben válassza a Tallózás lehetőséget. Ezután keresse meg és válassza az Azure.Core elemet, majd válassza a Telepítés lehetőséget.
Ez a lépés telepíti a csomagot és annak függőségeit.
Keresse meg és telepítse az alábbi csomagokat:
- Azure.Storage.Blobs
- Azure.Storage.Files.Shares
- System.Configuration.ConfigurationManager
Tárfiók hitelesítő adatainak mentése a App.config fájlba
Ezután mentse a hitelesítő adatait a projekt App.config fájljába. A Megoldáskezelő kattintson App.config
duplán, és szerkessze a fájlt úgy, hogy az az alábbi példához hasonló legyen.
Cserélje le myaccount
a elemet a tárfiók nevére és mykey
a tárfiók kulcsára.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="StorageConnectionString"
value="DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;EndpointSuffix=core.windows.net" />
<add key="StorageAccountName" value="myaccount" />
<add key="StorageAccountKey" value="mykey" />
</appSettings>
</configuration>
Megjegyzés
Az Azurite Storage Emulator jelenleg nem támogatja a Azure Files. A kapcsolati sztring egy azure-tárfiókot kell céloznia a felhőben a Azure Files való együttműködéshez.
Hozzáadás irányelvekkel
A Megoldáskezelő nyissa meg a Program.cs fájlt, és adja hozzá a következő parancsokat a fájl elejéhez.
using System;
using System.Configuration;
using System.IO;
using System.Threading.Tasks;
using Azure;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Files.Shares;
using Azure.Storage.Files.Shares.Models;
using Azure.Storage.Sas;
A fájlmegosztás szoftveres elérése
A Program.cs fájlban adja hozzá az alábbi kódot a fájlmegosztás programozott módon való eléréséhez.
A következő metódus fájlmegosztást hoz létre, ha még nem létezik. A metódus első lépése egy ShareClient-objektum létrehozása egy kapcsolati sztring. A minta ezután megpróbál letölteni egy korábban létrehozott fájlt. Hívja meg ezt a metódust innen: Main()
.
//-------------------------------------------------
// Create a file share
//-------------------------------------------------
public async Task CreateShareAsync(string shareName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a ShareClient which will be used to create and manipulate the file share
ShareClient share = new ShareClient(connectionString, shareName);
// Create the share if it doesn't already exist
await share.CreateIfNotExistsAsync();
// Ensure that the share exists
if (await share.ExistsAsync())
{
Console.WriteLine($"Share created: {share.Name}");
// Get a reference to the sample directory
ShareDirectoryClient directory = share.GetDirectoryClient("CustomLogs");
// Create the directory if it doesn't already exist
await directory.CreateIfNotExistsAsync();
// Ensure that the directory exists
if (await directory.ExistsAsync())
{
// Get a reference to a file object
ShareFileClient file = directory.GetFileClient("Log1.txt");
// Ensure that the file exists
if (await file.ExistsAsync())
{
Console.WriteLine($"File exists: {file.Name}");
// Download the file
ShareFileDownloadInfo download = await file.DownloadAsync();
// Save the data to a local file, overwrite if the file already exists
using (FileStream stream = File.OpenWrite(@"downloadedLog1.txt"))
{
await download.Content.CopyToAsync(stream);
await stream.FlushAsync();
stream.Close();
// Display where the file was saved
Console.WriteLine($"File downloaded: {stream.Name}");
}
}
}
}
else
{
Console.WriteLine($"CreateShareAsync failed");
}
}
Egy fájlmegosztás maximális méretének beállítása
A Azure Files ügyfélkódtár 5.x verziójától kezdve beállíthatja a fájlmegosztások kvótáját (maximális méretét). Azt is ellenőrizheti, hogy aktuálisan mennyi adatot tárol a fájlmegosztás.
A megosztás kvótájának beállítása korlátozza a megosztáson tárolt fájlok teljes méretét. Ha a megosztáson lévő fájlok teljes mérete meghaladja a kvótát, az ügyfelek nem növelhetik a meglévő fájlok méretét. Az ügyfelek nem hozhatnak létre új fájlokat, kivéve, ha ezek a fájlok üresek.
Az alábbi példa bemutatja, hogyan ellenőrizheti egy megosztás aktuális kihasználását, és hogyan adhat meg hozzá kvótát.
//-------------------------------------------------
// Set the maximum size of a share
//-------------------------------------------------
public async Task SetMaxShareSizeAsync(string shareName, int increaseSizeInGiB)
{
const long ONE_GIBIBYTE = 10737420000; // Number of bytes in 1 gibibyte
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a ShareClient which will be used to access the file share
ShareClient share = new ShareClient(connectionString, shareName);
// Create the share if it doesn't already exist
await share.CreateIfNotExistsAsync();
// Ensure that the share exists
if (await share.ExistsAsync())
{
// Get and display current share quota
ShareProperties properties = await share.GetPropertiesAsync();
Console.WriteLine($"Current share quota: {properties.QuotaInGB} GiB");
// Get and display current usage stats for the share
ShareStatistics stats = await share.GetStatisticsAsync();
Console.WriteLine($"Current share usage: {stats.ShareUsageInBytes} bytes");
// Convert current usage from bytes into GiB
int currentGiB = (int)(stats.ShareUsageInBytes / ONE_GIBIBYTE);
// This line sets the quota to be the current
// usage of the share plus the increase amount
await share.SetQuotaAsync(currentGiB + increaseSizeInGiB);
// Get the new quota and display it
properties = await share.GetPropertiesAsync();
Console.WriteLine($"New share quota: {properties.QuotaInGB} GiB");
}
}
Közös hozzáférésű jogosultságkód létrehozása egy fájlhoz vagy fájlmegosztáshoz
A Azure Files ügyfélkódtár 5.x-es verziójától kezdve létrehozhat egy közös hozzáférésű jogosultságkódot (SAS) egy fájlmegosztáshoz vagy egy adott fájlhoz.
Az alábbi példametódus egy SAS-t ad vissza a megadott megosztásban lévő fájlon.
//-------------------------------------------------
// Create a SAS URI for a file
//-------------------------------------------------
public Uri GetFileSasUri(string shareName, string filePath, DateTime expiration, ShareFileSasPermissions permissions)
{
// Get the account details from app settings
string accountName = ConfigurationManager.AppSettings["StorageAccountName"];
string accountKey = ConfigurationManager.AppSettings["StorageAccountKey"];
ShareSasBuilder fileSAS = new ShareSasBuilder()
{
ShareName = shareName,
FilePath = filePath,
// Specify an Azure file resource
Resource = "f",
// Expires in 24 hours
ExpiresOn = expiration
};
// Set the permissions for the SAS
fileSAS.SetPermissions(permissions);
// Create a SharedKeyCredential that we can use to sign the SAS token
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
// Build a SAS URI
UriBuilder fileSasUri = new UriBuilder($"https://{accountName}.file.core.windows.net/{fileSAS.ShareName}/{fileSAS.FilePath}");
fileSasUri.Query = fileSAS.ToSasQueryParameters(credential).ToString();
// Return the URI
return fileSasUri.Uri;
}
A közös hozzáférésű jogosultságkódok létrehozásával és használatával kapcsolatos további információkért lásd: A közös hozzáférésű jogosultságkód működése.
Fájlok másolása
A Azure Files ügyfélkódtár 5.x-es verziójától kezdve egy fájlt átmásolhat egy másik fájlba, egy fájlt egy blobba vagy egy blobot egy fájlba.
Az AzCopy használatával is másolhat egy fájlt egy másikba, vagy blobokat másolhat egy fájlba, vagy fordítva. Lásd: Az AzCopy használatának első lépései.
Megjegyzés
Ha egy blobot másol egy fájlba vagy egy fájlt egy blobba, akkor is közös hozzáférésű jogosultságkóddal (SAS) kell engedélyeznie a forrásobjektumhoz való hozzáférést, ha a másolás tárfiókon belül történik.
Fájl másolása másik fájlba
Az alábbi példa megosztáson belül másol át egy fájlt egy másikba. A megosztott kulcsos hitelesítéssel elvégezheti a másolást, mert ez a művelet fájlokat másol ugyanabban a tárfiókban.
//-------------------------------------------------
// Copy file within a directory
//-------------------------------------------------
public async Task CopyFileAsync(string shareName, string sourceFilePath, string destFilePath)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Get a reference to the file we created previously
ShareFileClient sourceFile = new ShareFileClient(connectionString, shareName, sourceFilePath);
// Ensure that the source file exists
if (await sourceFile.ExistsAsync())
{
// Get a reference to the destination file
ShareFileClient destFile = new ShareFileClient(connectionString, shareName, destFilePath);
// Start the copy operation
await destFile.StartCopyAsync(sourceFile.Uri);
if (await destFile.ExistsAsync())
{
Console.WriteLine($"{sourceFile.Uri} copied to {destFile.Uri}");
}
}
}
Fájl másolása blobba
Az alábbi példa létrehoz egy fájlt, és átmásolja egy ugyanabban a tárfiókban található blobba. A példa létrehoz a forrásfájlhoz egy SAS-t, amellyel a szolgáltatás engedélyezi a forrásfájlhoz való hozzáférést a másolási művelet alatt.
//-------------------------------------------------
// Copy a file from a share to a blob
//-------------------------------------------------
public async Task CopyFileToBlobAsync(string shareName, string sourceFilePath, string containerName, string blobName)
{
// Get a file SAS from the method created ealier
Uri fileSasUri = GetFileSasUri(shareName, sourceFilePath, DateTime.UtcNow.AddHours(24), ShareFileSasPermissions.Read);
// Get a reference to the file we created previously
ShareFileClient sourceFile = new ShareFileClient(fileSasUri);
// Ensure that the source file exists
if (await sourceFile.ExistsAsync())
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Get a reference to the destination container
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);
// Create the container if it doesn't already exist
await container.CreateIfNotExistsAsync();
BlobClient destBlob = container.GetBlobClient(blobName);
await destBlob.StartCopyFromUriAsync(sourceFile.Uri);
if (await destBlob.ExistsAsync())
{
Console.WriteLine($"File {sourceFile.Name} copied to blob {destBlob.Name}");
}
}
}
Ugyanígy másolhat blobokat fájlokba. Ha a forrásobjektum egy blob, hozzon létre egy SAS-t, amely engedélyezi a blobhoz való hozzáférést a másolási művelet során.
Pillanatképek megosztása
A Azure Files ügyfélkódtár 8.5-ös verziójától kezdve létrehozhat megosztási pillanatképet. Ezekből felsorolást is készíthet, tallózhat köztük, és törölheti is a megosztási pillanatképeket. A létrehozás után a megosztási pillanatképek írásvédettek.
Megosztási pillanatképek létrehozása
Az alábbi példával létrehozhat egy fájlmegosztási pillanatképet.
//-------------------------------------------------
// Create a share snapshot
//-------------------------------------------------
public async Task CreateShareSnapshotAsync(string shareName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareServiceClient = new ShareServiceClient(connectionString);
// Instantiate a ShareClient which will be used to access the file share
ShareClient share = shareServiceClient.GetShareClient(shareName);
// Ensure that the share exists
if (await share.ExistsAsync())
{
// Create a snapshot
ShareSnapshotInfo snapshotInfo = await share.CreateSnapshotAsync();
Console.WriteLine($"Snapshot created: {snapshotInfo.Snapshot}");
}
}
Megosztási pillanatképek felsorolása
Az alábbi példa egy megosztás pillanatképeit sorolja fel.
//-------------------------------------------------
// List the snapshots on a share
//-------------------------------------------------
public void ListShareSnapshots()
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareServiceClient = new ShareServiceClient(connectionString);
// Display each share and the snapshots on each share
foreach (ShareItem item in shareServiceClient.GetShares(ShareTraits.All, ShareStates.Snapshots))
{
if (null != item.Snapshot)
{
Console.WriteLine($"Share: {item.Name}\tSnapshot: {item.Snapshot}");
}
}
}
Fájlok és könyvtárak listázása megosztási pillanatképeken belül
Az alábbi példa a megosztási pillanatképeken belüli fájlokat és könyvtárakat böngészi.
//-------------------------------------------------
// List the snapshots on a share
//-------------------------------------------------
public void ListSnapshotContents(string shareName, string snapshotTime)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareService = new ShareServiceClient(connectionString);
// Get a ShareClient
ShareClient share = shareService.GetShareClient(shareName);
Console.WriteLine($"Share: {share.Name}");
// Get as ShareClient that points to a snapshot
ShareClient snapshot = share.WithSnapshot(snapshotTime);
// Get the root directory in the snapshot share
ShareDirectoryClient rootDir = snapshot.GetRootDirectoryClient();
// Recursively list the directory tree
ListDirTree(rootDir);
}
//-------------------------------------------------
// Recursively list a directory tree
//-------------------------------------------------
public void ListDirTree(ShareDirectoryClient dir)
{
// List the files and directories in the snapshot
foreach (ShareFileItem item in dir.GetFilesAndDirectories())
{
if (item.IsDirectory)
{
Console.WriteLine($"Directory: {item.Name}");
ShareDirectoryClient subDir = dir.GetSubdirectoryClient(item.Name);
ListDirTree(subDir);
}
else
{
Console.WriteLine($"File: {dir.Name}\\{item.Name}");
}
}
}
Fájlmegosztások vagy fájlok visszaállítása megosztási pillanatképekből
A fájlmegosztások pillanatképének készítése lehetővé teszi az egyes fájlok vagy a teljes fájlmegosztás helyreállítását.
A fájlmegosztási pillanatképekből a fájlok a pillanatkép lekérdezésével állíthatók vissza. Ezután lekérhet egy adott megosztási pillanatképhez tartozó fájlt. Ezzel a verzióval közvetlenül olvashatja vagy állíthatja vissza a fájlt.
//-------------------------------------------------
// Restore file from snapshot
//-------------------------------------------------
public async Task RestoreFileFromSnapshot(string shareName, string directoryName, string fileName, string snapshotTime)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareService = new ShareServiceClient(connectionString);
// Get a ShareClient
ShareClient share = shareService.GetShareClient(shareName);
// Get as ShareClient that points to a snapshot
ShareClient snapshot = share.WithSnapshot(snapshotTime);
// Get a ShareDirectoryClient, then a ShareFileClient to the snapshot file
ShareDirectoryClient snapshotDir = snapshot.GetDirectoryClient(directoryName);
ShareFileClient snapshotFile = snapshotDir.GetFileClient(fileName);
// Get a ShareDirectoryClient, then a ShareFileClient to the live file
ShareDirectoryClient liveDir = share.GetDirectoryClient(directoryName);
ShareFileClient liveFile = liveDir.GetFileClient(fileName);
// Restore the file from the snapshot
ShareFileCopyInfo copyInfo = await liveFile.StartCopyAsync(snapshotFile.Uri);
// Display the status of the operation
Console.WriteLine($"Restore status: {copyInfo.CopyStatus}");
}
Megosztási pillanatképek törlése
Az alábbi példával törölhet egy fájlmegosztási pillanatképet.
//-------------------------------------------------
// Delete a snapshot
//-------------------------------------------------
public async Task DeleteSnapshotAsync(string shareName, string snapshotTime)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareService = new ShareServiceClient(connectionString);
// Get a ShareClient
ShareClient share = shareService.GetShareClient(shareName);
// Get a ShareClient that points to a snapshot
ShareClient snapshotShare = share.WithSnapshot(snapshotTime);
try
{
// Delete the snapshot
await snapshotShare.DeleteIfExistsAsync();
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Exception: {ex.Message}");
Console.WriteLine($"Error code: {ex.Status}\t{ex.ErrorCode}");
}
}
Azure Files hibaelhárítása metrikák használatával
Az Azure Storage Analytics támogatja a Azure Files metrikáit. A metrikai adatok segítségével nyomon követheti a kéréseket, és diagnosztizálhatja a problémákat.
A metrikákat a Azure Portal Azure Files engedélyezheti. A metrikákat programozott módon is engedélyezheti, ha meghívja a Fájlszolgáltatás tulajdonságainak beállítása műveletet a REST API-val vagy annak egyik analógjával a Azure Files ügyfélkódtárban.
Az alábbi példakód bemutatja, hogyan engedélyezheti a metrikákat a .NET-ügyfélkódtár használatával Azure Files.
//-------------------------------------------------
// Use metrics
//-------------------------------------------------
public async Task UseMetricsAsync()
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instatiate a ShareServiceClient
ShareServiceClient shareService = new ShareServiceClient(connectionString);
// Set metrics properties for File service
await shareService.SetPropertiesAsync(new ShareServiceProperties()
{
// Set hour metrics
HourMetrics = new ShareMetrics()
{
Enabled = true,
IncludeApis = true,
Version = "1.0",
RetentionPolicy = new ShareRetentionPolicy()
{
Enabled = true,
Days = 14
}
},
// Set minute metrics
MinuteMetrics = new ShareMetrics()
{
Enabled = true,
IncludeApis = true,
Version = "1.0",
RetentionPolicy = new ShareRetentionPolicy()
{
Enabled = true,
Days = 7
}
}
});
// Read the metrics properties we just set
ShareServiceProperties serviceProperties = await shareService.GetPropertiesAsync();
// Display the properties
Console.WriteLine();
Console.WriteLine($"HourMetrics.InludeApis: {serviceProperties.HourMetrics.IncludeApis}");
Console.WriteLine($"HourMetrics.RetentionPolicy.Days: {serviceProperties.HourMetrics.RetentionPolicy.Days}");
Console.WriteLine($"HourMetrics.Version: {serviceProperties.HourMetrics.Version}");
Console.WriteLine();
Console.WriteLine($"MinuteMetrics.InludeApis: {serviceProperties.MinuteMetrics.IncludeApis}");
Console.WriteLine($"MinuteMetrics.RetentionPolicy.Days: {serviceProperties.MinuteMetrics.RetentionPolicy.Days}");
Console.WriteLine($"MinuteMetrics.Version: {serviceProperties.MinuteMetrics.Version}");
Console.WriteLine();
}
Ha problémákat tapasztal, tekintse meg a Azure Files hibaelhárítását ismertető cikket.
Következő lépések
A Azure Files kapcsolatos további információkért tekintse meg az alábbi forrásanyagokat:
Elméleti cikkek és videók
- Azure Files: zökkenőmentes felhőalapú SMB-fájlrendszer Windows és Linux rendszerekhez
- Az Azure Files használata Linux rendszeren
File Storage-eszköztámogatás
Referencia
Az elavult .NET-verziójú 11.x SDK-kkal kapcsolatos kódmintákért lásd: Kódminták a .NET 11.x-es verziójával.