0% found this document useful (0 votes)
14 views10 pages

ASP.NET Core Configuration Guide

The document provides an overview of configuration management in Asp.Net Core, detailing how to store and retrieve settings using appsettings.json, environment variables, and secret management. It explains the use of the IConfiguration interface for accessing configurations within controllers and services, as well as the Options Pattern for managing complex settings. Additionally, it covers the integration of HttpClient for making HTTP requests to external APIs, emphasizing the importance of dependency injection and proper resource management.

Uploaded by

nasrullayev444
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views10 pages

ASP.NET Core Configuration Guide

The document provides an overview of configuration management in Asp.Net Core, detailing how to store and retrieve settings using appsettings.json, environment variables, and secret management. It explains the use of the IConfiguration interface for accessing configurations within controllers and services, as well as the Options Pattern for managing complex settings. Additionally, it covers the integration of HttpClient for making HTTP requests to external APIs, emphasizing the importance of dependency injection and proper resource management.

Uploaded by

nasrullayev444
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

Configuration

Kirish
Configuration – bu o’zgarmas kalit-qiymat juftligi bo’lib, ular umumiy joyga saqlab qo’yiladi va
keyinchalik zarur bo’lganda ishlatiladi.
Misol uchun, connection string, Client ID va API kalitlar, domen nomlari, o’zgarmas pochta
manzili va hokazolar saqlab qo’yiladi.
[Link] Core proyekti yaratilganda [Link] nomli fayl yaratiladi. Unda json ko’rinishida
turli xildagi sozlamalar saqlanadi. Bu faylga dasturning turli qismlaridan (controller, service)
murojaat qilinadi.

Qo’shimcha ma’lumot: configuration ma’lumotlarni quyidagi vositalarda saqlash mumkin:


 [Link] faylda
 Environment o’zgaruvchilarida
 Configuration fayllarda (JSON, INI yoki XML fayllarda)
 In-Memory configurationlarda
 Secret Managerda
Proyekt yaratilganida undagi [Link] fayli kontenti quyidagicha bo’ladi:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"[Link]": "Warning"
}
},
"AllowedHosts": "*"
}
Birinchida turgan Logging sozlamasi proyektdagi log klaslari uchun sozlama hisoblanadi.
Bu faylga yangi sozlama qo’shish quyidagicha bo’ladi:
{
//…
"MyCustomConfig": "CustomConfigValue"
}

[Link] fayldan sozlama ikki xil ko’rinishda olinadi:


1. [string key] – [Link][“key”]
2. GetValue<T>(string key, object defaultValue)
[Link] faylga qo’shgan sozlamani olib ko’ramiz:
string customConfig = [Link]["MyCustomConfig"];
Sozlama dastur ishlab turganda o’zgartirilsa ham, ishlaydi.
Kontrollerda IConfiguration interfeys bilan ishlash
Oldingi darsda kerakli sozlamani olishni ko’rdik. Lekin, bunda biz [Link] fayldagi app
obyektidan foydalangan edik. Lekin, ayrim hollarda sozlamalardan controller yoki service ichida
ham foydalanishga to’g’ri keladi. Bunday holatda configuration obyektini controller yoki boshqa
klas kontruktoriga inject qilish orqali olamiz. Inject qilish paytida obyekt tipi sifatida
IConfiguration interfeysini ishlatamiz:
public class ControllerName : Controller
{
private readonly IConfiguration _configuration;

public ControllerName(IConfiguration configuration)


{
_configuration = configuration;
}
}

