ASP.NET Core'daki statik dosyalar
Rick Anderson ve Rick Larkin
HTML, CSS, görüntüler ve JavaScript gibi statik dosyalar, varsayılan olarak ASP.NET Core bir uygulamanın doğrudan istemcilere hizmet ettiği varlıklardır.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Statik dosyaları hizmet etme
Statik dosyalar projenin web kök dizininde depolanır. Varsayılan {content root}/wwwroot dizindir, ancak yöntemiyle UseWebRoot değiştirilebilir. Daha fazla bilgi için bkz. İçerik kökü ve Web kökü.
yöntemi, CreateDefaultBuilder 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ş.
Statik dosyalara web köküne göre bir yol üzerinden erişilebilir. Örneğin, Web Uygulaması proje şablonları klasör içinde birkaç klasör wwwroot içerir:
wwwrootcssjslib
wwwroot/images klasörünü oluşturmayı ve wwwroot/images/MyImage.jpgeklemeyi göz önünde bulundurabilirsiniz. klasöründeki bir dosyaya erişmek için URI images biçimi şu https://<hostname>/images/<image_file_name> şekildedir: . Örneğin, https://localhost:5001/images/MyImage.jpg
Dosyaları web kökünde hizmet etme
Varsayılan web uygulaması şablonları' içinde yöntemini UseStaticFiles çağırarak Startup.Configure statik dosyaların hizmet uzlağan bir şekilde tamamlanmsını sağlar:
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 UseStaticFiles aşırı yüklemesi, web kökünde dosyaları servable olarak işaretler. Aşağıdaki işaretleme wwwroot/images/MyImage.jpg:
<img src="~/images/MyImage.jpg" class="img" alt="My image" />
Yukarıdaki kodda, tilde karakteri ~/ web kökünü ifade ediyor.
Dosyaları web kökü dışında hizmet etme
Hizmet için statik dosyaların web kökü dışında bulunduğu bir dizin hiyerarşisi düşünün:
wwwrootcssimagesjs
MyStaticFilesimagesred-rose.jpg
Bir istek, Statik red-rose.jpg Dosya Ara Yazılımı'nın aşağıdaki gibi yapılandırarak dosyaya erişebilirsiniz:
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 segmenti aracılığıyla genel kullanıma açıktır. dosyanın https://<hostname>/StaticFiles/images/red-rose.jpg hizmet ettiği red-rose.jpg.
Aşağıdaki işaretleme MyStaticFiles/images/red-rose.jpg:
<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />
HTTP yanıt üst bilgilerini ayarlama
HTTP StaticFileOptions yanıt üst bilgilerini ayarlamak için bir nesnesi kullanılabilir. Web kökünden hizmet veren statik dosyayı yapılandırmaya ek olarak,aşağıdaki kod üst bilgi Cache-Control 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();
});
}
Statik dosyalar 600 saniye için genel olarak önbelleğe alınabilir:

Statik dosya yetkilendirmesi
Uygulama ASP.NET Core çağrılmadan UseStaticFiles önce UseAuthorization çağrılır. Çoğu uygulama bu düzeni takip eder. Statik Dosya Ara Yazılımı yetkilendirme ara yazılımı öncesinde çağrıldı mı:
- Statik dosyalarda yetkilendirme denetimi gerçekleştir alınmaz.
- Statik Dosya Ara Yazılımı tarafından sunulan statik dosyalar , altındakiler gibi
wwwrootgenel erişime açıktır.
Statik dosyaları yetkilendirmeye göre hizmet vermek için:
- Bunları dışında
wwwrootdepolar. - çağrısında
UseStaticFilesbulunduktan sonra bir yol belirterek çağrısındaUseAuthorizationbulundu. - Geri dönüş yetkilendirme ilkesi'ni ayarlayın.
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 kimlik doğrulamalarını gerektirir. Denetleyiciler, Sayfalar vb. gibi kendi yetkilendirme gereksinimlerini belirten uç noktalar Razor geri dönüş yetkilendirme ilkesi kullanmaz. Örneğin, Sayfalar, denetleyiciler veya eylem yöntemleri ile veya geri dönüş yetkilendirme ilkesi Razor [AllowAnonymous] yerine uygulanan yetkilendirme [Authorize(PolicyName="MyPolicy")] özniteliğini kullanır.
RequireAuthenticatedUser , DenyAnonymousAuthorizationRequirement geçerli kullanıcının kimlik doğrulamasının zorlandığı geçerli örneği ekler.
altındaki statik wwwroot varlıklara genel erişime açık çünkü varsayılan Statik Dosya Ara Yazılımı ( app.UseStaticFiles(); ) önce çağrılır. UseAuthentication MyStaticFiles klasöründeki statik varlıklar kimlik doğrulaması gerektirir. Örnek kod bunu gösteriyor.
Yetkilendirmeye dayalı dosyalarda hizmet vermek için alternatif bir yaklaşım şunları yapmaktır:
- Bunları Statik Dosya Ara
wwwrootYazılımı'nın dışında ve erişilebilen herhangi bir dizinin dışında depolar. - Yetkilendirmenin uygulandığı bir eylem yöntemi aracılığıyla bunları hizmet etme ve bir nesnesi FileResult iade etme:
[Authorize]
public IActionResult BannerImage()
{
var filePath = Path.Combine(
_env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
Dizin tarama
Dizin tarama, belirtilen dizinler içinde dizin listelemeye izin verir.
Dizin tarama güvenlik nedenleriyle varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz. Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler.
Dizin taramayı şu şekilde etkinleştirin:
- AddDirectoryBrowser içinde
Startup.ConfigureServices. - UseDirectoryBrowser içinde
Startup.Configure.
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();
});
}
Yukarıdaki kod, url'sini kullanarak wwwroot/images klasörünün dizin tarama özelliğine izin verir ve her bir dosya https://<hostname>/MyImages ve klasörün bağlantılarını içerir:

