Selamünaleyküm bu yazımızda .Net Core’un dosya yapısından kısaca bahsetmiş olacağız. Ve bu konu içerisinde not tutulacak noktalara değineceğiz. Kısaca bu yazıda program.cs, kestrel, startup.cs, wwwroot, statik dosyalara cache ekleme ve .csproj dosyasını öğrenmiş olacağız.
Console uygulamalarımızda olduğu gibi ASP.NET Core'de de Main metodu vardır. Bu Main metodu Program adlı sınıfımızın içinde yer almaktadır. Proje ayağa kalkarken ilk olarak bu Main metoduna düşer. Burada varsayılan olarak bir webhost oluşturulur. Bu oluşturulan webhost, kestrel adı verilen bir server türüdür. Oluşturulan webhost'tan sonra Startup sınıfı çalıştırılır. (.Net Core 6.0 ile beraber Startup dosyası kaldırılmıştır ve startup sınıfında gerçekleşen konfigürasyon işlemleri artık program.cs dosyasında yapılmaktadır.)
//.Net Core 5.0 Program.cs sınıfının kodları
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
//.Net Core 6.0 ile beraber yeni Program.cs sınıfının kodları
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Kestrel, Cross platform çalışma özelliğine sahip ASP.NET Core uygulamaları için varsayılan web sunucusudur. .Net Core için açık kaynak olarak geliştirilmiş olan Kestrel, platform fark etmeksizin çalışabilme özelliğine sahiptir. Kestrel, aşağıdaki özellikleri desteklemektedir:
HTTPS
Web Sockets
Unix Sockets
Kestrel web sunucusu yalnız başına çalışabildiği gibi IIS, Nginx, Apache ile ara sunucu kullanarak da çalışabilmektedir. (Reverse Proxy Server) Kestrel, burada platformlar arası uyumluluk sağlar. Yazdığınız kodun diğer platformlar için uyumluluğu Kestrel Web Server sayesinde olmaktadır.
Program.cs sınıfında Kestrel için max. Kullanıcı bağlantı sayısı max. İstek sayısı tanımlayabiliriz.
.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = 200;
options.Limits.MaxConcurrentUpgradedConnections = 200;
options.Limits.MaxRequestBodySize = 10 * 1024;
options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod:
TimeSpan.FromSeconds(10));
options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod:
TimeSpan.FromSeconds(10));
options.Listen(IPAddress.Loopback, 5000);
options.Listen(IPAddress.Loopback, 5001, ListenOptions =>
{
ListenOptions.UseHttps("testCert.pfx");
});
Startup.cs sınıfı, Program.cs sınıfından çağrılır. Bu sınıfta uygulamamız ilk etapta configureServices metoduna girer. Bu metot ile uygulamamıza ait servisleri ekleyebiliriz. Uygulamada kullanacak servislerin listesini services parametresi ile alabiliriz.
Resimden de anlaşılacağı üzere uygulamamıza ekleyebileceğimiz servisleri, services parametresinden sonra noktaya basıp servislerin listesini görebiliriz. Böylelikle ihtiyacımız olan servisi uygulamamıza dâhil etmiş oluruz. Misalen, uygulamamıza MVC’yi dahil etmek istediğimizde metodun içerisine service.AddMvc(); ya da service.AddControllersWithViews(); yazarak MVC’yi aktif etmiş oluruz.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
Bu metottan sonra uygulamamız Configure metodunun içine girer, burada uygulamamıza kullanıcıdan gelen istek ve kullanıcıya sunulan yanıt sırasında yer alan Middleware dediğimiz sınıfları çalıştırmış oluruz. Böylece uygulamamızda istek ve yanıt arasında girip burada istediğimiz işlemleri yaptırabiliriz.
CSS, JavaScript, fotoğraflar gibi statik dosyaların tutulduğu yerdir. Bu dosyaları kullanmak için uygulamamızda bazı yapılandırmalar yapmamız gerekir. Statik dosyalarımızı wwwroot'un altına ekleyip dosyalarımıza kök dizinden ulaşabiliriz.
public void Configure(IApplicationBuilder app, IHostingenvironment env)
{
app.UseStaticFiles();
}
Startup sınıfının Configure metoduna statik dosyalarımız için app.UseStaticFiles(); kodu ile wwwroot’un altındaki statik dosyalara erişim sağlayabiliriz.
<img src="~/images/photo.png" />
Bu şekilde uygulamamızın View kısmanda statik dosyaya erişimi sağlayabiliriz.
wwwroot klasörü statik dosyalarımız için varsayılan olarak oluşturulmuş bir klasördür. İsteğe bağlı olarak sizde kendinize ekstradan statik dosyalarınız için ayrı bir klasör oluşturup bu klasöre ulaşılabilecek yolu atayabilirsiniz.
Misalen, statik dosyalar için projemizde StaticFiIes adında bir klasör oluşturalım. Ve bu klasöre bir tane resim kopyalayalım. Şimdi de Configure metodunu yeni oluşturduğumuz dosyayı okuyacak biçime getirelim.
public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
//varsayılan olarak wwwroot'un altındaki statik dosyaları okur.
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileoptions
{
//Statik dosyalarımız için okunacak dosya adını belirttik.
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
//Statik dosyalarımıza ulaşmak için path'ı belirttik.
RequestPath = "/static"
});
}
Configure metodunda statik dosyalar için varsayılan olarak wwwroot klasörünü belirttik. Daha sonra oluşturduğumuz StaticFiIes isimli klasörü statik dosyalarımız için kullanacağımızı belirttik. Ve bu dosyaya path olarak “/static" ile ulaşabileceğimizi belirttik.
<img src="~/static/540.png" />
View dosyalarımızda StaticFiles klasörünün altındaki statik dosyalara bu şekilde ulaşabiliriz.
Peki, StaticFiles isimli klasör ile wwwroot klasörünün ulaşılacağı path aynı Olursa ne olur? Bu durumda uygulamamız, Configure metodunda ilk tanımladığımız Statik dosyaya bakar ve buradaki ilk tanımlanmış dosyayı çalıştırır. Daha sonra istediğimiz dosya burada yoksa bir sonraki statik dosya tanımlamamıza geçer ve bu klasör altında bu dosya var mı diye bakar.
public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
app.UseStaticFiles(new StaticFileoptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
RequestPath = ""
});
app.UseStaticFiles();
}
Configure metodumuzu yukarıdaki gibi ayarlarsak istekte bulunduğumuz path, ilk etapta StaticFiIes isimli klasöre bakacaktır. Burada yoksa wwwroot klasörünün altında var mı diye bakacaktır. Bunun sebebi kodlarımız satır satır okunduğunda, ilk olarak StaticFiIes yapılandırma kodunu okuyacağındandır.
Statik dosyalarımızı cache-control ekleyerek bu dosyaları tarayıcı önbelleğine alınabilir hale getirebiliriz.
app.UseStaticFiles(new StaticFileoptions
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={1000}");
}
});
Configure metodumuzun içine eklediğimiz statik dosyalara, cache-control headers bilgisine 1000 saniyelik cache ekledik. şimdi de statik dosyalarımızdan birinin yolunu, browser'e yazarak statik dosyamıza istekte bulunalım.
Ekrana dönen yanıtın headers bilgisinde cache-control’a 1000 saniye eklemiş olduk. Böylece tarayıcı bu dosyayı 1000 saniye boyunca cache’e atacaktır.
.csproj uzantılı dosya bize proje ile ilgili bazı bilgileri gösterir. (Aktarılan DLL'ler, kullanılan framework, varsayılan statik dosya, proje sürümü vb. gibi)
Bu dosyaya ulaşmak için Solution Explorer tabından projemize sağ tıklayıp, edit projeninismi.csproj'a tıklamanız gerekiyor. (projeninismi diye yazdığımız Yer değişkendir. Sizin projenizin ismi ne ise onla başlayan .csproj uzantılı dosyaya tıklamanız gerekmektedir.)
Mavi ile işaretlenen Edit Project File’a tıklıyoruz. Karşınıza gelen ekranda proje ile ilgili bilgiler göreceksiniz.
<Project Sdk="Microsoft.NET.Sdk.Web">
<!--Kullandığımız framework ve sürümü-->
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>örnek_proje</RootNamespace>
</PropertyGroup>
<!--Tarafımızca oluşturulan klasörler-->
<ItemGroup>
<None Remove="Controllers\HomeController.cs.txt" />
<None Remove="Views\Home\Index.txt" />
</ItemGroup>
<ItemGroup>
<Compile Include="HomeController.cs.txt" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Home\Index.txt" />
</ItemGroup>
<!--Yüklenen Paketler-->
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.17">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
</ItemGroup>
</Project>
Resimde de görüleceği üzere projemizin framewor’u nedir ve sürümü kaçtır, şu an projmezde oluşturulan klasörler nelerdir, yüklenen paketler nelerdir, buradan görebiliriz.
Bu yazımızın sonuna geldik ve kısaca .Net Core’un dosya yapısından bahsettik. Bir sonraki yazıda Middleware konusundan bahsedeceğiz inşallah. İlgilenenlerin faydalanması ümidi ile.
Blog Listesi
takdirname
Saido :
Aleykümselam ve rahmetullah. Abi çalışman için teşekkürlerimi sunarım. Konuyu gayet iyi özetlemişsin. Net olmak anlaşılmanın başıdır. Sende net bilgilere yer vererek bunu başarmışsın.