Aracılığıyla paylaş


ASP.NET Core'daki statik dosyalar

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Yazan Rick Anderson

HTML, CSS, görüntüler ve JavaScript gibi statik dosyalar, ASP.NET Core uygulamasının varsayılan olarak istemcilere doğrudan hizmet verdiği varlıklardır.

Statik dosyaları sunma

Statik dosyalar projenin web kök dizininde depolanır. Varsayılan dizin şeklindedir {content root}/wwwroot, ancak yöntemiyle UseWebRoot değiştirilebilir. Daha fazla bilgi için bkz . İçerik kökü ve Web kökü.

CreateBuilder yöntemi, içerik kökünü geçerli dizine ayarlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Statik dosyalara web köküne göre bir yol üzerinden erişilebilir. Örneğin, Web Uygulaması proje şablonları klasörün içinde wwwroot birkaç klasör içerir:

  • wwwroot
    • css
    • js
    • lib

wwwroot/images klasörünü oluşturmayı ve dosyayı eklemeyi wwwroot/images/MyImage.jpg göz önünde bulundurun. klasöründeki images bir dosyaya erişmek için URI biçimi şeklindedir https://<hostname>/images/<image_file_name>. Örneğin https://localhost:5001/images/MyImage.jpg

Dosyaları web kökünde sun

Varsayılan web uygulaması şablonları, statik dosyaların hizmet vermesine olanak tanıyan yöntemi UseStaticFiles içinde Program.cs çağırır.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Parametresiz UseStaticFiles yöntem aşırı yüklemesi web kökündeki dosyaları servable olarak işaretler. Aşağıdaki işaretleme wwwroot/images/MyImage.jpg kaynağına başvurmaktadır:

<img src="~/images/MyImage.jpg" class="img" alt="My image" />

Önceki işaretlemede tilde karakteri ~ web kökünü işaret ediyor.

Dosyaları web kökünün dışından sunma

Hizmet alınacak statik dosyaların web kökü dışında bulunduğu bir dizin hiyerarşisi düşünün:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • red-rose.jpg

Bir istek, Statik Dosya Orta Katman Yazılımı'nı aşağıdaki gibi yapılandırarak red-rose.jpg dosyasına erişebilir:

using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles"
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kodda MyStaticFiles dizin hiyerarşisi StaticFiles URI kesimi aracılığıyla genel kullanıma sunulur. https://<hostname>/StaticFiles/images/red-rose.jpg adresine yapılan bir istem, red-rose.jpg dosyasını sunar.

Aşağıdaki işaretleme MyStaticFiles/images/red-rose.jpg'ye başvurur.

<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />

Dosyaları birden çok konumdan sunmak için bkz . Birden çok konumdan dosya sunma.

HTTP yanıt üst başlıklarını ayarla

Nesne StaticFileOptions , HTTP yanıt üst bilgilerini ayarlamak için kullanılabilir. Web kökünden statik dosya sunumunu yapılandırmaya ek olarak, aşağıdaki kod Önbellek Denetimi üst bilgisini ayarlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

var cacheMaxAgeOneWeek = (60 * 60 * 24 * 7).ToString();
app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = ctx =>
    {
        ctx.Context.Response.Headers.Append(
             "Cache-Control", $"public, max-age={cacheMaxAgeOneWeek}");
    }
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kod, statik dosyaları bir hafta (604800 saniye) boyunca yerel önbellekte genel olarak kullanılabilir hale getirir.

Statik dosya yetkilendirme

ASP.NET Core şablonları UseAuthorization'yi çağırmadan önce UseStaticFiles'yi çağırır. Çoğu uygulama bu deseni izler. Statik Dosya Ara Yazılımı yetkilendirme ara yazılımından önce çağrıldığında:

  • Statik dosyalarda yetkilendirme denetimi yapılmaz.
  • Statik Dosya Ara Yazılımı tarafından sunulan statik dosyalara( örneğin, altındakilere wwwroot) genel erişim sağlanır.

Yetkilendirmeye dayalı statik dosyalar sunmak için:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
using StaticFileAuth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles"
});

app.MapRazorPages();

app.Run();

Önceki kodda, geri dönüş yetkilendirme ilkesi tüm kullanıcıların kimlik doğrulaması gerektirir. Kendi yetkilendirme gereksinimlerini belirten denetleyiciler, Razor Sayfalar gibi uç noktalar geri dönüş yetkilendirme ilkesini kullanmaz. Örneğin, Razor Sayfalar, denetleyiciler veya eylem yöntemleri, yedek yetkilendirme ilkesi yerine uygulanan yetkilendirme özniteliğini kullanır.

RequireAuthenticatedUser, geçerli kullanıcı kimliğinin doğrulandığını zorlayan geçerli örneğe DenyAnonymousAuthorizationRequirement ekler.

wwwroot altındaki statik varlıklar, varsayılan Statik Dosya Ara Yazılımı (app.UseStaticFiles();) UseAuthentication'den önce çağrıldığı için genel erişime açıktır. MyStaticFiles klasöründeki statik varlıklar kimlik doğrulaması gerektirir. Örnek kod bunu gösterir.

Dosyaları yetkilendirmeye göre sunmak için alternatif bir yaklaşım:

  • wwwroot ve Statik Dosya Ara Yazılımı tarafından erişilebilen herhangi bir dizinin dışında bunları depolayın.

  • Yetkilendirmenin uygulandığı bir eylem yöntemi aracılığıyla bunlara hizmet edin ve bir FileResult nesnesi döndürün.

    [Authorize]
    public class BannerImageModel : PageModel
    {
        private readonly IWebHostEnvironment _env;
    
        public BannerImageModel(IWebHostEnvironment env) =>
            _env = env;
    
        public PhysicalFileResult OnGet()
        {
            var filePath = Path.Combine(
                    _env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");
    
            return PhysicalFile(filePath, "image/jpeg");
        }
    }
    

Yukarıdaki yaklaşım, dosya başına bir sayfa veya uç nokta gerektirir. Aşağıdaki kod, kimliği doğrulanmış kullanıcılar için dosyaları döndürür veya yükler.

app.MapGet("/files/{fileName}",  IResult (string fileName) => 
    {
        var filePath = GetOrCreateFilePath(fileName);

        if (File.Exists(filePath))
        {
            return TypedResults.PhysicalFile(filePath, fileDownloadName: $"{fileName}");
        }

        return TypedResults.NotFound("No file found with the supplied file name");
    })
    .WithName("GetFileByName")
    .RequireAuthorization("AuthenticatedUsers");

// IFormFile uses memory buffer for uploading. For handling large file use streaming instead.
// https://learn.microsoft.com/aspnet/core/mvc/models/file-uploads#upload-large-files-with-streaming
app.MapPost("/files", async (IFormFile file, LinkGenerator linker, HttpContext context) =>
    {
        // Don't rely on the file.FileName as it is only metadata that can be manipulated by the end-user
        // Take a look at the `Utilities.IsFileValid` method that takes an IFormFile and validates its signature within the AllowedFileSignatures
        
        var fileSaveName = Guid.NewGuid().ToString("N") + Path.GetExtension(file.FileName);
        await SaveFileWithCustomFileName(file, fileSaveName);
        
        context.Response.Headers.Append("Location", linker.GetPathByName(context, "GetFileByName", new { fileName = fileSaveName}));
        return TypedResults.Ok("File Uploaded Successfully!");
    })
    .RequireAuthorization("AdminsOnly");

app.Run();

Tam örnek için StaticFileAuth GitHub klasörüne bakın.

Dizin tarama

Dizin gözatma, belirtilen dizinler içinde dizin listelemeye izin verir.

Dizine gözatma, güvenlik nedeniyle varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz . Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler.

Dizin gözatmayı AddDirectoryBrowser ve UseDirectoryBrowser şunu ile etkinleştirme:

using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

var fileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.WebRootPath, "images"));
var requestPath = "/MyImages";