Varsayılan belgeleri teslim etme
Varsayılan sayfayı ayarlama, ziyaretçilere site üzerinde bir başlangıç noktası sağlar. İstek URL'sinin wwwroot dosyanın adını içermesi gerekmeden 'den varsayılan bir dosyayı vermek için yöntemini UseDefaultFiles çağrısı yapı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 dosyayı hizmet vermek UseStaticFiles için önce çağrılmalı. UseDefaultFiles , dosyaya hizmet etmeyen bir URL yeniden yazıcıdır.
ile, UseDefaultFiles şu aramada bir wwwroot klasöre istekler:
- default.htm
- default.html
- index.htm
- index.html
Listede bulunan ilk dosya, isteğin dosyanın adını dahil etti gibi hizmet edilir. Tarayıcı URL'si istenen URI'yi yansıtmaya devam eder.
Aşağıdaki kod varsayılan dosya adınımydefault.htm l olarak değiştirir:
var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();
Aşağıdaki kod önceki Startup.Configure kodla birlikte 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 , ve isteğe UseStaticFiles bağlı olarak işlevlerini UseDefaultFiles UseDirectoryBrowser birleştirir.
Statik app.UseFileServer dosyaların ve varsayılan dosyanın hizmet vermeye olanak sağlamak için çağrısı. Dizin tarama etkin değil. Aşağıdaki kod ile Startup.Configure birlikte UseFileServer 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 servise olanak sağlar:
app.UseFileServer(enableDirectoryBrowsing: true);
Aşağıdaki kod önceki Startup.Configure kodla 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 düşünün:
wwwrootcssimagesjs
MyStaticFilesimagesMyImage.jpg
default.html
Aşağıdaki kod, statik dosyaların, varsayılan dosyanın ve dizinine göz atarak hizmet vermeye olanak MyStaticFiles sağlar:
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();
});
}
AddDirectoryBrowserözellik değeri olduğunda EnableDirectoryBrowsing çağrılmalı. true
Dosya hiyerarşisini ve önceki kodu kullanarak URL'ler aşağıdaki gibi çözümlenebilir:
| URI | Yanıt |
|---|---|
https://<hostname>/StaticFiles/images/MyImage.jpg |
MyStaticFiles/images/MyImage.jpg |
https://<hostname>/StaticFiles |
MyStaticFiles/default.html |
MyStaticFiles dizininde varsayılan adlı bir dosya yoksa, tıklanabilir https://<hostname>/StaticFiles bağlantılarla dizin listesini döndürür:

UseDefaultFilesve UseDirectoryBrowser sonda bir ile hedef URI'ye sonda olmadan hedef URI'den istemci / tarafı yeniden yönlendirmesi gerçekleştirin. / Örneğin, ile https://<hostname>/StaticFiles . https://<hostname>/StaticFiles/ StaticFiles dizininde bulunan göreli URL'ler, eğik çizgi olmadan geçersizdir ( / ).
FileExtensionContentTypeProvider
sınıfı, FileExtensionContentTypeProvider Mappings miME içerik türlerine dosya uzantıları eşlemesi olarak hizmet veren bir özellik içerir. Aşağıdaki örnekte, çeşitli dosya uzantıları bilinen MIME türlerine eşlenmiş. .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 Startup.Configure kodla 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ı, bilinen neredeyse 400 dosya içerik türlerini anlar. Kullanıcı bilinmeyen dosya türüne sahip bir dosya isteğinde bulunsa, Statik Dosya Ara Yazılımı isteği işlem hattında bir sonraki ara yazılıma iletir. İsteği hiçbir ara yazılım işlemezse 404 Bulunamadı yanıtı döndürülür. Dizin tarama etkinse, bir dizin listelemesinde dosyanın bağlantısı görüntülenir.
Aşağıdaki kod, bilinmeyen türlerin hizmet 90'ları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 Startup.Configure kodla 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.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true,
DefaultContentType = "image/png"
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});
}
Yukarıdaki kodda, bilinmeyen içerik türüne sahip bir dosya isteği görüntü olarak döndürülür.
Uyarı
Etkinleştirme bir ServeUnknownFileTypes güvenlik riskidir. Varsayılan olarak devre dışıdır ve kullanımı önerilmez. FileExtensionContentTypeProvider, standart olmayan uzantılara sahip dosyaları sunan daha güvenli bir alternatif sağlar.
Dosyaları birden çok konumdan hizmet etme
UseStaticFiles ve UseFileServer varsayılan olarak dosya sağlayıcısına işaret wwwroot eder. Ve'nin ek UseStaticFiles UseFileServer örnekleri, diğer konumlardan dosyaları hizmet vermek için diğer dosya sağlayıcılarıyla sağlanmalıdır. Daha fazla bilgi için bu soruna GitHub bakın.
Statik dosyalar için güvenlikle ilgili dikkat edilmesi gerekenler
Uyarı
UseDirectoryBrowser ve UseStaticFiles gizli dizileri sızdırıyor olabilir. Dizin taramayı üretimde devre dışı bırakmak kesinlikle önerilir. veya aracılığıyla hangi dizinlerin etkinleştirildiğinde dikkatli bir şekilde UseStaticFiles gözden UseDirectoryBrowser geçirme. Dizinin tamamı ve alt dizinleri genel erişime açık hale geldi. Genel hizmet vermeye uygun dosyaları gibi ayrılmış bir dizinde <content_root>/wwwroot depolar. Bu dosyaları MVC görünümlerinden, Razor Sayfalardan, yapılandırma dosyalarından vb. ayırma.
ve ile ortaya konu olan içeriğin
UseDirectoryBrowserUseStaticFilesURL'leri, temel alınan dosya sisteminin büyük/küçük harf duyarlılığı ve karakter kısıtlamalarına tabi olur. Örneğin, Windows büyük/büyük/büyük harfe duyarlı değildir, ancak macOS ve Linux değildir.ASP.NET Core iis'de barındırılan uygulamaların statik dosya istekleri de dahil olmak üzere tüm istekleri uygulamaya iletmesi için ASP.NET Core Modülünü kullanın. 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:
- Modüller özelliğine gidin.
- Listeden StaticFileModule öğesini seçin.
- Eylemler kenar çubuğu'nda Kaldır'a tıklayın.
Uyarı
IIS statik dosya işleyicisi etkinse ve ASP.NET Core Modül yanlış yapılandırılmışsa statik dosyalar hizmet edilir. Bu durum, örneğinweb.config dağıtılamasa gerçekleşir.
- .cs ve .cshtml de dahil olmak üzere kod dosyalarını uygulama projesinin web kökünün dışına girin. Bu nedenle uygulamanın istemci tarafı içeriği ile sunucu tabanlı kod arasında mantıksal bir ayrım oluşturulur. Bu, sunucu tarafı kodunun sızmasını önler.
Ek kaynaklar
Rick Anderson ve Scott Addie
HTML, CSS, görüntüler ve JavaScript gibi statik dosyalar, bir uygulamanın doğrudan istemcilere ASP.NET Core varlıklardır. Bu dosyaların hizmet vermeye olanak sağlamak için bazı yapılandırmalar gerekir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Statik dosyaları hizmet etme
Statik dosyalar projenin web kök dizininde depolanır. Varsayılan dizin {content root}/wwwroot dizinidir, ancak yöntemiyle UseWebRoot değiştirilebilir. Daha fazla bilgi için bkz. İçerik kökü ve Web kökü.
Uygulamanın web ana bilgisayarının içerik kök dizininden haberdar olması gerekir.
yöntemi, WebHost.CreateDefaultBuilder içerik kökünü geçerli dizine ayarlar:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Statik dosyalara web köküne göre bir yol üzerinden erişilebilir. Örneğin, Web Uygulaması proje şablonu klasör içinde birkaç klasör wwwroot içerir:
wwwrootcssimagesjs
Images alt klasörü içinde bir dosyaya erişmek için URI biçimi <server_address> /images/ http:// biçimindedir. <image_file_name> Örneğin, http://localhost:9189/images/banner3.svg.
Hedef .NET Framework Microsoft.AspNetCore.StaticFiles paketini projeye ekleyin. .NET Core hedeflense, Microsoft.AspNetCore.App paketi bu paketi içerir.
Statik dosyaların serviseolanak sağlayan ara yazılımı yapılandırma.
Dosyaları web kökü içinde hizmet etme
içinde UseStaticFiles yöntemini Startup.Configure çağırma:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
Parametresiz yöntem UseStaticFiles aşırı yüklemesi, web kökünde dosyaları servable olarak işaretler. Aşağıdaki işaretleme wwwroot/images/banner1.svg adresine başvurur:
<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
Yukarıdaki kodda, tilde karakteri ~/ web kökünü ifade ediyor.
Dosyaları web kökü dışında hizmet etme
Hizmet için statik dosyaların web kökü dışında bulunduğu bir dizin hiyerarşisi düşünün:
wwwrootcssimagesjs
MyStaticFilesimagesbanner1.svg
Bir istek, Statik Dosya Ara Yazılım'sını aşağıdaki gibi yapılandırarak banner1.svg dosyasına erişebilirsiniz:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // For the wwwroot folder
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
RequestPath = "/StaticFiles"
});
}
Yukarıdaki kodda, MyStaticFiles dizin hiyerarşisi StaticFiles URI segmenti aracılığıyla genel kullanıma açıktır. <server_address> /StaticFiles/images/banner1.svg dosyasını http:// isteği banner1.svg dosyasına hizmet vermektedir.
Aşağıdaki işaretleme MyStaticFiles/images/banner1.svg'ye başvurur:
<img src="~/StaticFiles/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
HTTP yanıt üst bilgilerini ayarlama
HTTP StaticFileOptions yanıt üst bilgilerini ayarlamak için bir nesne kullanılabilir. Web kökünden hizmet veren statik dosyayı yapılandırmaya ek olarak,aşağıdaki kod üst bilgi Cache-Control ayarlar:
public void Configure(IApplicationBuilder app)
{
var cachePeriod = "604800";
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
// Requires the following import:
// using Microsoft.AspNetCore.Http;
ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
}
});
}
Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.
yöntemi HeaderDictionaryExtensions.Append Microsoft.AspNetCore.Http paketinde mevcuttur.
Dosyalar Geliştirme ortamında 10 dakika (600 saniye) boyunca genel olarak önbelleğe alınabiliyor hale geldi:

Statik dosya yetkilendirmesi
Statik Dosya Ara Yazılımı yetkilendirme denetimleri sağlamaz. wwwroot altındakiler de dahil olmak üzere, bu dosya tarafından sunulan tüm dosyalara genel olarak erişilebilir. Dosyaları yetkilendirmeye göre hizmet vermek için:
Bunları wwwroot ve Statik Dosya Ara Yazılımı tarafından erişilebilen herhangi bir dizinin dışında depolar.
Bunları yetkilendirmenin uygulandığı bir eylem yöntemiyle hizmet etme. Bir nesnesi FileResult dönüş:
[Authorize] public IActionResult BannerImage() { var file = Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles", "images", "banner1.svg"); return PhysicalFile(file, "image/svg+xml"); }
Dizin taramayı etkinleştirme
Dizin tarama, web uygulama kullanıcılarının belirli bir dizin içindeki dizin listesini ve dosyaları görmelerini sağlar. Dizin tarama güvenlik nedenleriyle varsayılan olarak devre dışıdır (bkz. Önemli noktalar). içinde yöntemini kullanarak dizin UseDirectoryBrowser taramayı Startup.Configure etkinleştirin:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // For the wwwroot folder
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
}
yönteminden yöntemini kullanarak gerekli AddDirectoryBrowser hizmetleri Startup.ConfigureServices ekleyin:
public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}
Yukarıdaki kod, <server_address> /MyImages url'sini kullanarak wwwroot/images klasörünü http:// n dizin tarama özelliğine izin verir ve her bir dosya ve klasörün bağlantılarını içerir:

Bkz. Gözatma etkinleştirirken güvenlik risklerine yönelik önemli noktalar.
Aşağıdaki örnekte UseStaticFiles yer alan iki çağrıya dikkatin. İlk çağrı, wwwroot klasöründe statik dosyaların servise çağrılsını sağlar. İkinci çağrı, <server_address> /MyImages url'sini kullanarak wwwroot/images klasörünün dizine http:// sağlar:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // For the wwwroot folder
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
}
Varsayılan belgeyi hizmet etme
Varsayılan giriş sayfası ayarı, ziyaretçilere sitenizi ziyaret ederken mantıksal bir başlangıç noktası sağlar. Kullanıcının URI'yi tam olarak nitelendirmeden varsayılan bir sayfaya hizmet vermek için UseDefaultFiles yönteminden çağrısı Startup.Configure yapın:
public void Configure(IApplicationBuilder app)
{
app.UseDefaultFiles();
app.UseStaticFiles();
}
Önemli
UseDefaultFiles varsayılan dosyayı hizmet vermek UseStaticFiles için önce çağrılmalı. UseDefaultFiles , dosyaya gerçekten hizmet etmeyen bir URL yeniden yazıcıdır. Dosyayı hizmet vermek için aracılığıyla Statik UseStaticFiles Dosya Ara Yazılımı'nın etkinleştirin.
ile, UseDefaultFiles bir klasöre yapılan istekler için arama:
- default.htm
- default.html
- index.htm
- index.html
Listedeki ilk dosya, istek tam URI olmasına rağmen olarak sunulur. Tarayıcı URL 'SI, istenen URI 'yi yansıtacak şekilde devam ediyor.
Aşağıdaki kod, varsayılan dosya adını mydefault.html olarak değiştirir:
public void Configure(IApplicationBuilder app)
{
// Serve my app-specific default file, if present.
DefaultFilesOptions options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();
}
Usedosya sunucusu
UseFileServerUseStaticFiles, UseDefaultFiles ve isteğe bağlı olarak işlevselliğini birleştirir UseDirectoryBrowser .
Aşağıdaki kod, statik dosyaların ve varsayılan dosyanın kullanılmasına izin veriyor. Dizin tarama etkin değil.
app.UseFileServer();
Aşağıdaki kod, dizin taramayı etkinleştirerek Parametresiz aşırı yüklemeden sonra oluşturulur:
app.UseFileServer(enableDirectoryBrowsing: true);
Aşağıdaki dizin hiyerarşisini göz önünde bulundurun:
- wwwroot
- Self
- yansımasını
- JS
- MyStaticFiles
- yansımasını
- banner1. SVG
- default.html
- yansımasını
Aşağıdaki kod statik dosyaları, varsayılan dosyaları ve dizin taramayı mümkün bir şekilde sunar MyStaticFiles :
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // For the wwwroot folder
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
RequestPath = "/StaticFiles",
EnableDirectoryBrowsing = true
});
}
AddDirectoryBrowser``EnableDirectoryBrowsingözellik değeri şu olduğunda çağrılmalıdır true :
public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}
Dosya hiyerarşisini ve önceki kodu kullanarak, URL 'Ler aşağıdaki şekilde çözümlenir:
| URI | Yanıt |
|---|---|
| http:// <server_address> /StaticFiles/images/banner1.SVG | MyStaticFiles/Images/banner1. SVG |
| http:// <server_address> /Staticfiles | MyStaticFiles/default.html |
Mystaticfiles dizininde varsayılan adlı dosya yoksa http:// <server_address> /staticfiles , tıklatılabilir bağlantılarla dizin listesini döndürür:

Not
UseDefaultFiles ve UseDirectoryBrowser http://{SERVER ADDRESS}/StaticFiles (sonunda eğik çizgi olmadan) ile (sonunda eğik çizgiyle) bir istemci tarafı yeniden yönlendirmesi gerçekleştirin http://{SERVER ADDRESS}/StaticFiles/ . Staticfiles dizinindeki göreli URL 'ler, sondaki eğik çizgi olmadan geçersizdir.
FileExtensionContentTypeProvider
FileExtensionContentTypeProviderSınıfı, Mappings MIME içerik türlerine dosya uzantılarının eşlemesi olarak hizmet veren bir özellik içerir. Aşağıdaki örnekte, bazı dosya uzantıları bilinen MIME türlerine kaydedilir. . Rtf uzantısı değiştirilmiştir ve .mp4 kaldırılır.
public void Configure(IApplicationBuilder app)
{
// 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(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages",
ContentTypeProvider = provider
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
}
Bkz. MIME içerik türleri.
Özel bir kullanma FileExtensionContentTypeProvider veya sunucu uygulamalarında diğer yapılandırma hakkında bilgi StaticFileOptions için Blazor bkz ASP.NET Core Blazor statik dosyalar ..
Standart olmayan içerik türleri
Statik dosya ara yazılımı, neredeyse 400 bilinen dosya içerik türlerini anlamıştır. Kullanıcı bilinmeyen bir dosya türüne sahip bir dosya isterse, statik dosya ara yazılımı isteği ardışık düzendeki bir sonraki ara yazılıma geçirir. Bir ara yazılım, isteği işlediğinde, bir 404 bulunamadı yanıtı döndürülür. Dizin tarama etkinse, bir dizin listesinde dosyaya bir bağlantı görüntülenir.
Aşağıdaki kod, bilinmeyen türlere hizmet olarak bilinmeyen türler sunar ve bilinmeyen dosyayı görüntü olarak işler:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true,
DefaultContentType = "image/png"
});
}
Yukarıdaki kodla, bilinmeyen içerik türüne sahip bir dosya isteği görüntü olarak döndürülür.
Uyarı
Etkinleştirme ServeUnknownFileTypes bir güvenlik riskidir. Varsayılan olarak devre dışıdır ve kullanımı önerilmez. Fileextensioncontenttypeprovider standart olmayan uzantılara sahip dosyalara hizmet vermeye yönelik daha güvenli bir alternatif sağlar.
Birden çok konumdan dosyaları sunma
UseStaticFiles ve UseFileServer Varsayılan olarak Wwwroot' a işaret eden dosya sağlayıcısına sahiptir. UseStaticFiles UseFileServer Diğer konumlardan dosya sunmak için diğer dosya sağlayıcılarının yanı sıra ek örnekler de sağlayabilirsiniz. daha fazla bilgi için bu GitHub sorunabakın.
Dikkat edilmesi gerekenler
Uyarı
UseDirectoryBrowser ve UseStaticFiles gizli dizileri sızdırabilirsiniz. Üretimde dizin taramayı devre dışı bırakmak önemle önerilir. Veya ile hangi dizinlerin etkinleştirildiğini dikkatle gözden UseStaticFiles geçirin UseDirectoryBrowser . Tüm dizin ve alt dizinleri herkese açık şekilde erişilebilir hale gelir. Özel bir dizinde genel kullanıma sunma için uygun dosyaları, örneğin <content_root> /Wwwroot gibi depolayın. Bu dosyaları MVC görünümlerini, Razor sayfaları (yalnızca 2. x), yapılandırma dosyalarını vb. ayırın.
Ve ile sunulan içerik URL 'Leri
UseDirectoryBrowser,UseStaticFilestemel dosya sisteminin büyük küçük harf duyarlılığı ve karakter kısıtlamalarına tabidir. örneğin Windows, büyük/küçük harfe duyarsız — macos ve Linux değildir.ııs '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 Core modülünü kullanır. IIS statik dosya işleyicisi kullanılmıyor. Modül tarafından işlenmek üzere istekleri işleme şansı yoktur.
Sunucu veya Web sitesi düzeyinde IIS statik dosya işleyicisini kaldırmak için IIS Yöneticisi ' nde aşağıdaki adımları uygulayın:
- Modüller özelliğine gidin.
- Listeden StaticFileModule ' ü seçin.
- Eylemler kenar çubuğunda Kaldır ' a tıklayın.
Uyarı
ııs statik dosya işleyicisi etkinse ve ASP.NET Core modülü yanlış yapılandırılmışsa, statik dosyalar sunulur. Bu, örneğin web.config dosyası dağıtılmamışsa oluşur.
- Kod dosyalarını ( . cs ve . cshtml dahil) uygulama projesinin Web kökünündışına yerleştirin. Bu nedenle, uygulamanın istemci tarafı içeriği ile sunucu tabanlı kod arasında bir mantıksal ayrım oluşturulur. Bu, sunucu tarafı kodun sızmasını önler.