Haqiqiy kodda:
public class HomeController : Controller
{
private readonly IConfiguration _configuration;
public HomeController(IConfiguration configuration)
{
_configuration = configuration;

[Route("/")]
public IActionResult Index()
{
[Link] = _configuration["MyCustomConfig"];
// Yoki
[Link] = _configuration.GetValue<string>("MyCustomConfig", "defaultValue");
return View();
}
}

Iyerarxiyali sozlamalarni olish


[Link] faylda ichma-ich joylashgan sozlamalarni (jsonda obyekt qiymatlar) olish uchun
ikki nuqtadan (:) foydalaniladi:
[Link]:
{
"CustomConfig": {
"Key1": "Value1",
"Key2": "Value2"
}
}

Sozlamani olish:
Configuration["CustomConfig:Key1"]

yoki
[Link]<string>("CustomConfig:Key1", "defaultValue")

Lekin ichki sozlamani olishning bundan soddaroq ko’rinishi ham bor. Buning uchun GetSection()
metodidan foydalaniladi:
[Link]("CustomConfig")["Key1"]
Options Pattern
Ba’zi hollarda ayrim sozlamalar juda katta bo’ladi, lekin bizga faqat uning bir nechta sozlamasi
kerak bo’ladi. Bunday hollarda options patterndan foydalaniladi. Options patternda katta hajmli
sozlamaning biz olmoqchi bo’lgan ichki sozlamalari uchun alohida klas yaratamiz va shu ichki
sozlamalar nomi bilan bir xildagi propertylarni klasga qo’shamiz:
[Link] faylda:
{
"CustomConfig": {
"Key1": "Value1",
"Key2": "Value2",
"Key3": "Value3",
"Key4": "Value4",
"Key5": "Value5",
"Key6": "Value6"
}
}

Bu sozlamaning faqat ikkita ichki sozlama qiymatini olmoqchimiz. Buning uchun quyidagicha
klas yaratamiz:
public class CustomNestedConfigurations
{
public string? Key1 { get; set; }
public string? Key2 { get; set; }
}

Options Pattern klas abstract bo’lmasligi, uning propertylari public bo’lishi kerak.
Endi, sozlamalardagi ma’lumotlarni klasga o’qitamiz. Buning uchun Get() metodidan
foydalanamiz:
CustomNestedConfigurations customConfig =
_configuration.GetSection("CustomConfig").Get<CustomNestedConfigurations>();
ViewBag.Key1 = customConfig.Key1;
ViewBag.Key2 = customConfig.Key2;

Bundan tashqari Get() metodi o’rniga Bind() metodidan ham foydalanishimiz mumkin:
CustomNestedConfigurations customConfig = new CustomNestedConfigurations();
_configuration.GetSection("CustomConfig").Bind(customConfig);
ViewBag.Key1 = customConfig.Key1;
ViewBag.Key2 = customConfig.Key2;
Configurationni service sifatida ishlatish
Configurationni alohida olib ishlatgandan ko’ra, uni konstruktorda inject qilib ishlatish ancha
qulay hisoblanadi.

Configurationni inject qilib ishlatish:


[Link] faylda:
[Link]<CustomNestedConfigurations>([Link]("CustomConfig"));

Keyin, kerakli klas konstruktoriga inject qilamiz. Masalan, controller klasiga:


public class HomeController : Controller
{
private readonly CustomNestedConfigurations _configuration;
public HomeController(IOptions<CustomNestedConfigurations> configuration)
{
_configuration = [Link];

[Route("/")]
public IActionResult Index()
{
ViewBag.Key1 = _configuration.Key1;
ViewBag.Key2 = _configuration.Key2;

return View();
}
}

Environment uchun maxsus sozlamalar


Proyektni yaratganda [Link] faylidan tashqari [Link] fayli ham
qo’shib yaratiladi.

Bu qo’shimcha fayl development environment uchun mo’ljallangan sozlamalar fayli hisoblanadi.


O’zi umuman bu turdagi sozlamalar faylining umumiy nomlanishi quyidagicha:
[Link]

Qaysi environment uchun sozlamalar faylini yaratmoqchi bo’lsak, shu nomni fayl nomiga qo’shib
ketiladi.
Dastur sozlamalar fayllarini o’qishda avval [Link] faylini, keyin (agar mavjud bo’lsa)
[Link], [Link], [Link] fayllari
o’qiladi.
Umumiy ko’rinishda, barcha dasturga kerakli sozlamalar quyidagi ketma-ketlikda o’qiladi:
1. [Link]
2. [Link]
a. [Link]
b. [Link]
c. [Link]
3. User Secrets (Secret Manager)
4. Environment o’zgaruvchilari
5. Buyruqlar qatoridan berilgan argumentlar (CLI argumentlar)
Secret Manager
Ayrim sozlama ma’lumotlarini xavfsiz holda saqlash kerak bo’ladi. Misol uchun, biror akkauntga
murojaat qilish uchun foydalaniladigan maxfiy tokenlar, parollarni.
Misol uchun kodimizni GitHub kabi VCS tizimlariga yuklash jarayonida maxfiy ma’lumotlarni
yuklab bo’lmaydi. Bunday maxfiy ma’lumotlar development paytida koddan alohida saqlanishi
kerak bo’ladi (xuddi .env faylda saqlaganday). Bu muammoga yechim [Link] Coreda
maxfiy ma’lumotlarni koddan alohida saqlash uchun secret managerdan foydalaniladi.

Secret managerni quyidagi dotnet buyruq bilan ishga tushirish mumkin:


dotnet user-secrets init – secret managerni ishga tushirish
dotnet user-secrets set "Key" "Value" – secret managerga qiymat berish
dotnet user-secrets list – secret managerdagi mavjud sozlamalarni olish
Bu buyruq orqali o’rnatilgan sozlamalar koddan tashqarida saqlanadi, hamda VCSga
yuklanganda, maxfiy ma’lumotlar yuklanmaydi.
dotnet user-secrets init buyrug’i ishlatilganida UserSecretsId qayerga o’rnatilgani ko’rsatiladi
(Buni proyekt faylini ochib ko’rish ham mumkin: <UserSecretsId>cf58cd84-65ab-4629-83a0-
30b2f796a6df</UserSecretsId>)

Mavjud maxfiy ma’lumotlarini ko’rish uchun:


1. dotnet user-secrets list buyrug’idan foydalanish, yoki
2. proyekt ustida sichqonchaning o’ng tugmasini bosib, ochilgan menyudan Manage User
Secrets bo’limini tanlaganda, ochilgan [Link] faylini ochish orqali
bajariladi.
Environment o’zgaruvchilari
Maxfiy ma’lumotlarni kod ichida saqlash xavfsiz hisoblanmasligini bildik.
Production serverda visual studio kabi proyekt bilan visual ishlaydigan dastur bo’lmaydi. Dasturni
ishga tushirish uchun bizda faqat buyruqlar qatori bo’ladi. Mana shu holatda maxfiy
ma’lumotlarni sozlama sifatida berish uchun environment o’zgaruvchilaridan foydalanish mumkin
(maxfiy ma’lumotlarni saqlashning yana bir usullaridan biri bo’lib mana shu environment
o’zgaruvchilar hisoblanadi).
Sozlamalarni environment o’zgaruvchida saqlash:
$Env:PrivateKey__ChildKey="value" – bu yerdagi ikkita ost chiziq (__) ota kalit va bola
kalitlarni ajratib turadi.
dotnet run --no-launch-profile – sozlama o’rnatilganidan keyin hech qanaqa profilsiz dastur ishga
tushiriladi
Custom Json Configuration
[Link] faylida juda ko’p sozlamalarni saqlaydigan bo’lsak, sozlamalar bilan ishlash
qiyinlashib ketadi. Bu muammoni hal qilish uchun, o’xshash sozlamalarni alohida json faylga olib
chiqish mumkin.

Misol ko’raylik:
[Link] fayl yaratamiz:
{
"CustomConfig": {
"Key1": "Value1",
"Key2": "Value2",
"Key3": "Value3",
"Key4": "Value4",
"Key5": "Value5",
"Key6": "Value6"
}
}
[Link] faylda bu config faylni [Link] sozlamalariga qo’shamiz:
[Link]((hostnigContext, config) =>
{
[Link]("[Link]", optional: true, reloadOnChange: true);
});

Bu yerda optional parametri biz qo’shayotgan [Link] sozlamalar faylimiz


ixtiyoriy bo’lib, agar bunday fayl bo’lmasa ham dasturda xatolik kelib chiqmaydi.
reloadOnChange parametri esa sozlama faylimizga o’zgartirish kiritganimizda dastur qayta ishga
tushishi kerakligini bildiradi. Bu ikkala parameter ixtiyoriy hisoblanadi.
Http Client
[Link] Coreda yaratayotgan dasturimizda turib boshqa biror restful apiga murojaat qilish uchun
HttpClient klasidan foydalaniladi.
HttpClient – bu biror HTTP resursga uning URLidan foydalangan holda HTTP so’rov yuborish va
undan HTTP javob qaytarib olishga mo’ljallangan klas.

Misol uchun, iqlim ma’lumotlarini yoki birja ma’lumotlarini tashqi servicedan API bilan olishda
HttpClient klasidan foydalanishimiz mumkin.
IHttpClientFactory – bu HttpClient klasining obyektini yaratib beradigan, hamda ishlatib
bo’linganidan keyin uni xotiradan o’chiradigan (bog’lanishni uzadi) CreateClient() metodini
beruvchi interfeys.
HttpClient obyektini yaratish uchun klasga IHttpClientFactory interfeysi bilan obyekt inject
qilinadi. Bu obyektning CreateClient() metodi HttpClient obyektini yaratib beradi. Bu usulda
HttpClient obyektini olishning afzalligi, HTTP javob qabul qilib olinishi bilan bog’lanish
avtomatik uziladi. Shu sababli, har doim so’rov yuborganda, so’rov tugaganidan keyin
bog’lanishni xotiradan o’chirish kerakligi haqida o’ylab o’tirmaymiz.

HttpClient bilan tashqi API servicega so’rov yuborish va javob olishga misol ko’raylik:
Service uchun interfeys:
public interface IMyService
{
Task<Dictionary<string, object>?> GetRandomCatFact();
}

Service kodi:
public class MyService : IMyService
{
public readonly IHttpClientFactory _httpClient;
public MyService(IHttpClientFactory httpClient)
{
_httpClient = httpClient;
}

public async Task<Dictionary<string, object>?> GetRandomCatFact()


{
using (HttpClient httpClient = _httpClient.CreateClient())
{
HttpRequestMessage httpRequestMessage = new HttpRequestMessage()
{
RequestUri = new Uri("[Link]
Method = [Link],
};

HttpResponseMessage httpResponseMessage = await [Link](httpRequestMessage);

// kelgan response contentini stream ko'rinishida o'qiymiz


Stream stream = [Link]();
// Streamni o'qiymiz
StreamReader reader = new StreamReader(stream);

// O'qilgan responseni boshidan oxirigacha olamiz


string response = [Link]();

Dictionary<string, object>? responseDictionary = [Link]<Dictionary<string,


object>>(response);

if (responseDictionary == null)
{
throw new InvalidOperationException("No response from API server");
}

if ([Link]("error"))
{
throw new InvalidOperationException([Link](responseDictionary["error"]));
}

return responseDictionary;
}
}
}

Serviceni [Link] faylda dasturga biriktiramiz:


[Link]();
[Link]<IMyService, MyService>();

Serviceni kontrollerda ishlatamiz:


public class HomeController : Controller
{
private readonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;

[Route("/")]
public async Task<IActionResult> Index()
{
Dictionary<string, object>? responseDictionary = await _myService.GetRandomCatFact();

return View();
}
}

HttpClient klasining property va metodlari:


Propertylari:
 BaseAddress
 DefaultRequstHeaders
Metodlari:
 GetAsync()
 PostAsync()
 PutAsync()
 DeleteAsync()

You might also like