// Enable displaying browser links.
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = fileProvider,
    RequestPath = requestPath
});

app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = fileProvider,
    RequestPath = requestPath
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kod, url'sini klasörünün dizine gözatılmasına olanak tanır ve her dosya ve klasöre bağlantı sağlar:

dizin tarama

AddDirectoryBrowserDizin tarama ara yazılımı tarafından gerekli olan hizmetleri ekler, bunlar arasında HtmlEncoder. Bu hizmetler AddRazorPages gibi diğer çağrılar tarafından eklenebilir, ancak hizmetlerin tüm uygulamalara eklendiğinden emin olmanız için AddDirectoryBrowser çağrılmasını öneririz.

Varsayılan belgeleri sunma

Varsayılan sayfayı ayarlamak, ziyaretçilere sitede bir başlangıç noktası sağlar. Varsayılan bir dosyayı wwwroot adresinden sunmak için, istekteki URL'nin dosyanın adını içermesine gerek kalmadan, UseDefaultFiles yöntemini çağırın.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseDefaultFiles();

app.UseStaticFiles();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

UseDefaultFiles varsayılan dosyaya hizmet vermek için önce UseStaticFiles çağrılmalıdır. UseDefaultFiles , dosyaya hizmet içermeyen bir URL yeniden yazma işlemidir.

UseDefaultFiles ile wwwroot klasörüne yapılan istek, aşağıdakiler için arama yapar:

  • default.htm
  • default.html
  • index.htm
  • index.html

Listeden bulunan ilk dosya, istek dosyanın adını içeriyormuş gibi sunulur. Tarayıcı URL'si istenen URI'yi yansıtmaya devam eder.

Aşağıdaki kod, varsayılan dosya adını olarak mydefault.htmldeğiştirir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);

app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Varsayılan belgeler için UseFileServer

UseFileServer, UseStaticFiles, UseDefaultFiles ve isteğe bağlı olarak UseDirectoryBrowser işlevlerini birleştirir.

Statik dosyaların ve varsayılan dosyanın sunulmasını etkinleştirmek için app.UseFileServer çağırın. Dizine gözatma etkin değil:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseFileServer();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aşağıdaki kod statik dosyaların, varsayılan dosyanın ve dizin taramanın sunulmasını sağlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseFileServer(enableDirectoryBrowsing: true);

app.UseRouting();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aşağıdaki dizin hiyerarşisini göz önünde bulundurun:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • MyImage.jpg
    • default.html

Aşağıdaki kod statik dosyaların sunulmasını, varsayılan dosyanın ve dizinine göz atmayı MyStaticFilesetkinleştirir:

using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseFileServer(new FileServerOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles",
    EnableDirectoryBrowsing = true
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

AddDirectoryBrowser, EnableDirectoryBrowsing özelliği değeri true olduğunda çağrılmalıdır.

Yukarıdaki dosya hiyerarşisini ve kodunu kullanarak URL'ler aşağıdaki gibi çözümlenir:

URI Yanıt
https://<hostname>/StaticFiles/images/MyImage.jpg MyStaticFiles/images/MyImage.jpg
https://<hostname>/StaticFiles MyStaticFiles/default.html

MyStaticFiles dizininde varsayılan adlandırılmış dosya yoksa, https://<hostname>/StaticFiles tıklanabilir bağlantılarla dizin listesini döndürür:

Statik dosyalar listesi

UseDefaultFiles ve UseDirectoryBrowser, sonunda eğik çizgi olmayan hedef URI'den, sonunda eğik çizgi olan hedef URI'ye istemci tarafı yeniden yönlendirmesi gerçekleştirir. Örneğin, https://<hostname>/StaticFiles'dan https://<hostname>/StaticFiles/'a. StaticFiles dizinindeki /, DefaultFilesOptions seçeneği kullanılmadığı sürece sonunda bir eğik çizgi (RedirectToAppendTrailingSlash) olmadan geçersizdir.

FileExtensionContentTypeProvider

sınıfı, FileExtensionContentTypeProvider dosya uzantılarının MIME içerik türlerine eşlemesi olarak hizmet veren bir Mappings özellik içerir. Aşağıdaki örnekte, bilinen MIME türlerine birkaç dosya uzantısı eşlenmiştir. .rtf uzantısı değiştirilir ve .mp4 kaldırılır:

using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");

app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Bkz. MIME içerik türleri.

Standart olmayan içerik türleri

Statik Dosya Ara Yazılımı, neredeyse 400 bilinen dosya içerik türünü anlar. Kullanıcı bilinmeyen bir dosya türüne sahip bir dosya isterse, Statik Dosya Ara Yazılımı isteği işlem hattındaki bir sonraki ara yazılıma geçirir. İsteği işleyen ara yazılım yoksa 404 Bulunamadı yanıtı döndürülür. Dizine gözatma etkinse, dizin listesinde dosyanın bağlantısı görüntülenir.

Aşağıdaki kod bilinmeyen türlerin sunulmasını sağlar ve bilinmeyen dosyayı görüntü olarak işler:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true,
    DefaultContentType = "image/png"
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kodla, bilinmeyen içerik türüne sahip bir dosya isteği görüntü olarak döndürülür.

Uyarı

ServeUnknownFileTypes Etkinleştirme bir güvenlik riskidir. Varsayılan olarak devre dışıdır ve kullanımı önerilmez. FileExtensionContentTypeProvider , standart olmayan uzantılarla dosya sunmanın daha güvenli bir alternatifidir.

Dosyaları birden çok konumdan sunma

Aşağıdaki Razor sayfayı ve görüntülenen /MyStaticFiles/image3.png dosyayı göz önünde bulundurun:

@page

<p> Test /MyStaticFiles/image3.png</p>

<img src="~/image3.png" class="img" asp-append-version="true" alt="Test">

UseStaticFiles ve UseFileServer varsayılan olarak wwwroot öğesini gösteren dosya sağlayıcısına ayarlanır. Ek UseStaticFiles ve UseFileServer örnekleri, diğer konumlardan dosyaları sunmak için diğer dosya sağlayıcıları ile sağlanabilir. Aşağıdaki örnekte, UseStaticFiles iki kez çağrılarak hem wwwroot hem de MyStaticFiles kaynaklarından dosya sunulur.

app.UseStaticFiles(); // Serve files from wwwroot
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles"))
});

Önceki kodu kullanarak:

Aşağıdaki kod, WebRootFileProvider öğesini güncelleştirir ve bu, Görüntü Etiketi Yardımcısı'nın bir sürüm sağlamasına olanak tanır.

var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
  Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles"));

var compositeProvider = new CompositeFileProvider(webRootProvider,
                                                  newPathProvider);

// Update the default provider.
app.Environment.WebRootFileProvider = compositeProvider;

app.UseStaticFiles();

Not

Yukarıdaki yaklaşım Sayfalar ve MVC uygulamaları için Razor geçerlidir. Blazor Web App için geçerli olan yönergeler için bkz. ASP.NET Core Blazor statik dosyaları.

Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler

Uyarı

UseDirectoryBrowser ve UseStaticFiles sırları sızdırabilir. Üretimde dizine gözatmayı devre dışı bırakmak kesinlikle önerilir. UseStaticFiles veya UseDirectoryBrowser aracılığıyla hangi dizinlerin etkinleştirildiğini dikkatle gözden geçirin. Tüm dizin ve alt dizinleri genel olarak erişilebilir hale gelir. Genel kullanıma sunulması için uygun dosyaları gibi <content_root>/wwwrootayrılmış bir dizinde depolayın. Bu dosyaları MVC görünümlerinden, Sayfalardan, Razor yapılandırma dosyalarından vb. ayırın.

  • ile UseDirectoryBrowserUseStaticFiles kullanıma sunulan içerik URL'leri, temel alınan dosya sisteminin büyük/küçük harf duyarlılığına ve karakter kısıtlamalarına tabidir. Örneğin, Windows büyük/küçük harfe duyarlı değildir, ancak macOS ve Linux değildir.

  • IIS'de barındırılan ASP.NET Core uygulamaları, statik dosya istekleri de dahil olmak üzere tüm istekleri uygulamaya iletmek için ASP.NET Çekirdek Modülünü kullanır. IIS statik dosya işleyicisi kullanılmaz ve istekleri işleme şansı yoktur.

  • IIS statik dosya işleyicisini sunucu veya web sitesi düzeyinde kaldırmak için IIS Yöneticisi'nde aşağıdaki adımları tamamlayın:

    1. Modüller özelliğine gidin.
    2. Listede StaticFileModule öğesini seçin.
    3. Eylemler kenar çubuğunda Kaldır'a tıklayın.

Uyarı

IIS statik dosya işleyicisi etkinse ve ASP.NET Çekirdek Modülü yanlış yapılandırıldıysa, statik dosyalar sunulur. Bu, örneğin web.config dosyası dağıtılmadıysa gerçekleşir.

  • ve .csdahil olmak üzere .cshtml kod dosyalarını uygulama projesinin web kökünün dışına yerleştirin. Bu nedenle uygulamanın istemci tarafı içeriğiyle sunucu tabanlı kod arasında mantıksal bir ayrım oluşturulur. Bu, sunucu tarafı kodun sızdırılmasını önler.

IWebHostEnvironment.WebRootPath'i güncelleştirerek wwwroot dışında dosya sunma

IWebHostEnvironment.WebRootPath wwwroot dışındaki bir klasöre ayarlandığında:

  • Geliştirme ortamında, wwwroot ve güncellenmiş IWebHostEnvironment.WebRootPath içinde bulunan statik dosyalar wwwroot'den sunulmaktadır.
  • Geliştirme dışındaki herhangi bir ortamda, güncelleştirilmiş IWebHostEnvironment.WebRootPath klasörden yinelenen statik varlıklar sunulur.

Boş web şablonuyla oluşturulmuş bir web uygulamasını düşünün:

  • wwwroot ve wwwroot-custom içinde bir Index.html dosyası içerir.

  • Aşağıdaki güncelleştirilmiş Program.cs dosyası, WebRootPath = "wwwroot-custom" ayarlayan:

    var builder = WebApplication.CreateBuilder(new WebApplicationOptions
    {
        Args = args,
        // Look for static files in "wwwroot-custom"
        WebRootPath = "wwwroot-custom"
    });
    
    var app = builder.Build();
    
    app.UseDefaultFiles();
    app.UseStaticFiles();
    
    app.Run();
    

Önceki kodda, isteklere yapılan /:

  • Geliştirme ortamında return wwwroot/Index.html
  • Geliştirme ortamı dışındaki herhangi bir ortamda döndür wwwroot-custom/Index.html

wwwroot-custom ile ilgili varlıkların geri dönmesini sağlamak için aşağıdaki yaklaşımlardan birini kullanın:

  • wwwroot içindeki yinelenen adlandırılmış varlıkları silin.

  • "ASPNETCORE_ENVIRONMENT", Properties/launchSettings.json içinde "Development" dışında herhangi bir değere ayarlayın.

  • Proje dosyasında ayarlayarak <StaticWebAssetsEnabled>false</StaticWebAssetsEnabled> statik web varlıklarını tamamen devre dışı bırakın. UYARI, statik web varlıklarını devre dışı bırakmak Sınıf Kitaplıklarını Razordevre dışı bırakır.

  • Proje dosyasına aşağıdaki JSON dosyasını ekleyin:

    <ItemGroup>
        <Content Remove="wwwroot\**" />
    </ItemGroup>
    

Aşağıdaki kod, IWebHostEnvironment.WebRootPath'yı geliştirme dışı bir değere günceller ve wwwroot-custom üzerinden yinelenen içeriğin döndürülmesi wwwroot yerine garanti edilir:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    Args = args,
    // Examine Hosting environment: logging value
    EnvironmentName = Environments.Staging,
    WebRootPath = "wwwroot-custom"
});

var app = builder.Build();

app.Logger.LogInformation("ASPNETCORE_ENVIRONMENT: {env}",
      Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));

app.Logger.LogInformation("app.Environment.IsDevelopment(): {env}",
      app.Environment.IsDevelopment().ToString());

app.UseDefaultFiles();
app.UseStaticFiles();

app.Run();

Ek kaynaklar

Yayımlayanlar Rick Anderson ve Kirk Larkin

HTML, CSS, görüntüler ve JavaScript gibi statik dosyalar, ASP.NET Core uygulamasının varsayılan olarak istemcilere doğrudan hizmet verdiği varlıklardır.

Statik dosyaları sunma

Statik dosyalar projenin web kök dizininde depolanır. Varsayılan dizin şeklindedir {content root}/wwwroot, ancak yöntemiyle UseWebRoot değiştirilebilir. Daha fazla bilgi için bkz . İçerik kökü ve Web kökü.

CreateBuilder yöntemi, içerik kökünü geçerli dizine ayarlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Statik dosyalara web köküne göre bir yol üzerinden erişilebilir. Örneğin, Web Uygulaması proje şablonları klasörün içinde wwwroot birkaç klasör içerir:

  • wwwroot
    • css
    • js
    • lib

wwwroot/images klasörünü oluşturmayı ve dosyayı eklemeyi wwwroot/images/MyImage.jpg göz önünde bulundurun. klasöründeki images bir dosyaya erişmek için URI biçimi şeklindedir https://<hostname>/images/<image_file_name>. Örneğin https://localhost:5001/images/MyImage.jpg

Dosyaları web kökünde sun

Varsayılan web uygulaması şablonları, UseStaticFiles'de statik dosyaların hizmet vermesine olanak tanıyan yöntemi çağırırProgram.cs.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Parametresiz UseStaticFiles yöntem aşırı yüklemesi web kökündeki dosyaları servable olarak işaretler. Aşağıdaki işaretleme wwwroot/images/MyImage.jpg: belirtilir

<img src="~/images/MyImage.jpg" class="img" alt="My image" />

Önceki işaretlemede tilde karakteri ~ web kökünü işaret ediyor.

Dosyaları web kökü dışında sunmak

Hizmet alınacak statik dosyaların web kökü dışında bulunduğu bir dizin hiyerarşisi düşünün:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • red-rose.jpg

Bir istek, statik dosya ara yazılımını aşağıdaki gibi yapılandırarak red-rose.jpg dosyasına erişebilir.

using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles"
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kodda MyStaticFiles dizin hiyerarşisi StaticFiles URI kesimi aracılığıyla genel kullanıma sunulur. https://<hostname>/StaticFiles/images/red-rose.jpg için bir istek red-rose.jpg dosyasına hizmet eder.

Aşağıdaki işaretleme MyStaticFiles/images/red-rose.jpg referans verir:

<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />

Dosyaları birden çok konumdan sunmak için bkz . Birden çok konumdan dosya sunma.

HTTP yanıt üst bilgilerini ayarlama

Nesne StaticFileOptions , HTTP yanıt üst bilgilerini ayarlamak için kullanılabilir. Web kökünden statik dosya sunumunu yapılandırmaya ek olarak, aşağıdaki kod Önbellek Denetimi üst bilgisini ayarlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

var cacheMaxAgeOneWeek = (60 * 60 * 24 * 7).ToString();
app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = ctx =>
    {
        ctx.Context.Response.Headers.Append(
             "Cache-Control", $"public, max-age={cacheMaxAgeOneWeek}");
    }
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kod, statik dosyaları bir hafta (604800 saniye) boyunca yerel önbellekte genel olarak kullanılabilir hale getirir.

Statik dosya yetkilendirme

ASP.NET Core şablonları, UseAuthorization çağrılmadan önce UseStaticFiles çağırır. Çoğu uygulama bu deseni izler. Statik Dosya Ara Yazılımı yetkilendirme ara yazılımından önce çağrıldığında:

  • Statik dosyalarda yetkilendirme denetimi yapılmaz.
  • Statik Dosya Ara Yazılımı tarafından sunulan statik dosyalara( örneğin, altındakilere wwwroot) genel erişim sağlanır.

Yetkilendirmeye dayalı statik dosyalar sunmak için:

  • wwwroot dışında depolayın.
  • Önce UseAuthorization çağrısını yapın, ardından bir yol belirterek UseStaticFiles çağrısını yapın.
  • Geri dönüş yetkilendirme ilkesini ayarlayın.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
using StaticFileAuth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles"
});

app.MapRazorPages();

app.Run();

Önceki kodda, geri dönüş yetkilendirme ilkesi tüm kullanıcıların kimliklerinin doğrulanmasını gerektirir. Kendi yetkilendirme gereksinimlerini belirten denetleyiciler, Razor Sayfalar gibi uç noktalar geri dönüş yetkilendirme ilkesini kullanmaz. Örneğin, Razor sayfalar, denetleyiciler veya eylem yöntemleri, geri dönüş yetkilendirme politikası yerine uygulanan yetkilendirme özniteliğini kullanır.

RequireAuthenticatedUser, geçerli kullanıcının kimliğinin doğrulanmasını zorlayan ve geçerli örneğe DenyAnonymousAuthorizationRequirement ekler.

varsayılan Statik Dosya Ara Yazılımı (app.UseStaticFiles();) çağrıldığından önce (wwwroot) altındaki UseAuthentication statik varlıklara genel erişim sağlanır. MyStaticFiles klasöründeki statik varlıklar kimlik doğrulaması gerektirir. Örnek kod bunu gösterir.

Dosyaları yetkilendirmeye göre sunmak için alternatif bir yaklaşım:

  • Statik Dosya Ara Yazılımı tarafından erişilebilen herhangi bir dizin ve wwwroot dışında, bunları depolayın.
  • Yetkilendirmenin uygulandığı bir eylem yöntemi aracılığıyla bunları sunma ve bir FileResult nesne döndürme:
[Authorize]
public class BannerImageModel : PageModel
{
    private readonly IWebHostEnvironment _env;

    public BannerImageModel(IWebHostEnvironment env) =>
        _env = env;

    public PhysicalFileResult OnGet()
    {
        var filePath = Path.Combine(
                _env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");

        return PhysicalFile(filePath, "image/jpeg");
    }
}

Dizin tarama

Dizin gözatma, belirtilen dizinler içinde dizin listelemeye izin verir.

Dizine gözatma, güvenlik nedeniyle varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz . Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler.

Dizin gözatmayı AddDirectoryBrowser ve UseDirectoryBrowser ile etkinleştirin:

using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

var fileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.WebRootPath, "images"));
var requestPath = "/MyImages";

// Enable displaying browser links.
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = fileProvider,
    RequestPath = requestPath
});

app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = fileProvider,
    RequestPath = requestPath
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Önceki kod, wwwroot/images klasörünün dizinine https://<hostname>/MyImages URL'siyle göz atılmasına olanak tanır ve her dosya ve klasöre link verir.

dizin tarama

AddDirectoryBrowser Müdavim gezinti ara yazılımı tarafından gerekli olan hizmetleri ekler, bu hizmetler arasında HtmlEncoder bulunur. Bu hizmetler, AddRazorPages gibi diğer çağrılarla eklenebilir, ancak hizmetlerin tüm uygulamalara eklendiğinden emin olmak için AddDirectoryBrowser'i aramamızı öneririz.

Varsayılan belgeleri sunma

Varsayılan sayfayı ayarlamak, ziyaretçilere sitede bir başlangıç noktası sağlar. İstek URL'si dosyanın adını içermesine gerek kalmadan wwwroot içinden varsayılan bir dosya sunmak için UseDefaultFiles yöntemini çağırın.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseDefaultFiles();

app.UseStaticFiles();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

UseDefaultFiles varsayılan dosyaya hizmet vermek için önce UseStaticFiles çağrılmalıdır. UseDefaultFiles , dosyaya hizmet içermeyen bir URL yeniden yazma işlemidir.

UseDefaultFiles ile wwwroot içinde bir klasöre yapılan istekler, şu öğeler için arama yapar:

  • default.htm
  • default.html
  • index.htm
  • index.html

Listeden bulunan ilk dosya, istek dosyanın adını içeriyormuş gibi sunulur. Tarayıcı URL'si istenen URI'yi yansıtmaya devam eder.

Aşağıdaki kod, varsayılan dosya adını olarak mydefault.htmldeğiştirir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);

app.UseStaticFiles();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Varsayılan belgeler için UseFileServer

UseFileServer, UseStaticFiles ve (isteğe bağlı olarak) UseDirectoryBrowser işlevlerini UseDefaultFiles ile birleştirir.

app.UseFileServer çağrısını yaparak statik dosyaların ve varsayılan dosyanın sunulmasını etkinleştirin. Dizine gözatma etkin değil:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseFileServer();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aşağıdaki kod statik dosyaların, varsayılan dosyanın ve dizin taramanın sunulmasını sağlar:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseFileServer(enableDirectoryBrowsing: true);

app.UseRouting();

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aşağıdaki dizin hiyerarşisini göz önünde bulundurun:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • MyImage.jpg
    • default.html

Aşağıdaki kod statik dosyaların sunulmasını, varsayılan dosyanın ve dizinine göz atmayı MyStaticFilesetkinleştirir:

using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDirectoryBrowser();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseFileServer(new FileServerOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles",
    EnableDirectoryBrowsing = true
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

EnableDirectoryBrowsing özelliğinin değeri true olduğunda AddDirectoryBrowser çağrılmalıdır.

Yukarıdaki dosya hiyerarşisini ve kodunu kullanarak URL'ler aşağıdaki gibi çözümlenir:

URI Yanıt
https://<hostname>/StaticFiles/images/MyImage.jpg MyStaticFiles/images/MyImage.jpg
https://<hostname>/StaticFiles MyStaticFiles/default.html

MyStaticFiles dizininde varsayılan adlandırılmış dosya yoksa, https://<hostname>/StaticFiles tıklanabilir bağlantılarla dizin listesini döndürür:

Statik dosyalar listesi

UseDefaultFiles ve UseDirectoryBrowser, sonunda bir / olmayan hedef URI'den, sonunda bir / olan hedef URI'ye istemci tarafında bir yeniden yönlendirme gerçekleştirir. Örneğin, https://<hostname>/StaticFiles'den https://<hostname>/StaticFiles/'e. Sonunda eğik çizgi (/) olmadan StaticFiles dizinindeki göreli URL'ler, RedirectToAppendTrailingSlash seçeneği kullanılmazsa DefaultFilesOptions geçersizdir.

FileExtensionContentTypeProvider

sınıfı, FileExtensionContentTypeProvider dosya uzantılarının MIME içerik türlerine eşlemesi olarak hizmet veren bir Mappings özellik içerir. Aşağıdaki örnekte, bilinen MIME türlerine birkaç dosya uzantısı eşlenmiştir. .rtf uzantısı değiştirilir ve .mp4 kaldırılır:

using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");

app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Bkz. MIME içerik türleri.

Standart olmayan içerik türleri

Statik Dosya Ara Yazılımı, neredeyse 400 bilinen dosya içerik türünü anlar. Kullanıcı bilinmeyen bir dosya türüne sahip bir dosya isterse, Statik Dosya Ara Yazılımı isteği işlem hattındaki bir sonraki ara yazılıma geçirir. İsteği işleyen ara yazılım yoksa 404 Bulunamadı yanıtı döndürülür. Dizine gözatma etkinse, dizin listesinde dosyanın bağlantısı görüntülenir.

Aşağıdaki kod bilinmeyen türlerin sunulmasını sağlar ve bilinmeyen dosyayı görüntü olarak işler:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true,
    DefaultContentType = "image/png"
});

app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Yukarıdaki kodla, bilinmeyen içerik türüne sahip bir dosya isteği görüntü olarak döndürülür.

Uyarı

ServeUnknownFileTypes Etkinleştirme bir güvenlik riskidir. Varsayılan olarak devre dışıdır ve kullanımı önerilmez. FileExtensionContentTypeProvider , standart olmayan uzantılarla dosya sunmanın daha güvenli bir alternatifidir.

Dosyaları birden çok konumdan sunma

Dosyayı görüntüleyen aşağıdaki Razor sayfayı /MyStaticFiles/image3.png göz önünde bulundurun:

@page

<p> Test /MyStaticFiles/image3.png</p>

<img src="~/image3.png" class="img" asp-append-version="true" alt="Test">

UseStaticFiles ve UseFileServer, varsayılan olarak wwwroot öğesini gösteren dosya sağlayıcısına ayarlanmıştır. UseStaticFiles ve UseFileServer ek örnekleri, diğer konumlardaki dosyaları sunmak için diğer dosya sağlayıcılarıyla sağlanabilir. Aşağıdaki örnek, dosyaları hem wwwroot hem de MyStaticFiles'den sunmak için UseStaticFiles iki kez çağrılır:

app.UseStaticFiles(); // Serve files from wwwroot
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles"))
});

Önceki kodu kullanarak:

Aşağıdaki kod, Image Tag Helper'ın bir sürüm sağlamasına olanak tanıyan WebRootFileProvider öğesini güncelleştirir.

var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
  Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles"));

var compositeProvider = new CompositeFileProvider(webRootProvider,
                                                  newPathProvider);

// Update the default provider.
app.Environment.WebRootFileProvider = compositeProvider;

app.UseStaticFiles();

Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler

Uyarı

UseDirectoryBrowser ve UseStaticFiles sırları sızdırabilir. Üretimde dizine gözatmayı devre dışı bırakmak kesinlikle önerilir. UseStaticFiles veya UseDirectoryBrowser aracılığıyla hangi dizinlerin etkinleştirildiğini dikkatle gözden geçirin. Tüm dizin ve alt dizinleri genel olarak erişilebilir hale gelir. Genel kullanıma sunulması için uygun dosyaları gibi <content_root>/wwwrootayrılmış bir dizinde depolayın. Bu dosyaları MVC görünümlerinden, Sayfalardan, Razor yapılandırma dosyalarından vb. ayırın.

  • ile UseDirectoryBrowserUseStaticFiles kullanıma sunulan içerik URL'leri, temel alınan dosya sisteminin büyük/küçük harf duyarlılığına ve karakter kısıtlamalarına tabidir. Örneğin, Windows büyük/küçük harfe duyarlı değildir, ancak macOS ve Linux değildir.

  • IIS'de barındırılan ASP.NET Core uygulamaları, statik dosya istekleri de dahil olmak üzere tüm istekleri uygulamaya iletmek için ASP.NET Çekirdek Modülünü kullanır. IIS statik dosya işleyicisi kullanılmaz ve istekleri işleme şansı yoktur.

  • IIS statik dosya işleyicisini sunucu veya web sitesi düzeyinde kaldırmak için IIS Yöneticisi'nde aşağıdaki adımları tamamlayın:

    1. Modüller özelliğine gidin.
    2. Listede StaticFileModule öğesini seçin.
    3. Eylemler kenar çubuğunda Kaldır'a tıklayın.

Uyarı

IIS statik dosya işleyicisi etkinse ve ASP.NET Çekirdek Modülü yanlış yapılandırıldıysa, statik dosyalar sunulur. Bu, örneğin web.config dosyası dağıtılmadıysa gerçekleşir.

  • ve .csdahil olmak üzere .cshtml kod dosyalarını uygulama projesinin web kökünün dışına yerleştirin. Bu nedenle uygulamanın istemci tarafı içeriğiyle sunucu tabanlı kod arasında mantıksal bir ayrım oluşturulur. Bu, sunucu tarafı kodun sızdırılmasını önler.

IWebHostEnvironment.WebRootPath'i güncelleştirerek wwwroot dışında dosya sunma

IWebHostEnvironment.WebRootPath wwwroot dışındaki bir klasöre ayarlandığında:

  • Geliştirme ortamında, hem wwwroot hem de güncellenmiş IWebHostEnvironment.WebRootPath içinde bulunan statik varlıklar wwwroot'den sunulur.
  • Geliştirme dışındaki herhangi bir ortamda, güncelleştirilmiş IWebHostEnvironment.WebRootPath klasörden yinelenen statik varlıklar sunulur.

Boş web şablonuyla oluşturulmuş bir web uygulamasını düşünün:

  • Index.html ve wwwroot içinde wwwroot-custom bir dosya içerir.

  • Güncellenmiş Program.cs dosyasını ayarlayan WebRootPath = "wwwroot-custom" ile:

    var builder = WebApplication.CreateBuilder(new WebApplicationOptions
    {
        Args = args,
        // Look for static files in "wwwroot-custom"
        WebRootPath = "wwwroot-custom"
    });
    
    var app = builder.Build();
    
    app.UseDefaultFiles();
    app.UseStaticFiles();
    
    app.Run();
    

Öncesindeki kodda, /'a yapılan istekler:

  • Geliştirme ortamında dönüş wwwroot/Index.html
  • Geliştirme ortamı dışındaki herhangi bir ortamda geri dön wwwroot-custom/Index.html

wwwroot-custom varlıklarının döndürülmesini sağlamak için aşağıdaki yaklaşımlardan birini kullanın:

  • wwwroot içindeki yinelenen adlandırılmış varlıkları silin.

  • `Properties/launchSettings.json içindeki "ASPNETCORE_ENVIRONMENT" öğesini "Development" dışındaki herhangi bir değere ayarlayın.`

  • Proje dosyasında ayarlayarak <StaticWebAssetsEnabled>false</StaticWebAssetsEnabled> statik web varlıklarını tamamen devre dışı bırakın. UYARI, statik web varlıklarını devre dışı bırakmak Sınıf Kitaplıklarını Razordevre dışı bırakır.

  • Proje dosyasına aşağıdaki JSON dosyasını ekleyin:

    <ItemGroup>
        <Content Remove="wwwroot\**" />
    </ItemGroup>
    

Aşağıdaki kod, IWebHostEnvironment.WebRootPath'yı geliştirme dışı bir değere günceller, bu da yinelenen içeriğin wwwroot-custom'den wwwroot yerine döndürülmesini garanti eder.

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    Args = args,
    // Examine Hosting environment: logging value
    EnvironmentName = Environments.Staging,
    WebRootPath = "wwwroot-custom"
});

var app = builder.Build();

app.Logger.LogInformation("ASPNETCORE_ENVIRONMENT: {env}",
      Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));

app.Logger.LogInformation("app.Environment.IsDevelopment(): {env}",
      app.Environment.IsDevelopment().ToString());

app.UseDefaultFiles();
app.UseStaticFiles();

app.Run();

Ek kaynaklar

Yayımlayanlar Rick Anderson ve Kirk Larkin

HTML, CSS, görüntüler ve JavaScript gibi statik dosyalar, ASP.NET Core uygulamasının varsayılan olarak istemcilere doğrudan hizmet verdiği varlıklardır.

Örnek kodu görüntüleme veya indirme (indirme)

Statik dosyaları sunma

Statik dosyalar projenin web kök dizininde depolanır. Varsayılan dizin şeklindedir {content root}/wwwroot, ancak yöntemiyle UseWebRoot değiştirilebilir. Daha fazla bilgi için bkz . İçerik kökü ve Web kökü.

CreateDefaultBuilder yöntemi, içerik kökünü geçerli dizine ayarlar:

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>();
            });
}

Yukarıdaki kod web uygulaması şablonuyla oluşturulmuştur.

Statik dosyalara web köküne göre bir yol üzerinden erişilebilir. Örneğin, Web Uygulaması proje şablonları klasörün içinde wwwroot birkaç klasör içerir:

  • wwwroot
    • css
    • js
    • lib

wwwroot/images klasörünü oluşturmayı ve dosyayı eklemeyi wwwroot/images/MyImage.jpg göz önünde bulundurun. klasöründeki images bir dosyaya erişmek için URI biçimi şeklindedir https://<hostname>/images/<image_file_name>. Örneğin https://localhost:5001/images/MyImage.jpg

Dosyaları web kökünde sun

Varsayılan web uygulaması şablonları, statik dosyaların sunulmasını sağlayan UseStaticFiles yöntemini Startup.Configure içinde çağırır.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Parametresiz yöntem aşırı yüklemesi, web kök dizinindeki dosyaları hizmet verilebilir olarak işaretler. Aşağıdaki işaretleme şu referansa sahiptir wwwroot/images/MyImage.jpg:

<img src="~/images/MyImage.jpg" class="img" alt="My image" />

Yukarıdaki kodda tilde karakteri ~/ web kökünü işaret ediyor.

Dosyaları web kök dizini dışında sunma

Hizmet alınacak statik dosyaların web kökü dışında bulunduğu bir dizin hiyerarşisi düşünün:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • red-rose.jpg

Bir istek, Statik Dosya Ara Yazılımını aşağıdaki gibi yapılandırarak red-rose.jpg dosyasına erişebilir.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Yukarıdaki kodda MyStaticFiles dizin hiyerarşisi StaticFiles URI kesimi aracılığıyla genel kullanıma sunulur. https://<hostname>/StaticFiles/images/red-rose.jpg için bir red-rose.jpg dosyası isteği.

Aşağıdaki kod etiketi MyStaticFiles/images/red-rose.jpg'ya atıfta bulunur:

<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />

HTTP yanıt üst bilgilerini ayarla

Nesne StaticFileOptions , HTTP yanıt üst bilgilerini ayarlamak için kullanılabilir. Statik dosya sunumunu web kökünden yapılandırmanın yanı sıra, aşağıdaki kod Cache-Control üst bilgisini ayarlar.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    const string cacheMaxAge = "604800";
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            // using Microsoft.AspNetCore.Http;
            ctx.Context.Response.Headers.Append(
                 "Cache-Control", $"public, max-age={cacheMaxAge}");
        }
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Yukarıdaki kod maksimum yaşı 604800 saniye (7 gün) olarak ayarlar.

Yanıt üst bilgileri, Cache-Control üst bilgisinin eklendiğini gösteriyor

Statik dosya yetkilendirme

ASP.NET Core şablonları UseStaticFiles öğesini UseAuthorization öğesinden önce çağırır. Çoğu uygulama bu deseni izler. Statik Dosya Ara Yazılımı yetkilendirme ara yazılımından önce çağrıldığında:

  • Statik dosyalarda yetkilendirme denetimi yapılmaz.
  • Statik Dosya Ara Yazılımı tarafından sunulan statik dosyalara( örneğin, altındakilere wwwroot) genel erişim sağlanır.

Yetkilendirmeye dayalı statik dosyalar sunmak için:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // wwwroot css, JavaScript, and images don't require authentication.
    app.UseStaticFiles();   

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
                     Path.Combine(env.ContentRootPath, "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();

        services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
        });
    }

    // Remaining code ommitted for brevity.

Önceki kodda, geri dönüş yetkilendirme ilkesi, tüm kullanıcıların kimliklerinin doğrulanmasını gerektirir. Kendi yetkilendirme gereksinimlerini belirten denetleyiciler, Razor Sayfalar gibi uç noktalar geri dönüş yetkilendirme ilkesini kullanmaz. Örneğin, Razor Sayfalar, denetleyiciler veya eylem yöntemleri, [AllowAnonymous] veya [Authorize(PolicyName="MyPolicy")] kullanılarak geri dönüş yetkilendirme politikasından ziyade uygulanan yetkilendirme özniteliğini kullanır.

RequireAuthenticatedUser, geçerli kullanıcı olan kişinin kimliğinin doğrulandığını zorlayan DenyAnonymousAuthorizationRequirement öğesini geçerli örneğe ekler.

wwwroot altındaki statik varlıklara, app.UseStaticFiles(); olan varsayılan Statik Dosya Ara Yazılımı UseAuthentication'den önce çağrıldığı için genel erişim sağlanır. MyStaticFiles klasöründeki statik varlıklar kimlik doğrulaması gerektirir. Örnek kod bunu gösterir.

Dosyaları yetkilendirmeye göre sunmak için alternatif bir yaklaşım:

  • Bunları wwwroot ile Statik Dosya Ara Yazılımı tarafından erişilebilen herhangi bir dizinin dışında depolayın.
  • Yetkilendirmenin uygulandığı bir eylem yöntemi aracılığıyla bunları sunma ve bir FileResult nesne döndürme:
[Authorize]
public IActionResult BannerImage()
{
    var filePath = Path.Combine(
        _env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");

    return PhysicalFile(filePath, "image/jpeg");
}

Dizin tarama

Dizin gözatma, belirtilen dizinler içinde dizin listelemeye izin verir.

Dizine gözatma, güvenlik nedeniyle varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz . Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler.

Dizine gözatmayı şu şekilde etkinleştirin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDirectoryBrowser();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Önceki kod, URL https://<hostname>/MyImages kullanarak wwwroot/images klasörü içinde dizine göz atılmasına olanak tanır ve her dosya ile klasöre bağlantı verir.

dizin tarama

Varsayılan belgeleri sunma

Varsayılan sayfayı ayarlamak, ziyaretçilere sitede bir başlangıç noktası sağlar. wwwroot konumundan isteğin URL'sinde dosya adını belirtmeye gerek kalmadan varsayılan bir dosya sunmak için UseDefaultFiles yöntemini çağırın.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseDefaultFiles();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

UseDefaultFiles varsayılan dosyaya hizmet vermek için önce UseStaticFiles çağrılmalıdır. UseDefaultFiles , dosyaya hizmet içermeyen bir URL yeniden yazma işlemidir.

ile UseDefaultFiles, aşağıdakiler için arama yapılan bir klasöre istekte bulunur wwwroot :

  • default.htm
  • default.html
  • index.htm
  • index.html

Listeden bulunan ilk dosya, istek dosyanın adını içeriyormuş gibi sunulur. Tarayıcı URL'si istenen URI'yi yansıtmaya devam eder.

Aşağıdaki kod, varsayılan dosya adını olarak mydefault.htmldeğiştirir:

var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();

Aşağıdaki kod, önceki kodla birlikte Startup.Configure'yi gösterir:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    var options = new DefaultFilesOptions();
    options.DefaultFileNames.Clear();
    options.DefaultFileNames.Add("mydefault.html");
    app.UseDefaultFiles(options);
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Varsayılan belgeler için UseFileServer

UseFileServer, UseStaticFiles ve UseDefaultFiles işlevlerini birleştirir, isteğe bağlı olarak UseDirectoryBrowser.

Statik dosyaların ve varsayılan dosyanın sunulmasını etkinleştirmek için app.UseFileServer çağrı yapın. Dizine gözatma etkin değil. Aşağıdaki kod, Startup.Configure ile UseFileServer'yi gösterir:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseFileServer();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Aşağıdaki kod statik dosyaların, varsayılan dosyanın ve dizin taramanın sunulmasını sağlar:

app.UseFileServer(enableDirectoryBrowsing: true);

Aşağıdaki kod, Startup.Configure'u önceki kod ile birlikte gösterir:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseFileServer(enableDirectoryBrowsing: true);

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Aşağıdaki dizin hiyerarşisini göz önünde bulundurun:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • MyImage.jpg
    • default.html

Aşağıdaki kod statik dosyaların sunulmasını, varsayılan dosyanın ve dizinine göz atmayı MyStaticFilesetkinleştirir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDirectoryBrowser();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles(); // For the wwwroot folder.

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseFileServer(new FileServerOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "MyStaticFiles")),
        RequestPath = "/StaticFiles",
        EnableDirectoryBrowsing = true
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

EnableDirectoryBrowsing özelliği true değeri olduğunda AddDirectoryBrowser çağrılmalıdır.

Dosya hiyerarşisini ve önceki kodu kullanarak URL'ler aşağıdaki gibi çözümlenir:

URI Yanıt
https://<hostname>/StaticFiles/images/MyImage.jpg MyStaticFiles/images/MyImage.jpg
https://<hostname>/StaticFiles MyStaticFiles/default.html

MyStaticFiles dizininde varsayılan adlandırılmış dosya yoksa, https://<hostname>/StaticFiles tıklanabilir bağlantılarla dizin listesini döndürür:

Statik dosyalar listesi

UseDefaultFiles ve UseDirectoryBrowser, sonunda / olmayan hedef URI'den, sonunda / olan hedef URI'ye istemci tarafı yönlendirmesi gerçekleştirir. Örneğin, https://<hostname>/StaticFiles'den https://<hostname>/StaticFiles/'e. StaticFiles dizinindeki göreli URL'ler , sonunda eğik çizgi (/ ) olmadan geçersizdir.

FileExtensionContentTypeProvider

sınıfı, FileExtensionContentTypeProvider dosya uzantılarının MIME içerik türlerine eşlemesi olarak hizmet veren bir Mappings özellik içerir. Aşağıdaki örnekte, bilinen MIME türlerine birkaç dosya uzantısı eşlenmiştir. .rtf uzantısı değiştirilir ve .mp4 kaldırılır:

// using Microsoft.AspNetCore.StaticFiles;
// using Microsoft.Extensions.FileProviders;
// using System.IO;

// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(env.WebRootPath, "images")),
    RequestPath = "/MyImages",
    ContentTypeProvider = provider
});

app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(env.WebRootPath, "images")),
    RequestPath = "/MyImages"
});

Aşağıdaki kod, önceki kodu Startup.Configure ile birlikte gösterir.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.AspNetCore.StaticFiles;
    // using Microsoft.Extensions.FileProviders;
    // using System.IO;

    // Set up custom content types - associating file extension to MIME type
    var provider = new FileExtensionContentTypeProvider();
    // Add new mappings
    provider.Mappings[".myapp"] = "application/x-msdownload";
    provider.Mappings[".htm3"] = "text/html";
    provider.Mappings[".image"] = "image/png";
    // Replace an existing mapping
    provider.Mappings[".rtf"] = "application/x-msdownload";
    // Remove MP4 videos.
    provider.Mappings.Remove(".mp4");

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages",
        ContentTypeProvider = provider
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Bkz. MIME içerik türleri.

Standart olmayan içerik türleri

Statik Dosya Ara Yazılımı, neredeyse 400 bilinen dosya içerik türünü anlar. Kullanıcı bilinmeyen bir dosya türüne sahip bir dosya isterse, Statik Dosya Ara Yazılımı isteği işlem hattındaki bir sonraki ara yazılıma geçirir. İsteği işleyen ara yazılım yoksa 404 Bulunamadı yanıtı döndürülür. Dizine gözatma etkinse, dizin listesinde dosyanın bağlantısı görüntülenir.

Aşağıdaki kod bilinmeyen türlerin sunulmasını sağlar ve bilinmeyen dosyayı görüntü olarak işler:

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true,
    DefaultContentType = "image/png"
});

Aşağıdaki kod, önceki kodla birlikte Startup.Configure göstermektedir.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles(new StaticFileOptions
    {
        ServeUnknownFileTypes = true,
        DefaultContentType = "image/png"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Yukarıdaki kodla, bilinmeyen içerik türüne sahip bir dosya isteği görüntü olarak döndürülür.

Uyarı

ServeUnknownFileTypes Etkinleştirme bir güvenlik riskidir. Varsayılan olarak devre dışıdır ve kullanımı önerilmez. FileExtensionContentTypeProvider , standart olmayan uzantılarla dosya sunmanın daha güvenli bir alternatifidir.

Dosyaları birden çok konumdan sunma

UseStaticFiles ve UseFileServer, varsayılan olarak wwwroot öğesine işaret eden dosya sağlayıcıdır. UseStaticFiles ve UseFileServer ek örnekleri, diğer konumlardaki dosyaları sunmak için diğer dosya sağlayıcılarıyla birlikte sağlanabilir. Daha fazla bilgi için bu GitHub konusuna bakın.

Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler

Uyarı

UseDirectoryBrowser ve UseStaticFiles sırları sızdırabilir. Üretimde dizine gözatmayı devre dışı bırakmak kesinlikle önerilir. UseStaticFiles veya UseDirectoryBrowser aracılığıyla etkinleştirilen dizinleri dikkatle gözden geçirin. Tüm dizin ve alt dizinleri genel olarak erişilebilir hale gelir. Genel kullanıma sunulması için uygun dosyaları gibi <content_root>/wwwrootayrılmış bir dizinde depolayın. Bu dosyaları MVC görünümlerinden, Sayfalardan, Razor yapılandırma dosyalarından vb. ayırın.

  • ile UseDirectoryBrowserUseStaticFiles kullanıma sunulan içerik URL'leri, temel alınan dosya sisteminin büyük/küçük harf duyarlılığına ve karakter kısıtlamalarına tabidir. Örneğin, Windows büyük/küçük harfe duyarlı değildir, ancak macOS ve Linux değildir.

  • IIS'de barındırılan ASP.NET Core uygulamaları, statik dosya istekleri de dahil olmak üzere tüm istekleri uygulamaya iletmek için ASP.NET Çekirdek Modülünü kullanır. IIS statik dosya işleyicisi kullanılmaz ve istekleri işleme şansı yoktur.

  • IIS statik dosya işleyicisini sunucu veya web sitesi düzeyinde kaldırmak için IIS Yöneticisi'nde aşağıdaki adımları tamamlayın:

    1. Modüller özelliğine gidin.
    2. Listede StaticFileModule öğesini seçin.
    3. Eylemler kenar çubuğunda Kaldır'a tıklayın.

Uyarı

IIS statik dosya işleyicisi etkinse ve ASP.NET Çekirdek Modülü yanlış yapılandırıldıysa, statik dosyalar sunulur. Bu, örneğin web.config dosyası dağıtılmadıysa gerçekleşir.

  • ve .csdahil olmak üzere .cshtml kod dosyalarını uygulama projesinin web kökünün dışına yerleştirin. Bu nedenle uygulamanın istemci tarafı içeriğiyle sunucu tabanlı kod arasında mantıksal bir ayrım oluşturulur. Bu, sunucu tarafı kodun sızdırılmasını önler.

Ek kaynaklar