Note
이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 10 버전을 참조하세요.
정적 자산이라고도 하는 정적 파일은 동적으로 생성되지 않는 ASP.NET Core 앱 파일입니다. 대신 요청 시 HTML, CSS, 이미지 및 JavaScript 파일과 같은 클라이언트에 직접 제공됩니다.
Blazor 이 문서의 지침을 추가하거나 대체하는 정적 파일 지침은 ASP.NET Core Blazor 정적 파일을 참조하세요.
ASP.NET Core에서 정적 파일 처리를 사용하도록 설정하려면 .를 호출합니다 MapStaticAssets.
기본적으로 정적 파일은 프로젝트의 웹 루트 디렉터리 내에 저장됩니다. 기본 디렉터리입니다 {CONTENT ROOT}/wwwroot. 여기서 {CONTENT ROOT} 자리 표시자는 앱의 콘텐츠 루트입니다. wwwroot 폴더의 파일만 주소를 지정할 수 있으므로 나머지 코드에 대해 걱정할 필요가 없습니다.
지원되는 미디어 형식에 매핑된 특정 파일 확장자를 가진 파일만 정적 웹 자산으로 처리됩니다.
정적 웹 자산은 빌드 시 발견되고 콘텐츠 기반 지문을 사용하여 최적화되어 이전 파일의 재사용을 방지합니다. 자산 배달 시간을 줄이기 위해 자산도 압축 됩니다.
런타임에 검색된 정적 웹 자산은 캐싱 헤더 및 콘텐츠 형식 헤더와 같은 HTTP 헤더가 적용된 엔드포인트로 노출됩니다. 자산은 파일이 변경되거나 브라우저가 캐시를 지울 때까지 한 번 제공됩니다.
ETag, Last-Modified및 Content-Type 헤더가 설정됩니다. 브라우저는 앱이 업데이트된 후 부실 자산을 사용할 수 없습니다.
정적 자산 배달은 엔드포인트 라우팅을 기반으로 하므로 권한 부여와 같은 다른 엔드포인트 인식 기능과 함께 작동합니다. 페이지 및 MVC를 비롯한 BlazorRazor 모든 UI 프레임워크에서 작동하도록 설계되었습니다.
맵 정적 자산은 다음과 같은 이점을 제공합니다.
- JavaScript(JS) 및 스타일시트를 포함하여 앱의 모든 자산에 대한 빌드 시간 압축이지만 이미 압축된 이미지 및 글꼴 자산은 제외됩니다.
Gzip(
Content-Encoding: gz) 압축은 개발 중에 사용됩니다. Gzip 및 Brotli (Content-Encoding: br) 압축은 모두 게시 중에 사용됩니다. - 빌드 시 각 파일 콘텐츠의 SHA-256 해시를 Base64로 인코딩된 문자열로 변환하여 모든 자산에 대한 지문을 생성합니다. 이렇게 하면 이전 파일이 캐시된 경우에도 이전 버전의 파일을 다시 사용할 수 없습니다. 지문 자산은
immutable지시문사용하여 캐시되므로 브라우저에서 변경될 때까지 자산을 다시 요청하지 않습니다.immutable지시문을 지원하지 않는 브라우저의 경우max-age지시문 추가됩니다.- 자산이 지문이 아닌 경우에도 파일의 지문 해시를
ETags값으로 사용하여 각 정적 자산에 대해 콘텐츠 기반ETag생성됩니다. 이렇게 하면 콘텐츠가 변경되거나 파일이 처음으로 다운로드되는 경우에만 브라우저에서 파일을 다운로드할 수 있습니다. - 내부적으로 프레임워크는 물리적 자산을 지문에 매핑하므로 앱에서 다음을 수행할 수 있습니다.
- 자산이 지문이 아닌 경우에도 파일의 지문 해시를
맵 정적 자산은 축소 또는 기타 파일 변환을 위한 기능을 제공하지 않습니다. 축소는 일반적으로 사용자 지정 코드 또는 타사 도구의해 처리됩니다.
ASP.NET Core에서 정적 파일 처리를 사용하도록 설정하려면 .를 호출합니다 UseStaticFiles.
기본적으로 정적 파일은 프로젝트의 웹 루트 디렉터리 내에 저장됩니다. 기본 디렉터리입니다 {CONTENT ROOT}/wwwroot. 여기서 {CONTENT ROOT} 자리 표시자는 앱의 콘텐츠 루트입니다. wwwroot 폴더의 파일만 주소를 지정할 수 있으므로 나머지 코드에 대해 걱정할 필요가 없습니다.
런타임 시 정적 웹 자산은 자산 수정 및 콘텐츠 형식 헤더가 적용된 요청 시 정적 파일 미들웨어에서 반환됩니다.
ETag, Last-Modified및 Content-Type 헤더가 설정됩니다.
정적 파일 미들웨어는 정적 파일 서비스를 가능하게 하며, 이는 앱의 요청 처리 파이프라인에서 UseStaticFiles가 호출될 때 앱에서 사용됩니다. 파일은 지정된 경로 IWebHostEnvironment.WebRootPath 또는 WebRootFileProvider웹 루트 폴더(일반적으로 wwwroot기본값)에서 제공됩니다.
참조된 프로젝트 및 패키지에서 정적 웹 자산을 제공할 수도 있습니다.
웹 루트 디렉터리 변경
웹 루트를 UseWebRoot 변경하려면 이 메서드를 사용합니다. 자세한 내용은 ASP.NET Core 기본 사항 개요를 참조하세요.
프로젝트 파일에서 wwwroot<Content> 프로젝트 항목을 사용하여 파일 게시를 방지하세요. 다음 예제에서는 wwwroot/local 및 해당 하위 디렉터리에 콘텐츠가 게시되지 않도록 막습니다.
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
CreateBuilder 메서드는 콘텐츠 루트를 현재 디렉터리로 설정합니다.
var builder = WebApplication.CreateBuilder(args);
CreateDefaultBuilder 메서드는 콘텐츠 루트를 현재 디렉터리로 설정합니다.
Host.CreateDefaultBuilder(args)
UseHttpsRedirection 호출 후 요청 처리 파이프라인에서 MapStaticAssets를 호출하여 앱의 웹 루트에서 정적 파일을 제공할 수 있도록 합니다.
app.MapStaticAssets();
UseHttpsRedirection 호출 후 요청 처리 파이프라인에서 UseStaticFiles를 호출하여 앱의 웹 루트에서 정적 파일을 제공할 수 있도록 합니다.
app.UseStaticFiles();
정적 파일은 웹 루트에 상대적인 경로를 통해 액세스할 수 있습니다.
다음 위치에서 이미지에 wwwroot/images/favicon.png액세스하려면
- URL 형식:
https://{HOST}/images/{FILE NAME}-
{HOST}자리 표시자가 호스트입니다. -
{FILE NAME}자리 표시자는 파일 이름입니다.
-
- 예제
- 절대 URL:
https://localhost:5001/images/favicon.png - 루트 상대 URL:
images/favicon.png
- 절대 URL:
Blazor 앱에서 images/favicon.png이 favicon.png 폴더의 아이콘 이미지(wwwroot/images)를 로드합니다.
<link rel="icon" type="image/png" href="images/favicon.png" />
Pages 및 MVC 앱에서 Razor 타일드 문자 ~ 는 웹 루트를 가리킵니다. 다음 예제 ~/images/favicon.png 에서는 앱의 favicon.png 폴더에서 아이콘 이미지(wwwroot/images)를 로드합니다.
<link rel="icon" type="image/png" href="~/images/favicon.png" />
미들웨어 파이프라인 중단
정적 리소스가 일치한 후 전체 미들웨어 파이프라인이 실행되지 않도록 하려면 UseStaticFiles에서 ShortCircuit을 호출합니다. 호출 ShortCircuit 은 즉시 엔드포인트를 실행하고 응답을 반환하여 다른 미들웨어가 정적 자산 요청에 대해 실행되지 않도록 합니다.
app.MapStaticAssets().ShortCircuit();
개발 중에 정적 파일 캐싱 제어
개발 환경에서 실행하는 경우(예: Visual Studio 핫 다시 로드 개발 테스트 중) 프레임워크는 캐시 헤더를 재정의하여 브라우저가 정적 파일을 캐싱하지 못하도록 합니다. 이렇게 하면 파일이 변경되면 최신 버전의 파일이 사용되어 부실 콘텐츠 문제를 방지할 수 있습니다. 프로덕션 환경에서 올바른 캐시 헤더가 설정되므로 브라우저에서 정적 자산을 예상대로 캐시할 수 있습니다.
이 동작을 사용하지 않도록 설정하려면 개발 환경의 앱 설정 파일(EnableStaticAssetsDevelopmentCaching)로 설정합니다.trueappsettings.Development.json
비Development 환경의 정적 파일
앱을 로컬로 실행하는 경우 정적 웹 자산은 개발 환경에서만 사용하도록 설정됩니다. 로컬 개발 및 테스트 중 개발 이외의 환경에 정적 파일을 사용하도록 설정하려면(예: 스테이징 환경에서) UseStaticWebAssets에 대해 WebApplicationBuilder를 호출하십시오.
Warning
UseStaticWebAssets 디스크의 별도 위치에서 파일을 제공하므로 프로덕션 환경에서 기능을 활성화하지 않도록 정확한 환경을 호출 합니다. 이 섹션의 예제에서는 `IsStaging`를 사용하여 스테이징 환경을 확인합니다.
if (builder.Environment.IsStaging())
{
builder.WebHost.UseStaticWebAssets();
}
를 통해 웹 루트 디렉터리 외부의 파일 제공 IWebHostEnvironment.WebRootPath
이외의 IWebHostEnvironment.WebRootPath폴더로 설정된 경우 wwwroot 다음과 같은 기본 동작이 표시됩니다.
- 개발 환경에서는 동일한 이름의 자산이
wwwroot와wwwroot에 할당된 다른 폴더에 모두 있을 경우, WebRootPath에서 정적 자산이 제공됩니다. - 개발 환경이 아닌 경우, 정적 자산의 복사본은 WebRootPath 폴더에서 제공됩니다.
빈 웹 템플릿에서 만든 웹앱을 고려합니다.
-
Index.html및wwwroot의wwwroot-custom파일 포함 -
Program파일은WebRootPath = "wwwroot-custom"을 설정하도록 업데이트됩니다.
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
WebRootPath = "wwwroot-custom"
});
기본적으로 /에 대한 요청의 경우:
- 개발 환경에서
wwwroot/Index.html반환됩니다. - 개발 환경 이외의 모든 환경에서는
wwwroot-custom/Index.html이 반환됩니다.
자산이 wwwroot-custom에서 항상 반환되도록 보장하려면 다음 방법 하나를 사용합니다.
에서
wwwroot중복 명명된 자산을 삭제합니다.ASPNETCORE_ENVIRONMENT에서Properties/launchSettings.json를Development이외의 값으로 설정합니다.앱의 프로젝트 파일에서
<StaticWebAssetsEnabled>을(를)false으로 설정하여 정적 웹 자산을 비활성화합니다. 경고: 정적 웹 자산을 사용하지 않도록 설정하면 클래스 라이브러리가Razor 비활성화됩니다.프로젝트 파일에 다음 XML을 추가합니다.
<ItemGroup> <Content Remove="wwwroot\**" /> </ItemGroup>
다음 코드는 WebRootPath을 비개발 값(Staging)으로 업데이트하여 wwwroot-custom에서 중복 콘텐츠가 보장되게 반환되도록 하며, wwwroot에서는 반환되지 않습니다.
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
EnvironmentName = Environments.Staging,
WebRootPath = "wwwroot-custom"
});
정적 파일 미들웨어
정적 파일 미들웨어를 사용하면 일반적으로 맵 정적 자산 엔드포인트 라우팅 규칙(MapStaticAssets)외에도 특정 정적 파일 시나리오에서 정적 파일을 제공할 수 있습니다.
정적 파일 미들웨어는 일반적으로 맵 정적 자산 엔드포인트 규칙(UseStaticFiles)이 추가된 후 앱의 요청 처리 파이프라인에서 호출되는 경우 MapStaticAssets 요청 처리에 포함됩니다.
지도 정적 자산 엔드포인트 규칙은 .NET 9 이상을 대상으로 하는 앱에서 사용됩니다. 정적 파일 미들웨어는 .NET 9 이전 버전의 .NET을 대상으로 하는 앱에서 사용해야 합니다.
정적 파일 미들웨어는 정적 파일을 제공하지만 맵 정적 자산 엔드포인트 규칙과 동일한 수준의 최적화를 제공하지는 않습니다. 맵 정적 자산 엔드포인트 규칙의 빌드 시간 압축 및 지문 기능은 정적 파일 미들웨어만 사용하는 경우에만 사용할 수 없습니다.
엔드포인트 규칙은 앱이 런타임 시 지식이 있는 자산을 제공하는 데 최적화되어 있습니다. 앱이 디스크 또는 포함된 리소스와 같은 다른 위치에서 자산을 제공하는 경우 정적 파일 미들웨어를 사용해야 합니다.
이 문서에서 다루는 다음 기능은 정적 파일 미들웨어에서 지원되지만 맵 정적 자산 엔드포인트 규칙에서는 지원되지 않습니다.
를 통해 웹 루트 디렉터리 외부의 파일 제공 UseStaticFiles
앱의 웹 루트 외부에 있는 정적 파일이 있는 다음 디렉터리 계층 구조는 다음과 같습니다 ExtraStaticFiles.
wwwrootcssimagesjs
ExtraStaticFilesimagesred-rose.jpg
새로운 정적 파일 미들웨어 인스턴스를 구성하여 요청이 red-rose.jpg에 액세스할 수 있습니다.
다음 API에 대한 네임스페이스:
using Microsoft.Extensions.FileProviders;
기존의 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하) 호출 이후의 요청 처리 파이프라인에서:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files"
});
앞의 코드 ExtraStaticFiles 에서 디렉터리 계층 구조는 URL 세그먼트를 static-files 통해 공개적으로 노출됩니다.
https://{HOST}/StaticFiles/images/red-rose.jpg에서, {HOST} 자리 표시자가 호스트일 때 요청이 red-rose.jpg 파일을 제공합니다.
다음 마크업 참조: ExtraStaticFiles/images/red-rose.jpg
<img src="static-files/images/red-rose.jpg" alt="A red rose" />
앞의 예제에서는 타일드 슬래시 표기법이 Razor 페이지 및 MVC 보기(src="~/StaticFiles/images/red-rose.jpg")에서 지원되며, Razor 앱의 Blazor 구성 요소에서는 지원되지 않습니다.
여러 위치에서 파일 제공
이 섹션의 지침은 Pages 및 MVC 앱에 Razor 적용됩니다. Blazor Web App에 적용되는 지침에 대한 내용을 보려면 ASP.NET Core Blazor 정적 파일을 참조하세요.
회사 로고를 표시하는 다음 태그를 고려합니다.
<img src="~/logo.png" asp-append-version="true" alt="Company logo">
개발자는 이미지 태그 도우미 를 사용하여 버전을 추가하고 사용자 지정 위치인 폴더 ExtraStaticFiles에서 파일을 제공하려고 합니다.
다음 예제에서는 MapStaticAssets가 wwwroot에서 파일을 제공하고, UseStaticFiles가 ExtraStaticFiles에서 파일을 제공하도록 호출합니다.
기존의 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하) 호출 이후의 요청 처리 파이프라인에서:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"))
});
다음 예제에서는 UseStaticFiles을 두 번 호출하여 wwwroot 및 ExtraStaticFiles에서 파일을 제공합니다.
기존 호출 UseStaticFiles 후의 요청 처리 파이프라인에서:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"))
});
이전 코드를 사용하여 ExtraStaticFiles/logo.png 파일이 표시됩니다. 그러나 이미지 태그 도우미(AppendVersion)는 WebRootFileProvider 폴더를 포함하도록 업데이트되지 않아서 적용되지 않았습니다. 이미지 태그 도우미는 WebRootFileProvider에 따라 작동합니다.
다음 코드는 WebRootFileProvider를 사용하여 ExtraStaticFiles에 CompositeFileProvider 폴더를 포함하도록 업데이트합니다. 이렇게 하면 이미지 태그 도우미가 폴더의 이미지에 버전을 적용할 수 있습니다 ExtraStaticFiles .
다음 API의 네임스페이스:
using Microsoft.Extensions.FileProviders;
기존 호출 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하) 이전의 요청 처리 파이프라인에서:
var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"));
var compositeProvider = new CompositeFileProvider(webRootProvider, newPathProvider);
app.Environment.WebRootFileProvider = compositeProvider;
UseStaticFiles 및 UseFileServer는 기본적으로 wwwroot를 가리키는 파일 공급자로 설정됩니다. 다른 위치에서 파일을 제공하기 위해 다른 파일 공급자와 UseStaticFiles 및 UseFileServer의 추가 인스턴스를 제공할 수 있습니다. 자세한 내용은 wwwroot(dotnet/AspNetCore.Docs #15578)용 UseFileServer에 여전히 필요한 UseStaticFiles를 참조하세요.
HTTP 응답 헤더 설정
HTTP 응답 헤더를 설정하는 데 사용합니다 StaticFileOptions . 정적 파일을 제공하도록 정적 파일 미들웨어를 구성하는 것 외에도 다음 코드는 헤더를 604,800초(1주일)로 설정합니다Cache-Control.
다음 API에 대한 네임스페이스:
using Microsoft.AspNetCore.Http;
기존의 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하) 호출 이후의 요청 처리 파이프라인에서:
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append(
"Cache-Control", "public, max-age=604800");
}
});
대규모 자산 컬렉션
약 1,000개 이상의 자산으로 간주되는 대규모 자산 컬렉션을 처리할 때는 번들러를 사용하여 앱에서 제공하는 최종 자산 수를 줄이거나 결합 MapStaticAssetsUseStaticFiles하는 것이 좋습니다.
MapStaticAssets 압축, 캐싱 및 지문을 지원하기 위해 리소스에 대한 빌드 프로세스 중에 캡처된 미리 계산된 메타데이터를 즉시 로드합니다. 이러한 기능은 앱의 메모리 사용량이 늘어나게 됩니다. 자주 액세스하는 자산의 경우, 대개 그 비용에는 가치가 있습니다. 자주 액세스하지 않는 자산의 경우, 비용 대비 효과가 충분하지 않을 수 있습니다.
묶음을 사용하지 않는 경우 MapStaticAssets를 UseStaticFiles와 결합하는 것을 권장합니다. 다음 예제에서는 이 방법을 보여 줍니다.
프로젝트 파일(.csproj) StaticWebAssetEndpointExclusionPattern 에서 MSBuild 속성은 최종 매니페스트 MapStaticAssets에서 엔드포인트를 필터링하는 데 사용됩니다. 제외된 파일은 UseStaticFiles에 의해 제공되며, 압축, 캐싱 및 지문 처리의 혜택을 받지 못합니다.
값을 설정할 때 프레임워크의 기본 제외 패턴을 유지하려면 StaticWebAssetEndpointExclusionPattern을 설정하고 $(StaticWebAssetEndpointExclusionPattern)을 유지합니다. 세미콜론으로 구분된 목록에 추가 패턴을 추가합니다.
다음 예제에서 제외 패튼은 폴더에 lib/icons 정적 파일을 추가합니다. 이 파일은 가상의 아이콘 배치를 나타냅니다.
<StaticWebAssetEndpointExclusionPattern>
$(StaticWebAssetEndpointExclusionPattern);lib/icons/**
</StaticWebAssetEndpointExclusionPattern>
파일에서 app.UseHttpsRedirection(); HTTPS 리디렉션 미들웨어(Program) 처리 후:
-
UseStaticFiles을(를) 호출하여 제외된 파일(
lib/icons/**) 및 MapStaticAssets로 처리되지 않는 다른 파일을 처리하십시오. - MapStaticAssets 이후에 UseStaticFiles를 호출하여 중요한 애플리케이션 파일(CSS, JS, 이미지)를 처리합니다.
app.UseStaticFiles();
app.UseAuthorization();
app.MapStaticAssets();
정적 파일 권한 부여
앱이 대체 권한 부여 정책을 채택하는 경우 권한 부여 미들웨어가 요청을 처리한 후 정적 파일에 대한 요청을 포함하여 권한 부여 정책을 명시적으로 지정하지 않는 모든 요청에 대해 권한 부여가 필요합니다. 정적 파일에 대한 엔드포인트 작성기를 적용하여 AllowAnonymousAttribute 정적 파일에 대한 익명 액세스를 허용합니다.
app.MapStaticAssets().Add(endpointBuilder =>
endpointBuilder.Metadata.Add(new AllowAnonymousAttribute()));
앱이 대체 권한 부여 정책을 채택하는 경우 권한 부여 미들웨어가 요청을 처리한 후 정적 파일에 대한 요청을 포함하여 권한 부여 정책을 명시적으로 지정하지 않는 모든 요청에 대해 권한 부여가 필요합니다. ASP.NET Core 템플릿을 사용하면 호출UseStaticFiles하기 전에 호출 UseAuthorization 하여 정적 파일에 익명으로 액세스할 수 있습니다. 대부분의 앱은 이 패턴을 따릅니다. 정적 파일 미들웨어가 권한 부여 미들웨어 전에 호출되는 경우:
- 정적 파일에서 권한 부여 검사가 수행되지 않습니다.
- 정적 파일 미들웨어에서 제공하는 정적 파일(예
wwwroot: 일반적으로 웹 루트)은 공개적으로 액세스할 수 있습니다.
권한 부여를 기반으로 정적 파일을 제공하려면 다음을 수행합니다.
- 앱이 인증된 사용자를 요구하도록 대체 권한 부여 정책을 설정하는지 확인합니다.
- 정적 파일을 앱의 웹 루트 외부에 저장합니다.
- 호출 UseAuthorization한 후 웹 루트 외부의 정적 파일 폴더에 대한 경로를 지정하여 호출 UseStaticFiles합니다.
다음 API에 대한 네임스페이스:
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.FileProviders;
서비스 등록:
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
호출 UseAuthorization 후 요청 처리 파이프라인에서 수행됩니다.
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "SecureStaticFiles")),
RequestPath = "/static-files"
});
다음 API에 대한 네임스페이스:
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.FileProviders;
Startup.ConfigureServices의 경우
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
Startup.Configure 호출 이후 UseAuthorization에서:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.ContentRootPath, "SecureStaticFiles")),
RequestPath = "/static-files"
});
이전 코드에서 대체 권한 부여 정책에는 인증된 사용자가 필요합니다. 컨트롤러 및 페이지와 Razor 같이 자체 권한 부여 요구 사항을 지정하는 엔드포인트는 대체 권한 부여 정책을 사용하지 않습니다. 예를 들어, \Razor 또는 \[AllowAnonymous]를 사용하는 페이지, 컨트롤러 또는 액션 메서드는 대체 권한 부여 정책 대신 적용된 권한 부여 특성을 사용합니다.
RequireAuthenticatedUser는 DenyAnonymousAuthorizationRequirement를 현재 인스턴스에 추가하여 현재 사용자가 인증될 것을 요구합니다.
앱의 웹 루트에 저장된 정적 자산은 기본 정적 파일 미들웨어(UseStaticFiles)가 UseAuthorization 전에 먼저 호출되기 때문에 공개적으로 이용 가능합니다.
SecureStaticFiles 폴더의 정적 자산에는 인증이 필요합니다.
권한 부여를 기반으로 파일을 제공하는 대체 방법은 다음과 같습니다.
- 웹 루트 외부에 파일을 저장하고 정적 파일 미들웨어에 액세스할 수 있는 디렉터리를 저장합니다.
- 운영 권한이 적용된 작업 메서드를 통해 파일을 서빙하고 FileResult 개체를 반환합니다.
Razor 페이지에서(Pages/BannerImage.cshtml.cs):
public class BannerImageModel : PageModel
{
private readonly IWebHostEnvironment _env;
public BannerImageModel(IWebHostEnvironment env) => _env = env;
public PhysicalFileResult OnGet()
{
var filePath = Path.Combine(
_env.ContentRootPath, "SecureStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
}
컨트롤러에서(Controllers/HomeController.cs):
[Authorize]
public IActionResult BannerImage()
{
var filePath = Path.Combine(
_env.ContentRootPath, "SecureStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
이전 방법을 사용하려면 파일당 페이지 또는 엔드포인트가 필요합니다.
다음 경로 엔드포인트 예제에서는 인증된 사용자에 대한 파일을 반환합니다.
Program 파일에서:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AuthenticatedUsers", b => b.RequireAuthenticatedUser());
});
...
app.MapGet("/files/{fileName}", IResult (string fileName) =>
{
var filePath = GetOrCreateFilePath(fileName);
if (File.Exists(filePath))
{
return TypedResults.PhysicalFile(filePath, fileName);
}
return TypedResults.NotFound("No file found with the supplied file name");
})
.WithName("GetFileByName")
.RequireAuthorization("AuthenticatedUsers");
다음 경로 엔드포인트 예제에서는 관리자 역할(""admin)에서 인증된 사용자에 대한 파일을 업로드합니다.
Program 파일에서:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminsOnly", b => b.RequireRole("admin"));
});
...
// IFormFile uses memory buffer for uploading. For handling large
// files, use streaming instead. See the *File uploads* article
// in the ASP.NET Core documentation:
// https://learn.microsoft.com/aspnet/core/mvc/models/file-uploads
app.MapPost("/files", async (IFormFile file, LinkGenerator linker,
HttpContext context) =>
{
// Don't rely on the value in 'file.FileName', as it's only metadata that can
// be manipulated by the end-user. Consider 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");
Startup.ConfigureServices의 경우
services.AddAuthorization(options =>
{
options.AddPolicy("AuthenticatedUsers", b => b.RequireAuthenticatedUser());
});
Startup.Configure의 경우
app.MapGet("/files/{fileName}", IResult (string fileName) =>
{
var filePath = GetOrCreateFilePath(fileName);
if (File.Exists(filePath))
{
return TypedResults.PhysicalFile(filePath, fileName);
}
return TypedResults.NotFound("No file found with the supplied file name");
})
.WithName("GetFileByName")
.RequireAuthorization("AuthenticatedUsers");
다음 코드는 관리자 역할(""admin)에서 인증된 사용자에 대한 파일을 업로드합니다.
Startup.ConfigureServices의 경우
services.AddAuthorization(options =>
{
options.AddPolicy("AdminsOnly", b => b.RequireRole("admin"));
});
Startup.Configure의 경우
// IFormFile uses memory buffer for uploading. For handling large
// files, use streaming instead. See the *File uploads* article
// in the ASP.NET Core documentation:
// https://learn.microsoft.com/aspnet/core/mvc/models/file-uploads
app.MapPost("/files", async (IFormFile file, LinkGenerator linker,
HttpContext context) =>
{
// Don't rely on the value in 'file.FileName', as it's only metadata that can
// be manipulated by the end-user. Consider 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");
디렉터리 검색
디렉터리 검색을 통해 지정된 디렉터리 내에 디렉터리를 나열할 수 있습니다.
기본적으로 디렉터리 검색은 보안상의 이유로 사용하지 않도록 설정됩니다. 자세한 내용은 정적 파일의 보안 고려 사항을 참조하세요.
다음 API를 사용하여 디렉터리 검색을 사용하도록 설정합니다.
다음 예제에서
-
images앱의 루트에 있는 폴더에는 디렉터리 검색을 위한 이미지가 있습니다. - 이미지를 찾아보기 위한 요청 경로는 .입니다
/DirectoryImages. - 호출 UseStaticFiles하고 FileProvider의 StaticFileOptions을 설정하면 개별 파일에 대한 브라우저 링크를 표시할 수 있습니다.
다음 API에 대한 네임스페이스:
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
서비스 등록:
builder.Services.AddDirectoryBrowser();
기존의 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하) 호출 이후의 요청 처리 파이프라인에서:
var fileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.WebRootPath, "images"));
var requestPath = "/DirectoryImages";
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = requestPath
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = fileProvider,
RequestPath = requestPath
});
다음 API에 대한 네임스페이스:
using Microsoft.Extensions.FileProviders;
using System.IO;
Startup.ConfigureServices의 경우
services.AddDirectoryBrowser();
Startup.Configure의 기존 호출 후에 UseStaticFiles 내에서:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/DirectoryImages"
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/DirectoryImages"
});
위의 코드를 사용하면 URL `wwwroot/images`을 통해 `https://{HOST}/DirectoryImages` 폴더의 각 파일 및 폴더에 대한 링크가 포함된 디렉터리를 검색할 수 있으며, 여기서 `{HOST}` 자리 표시자는 호스트를 나타냅니다.
AddDirectoryBrowser 를 포함하여 HtmlEncoder디렉터리 브라우징 미들웨어에 필요한 서비스를 추가합니다. 이러한 서비스는 같은 다른 호출 AddRazorPages에 의해 추가될 수 있지만 서비스를 추가하려면 호출 AddDirectoryBrowser 하는 것이 좋습니다.
기본 문서 제공
기본 페이지를 설정하면 방문자에게 사이트의 시작 지점이 제공됩니다. 요청 URL에 wwwroot 파일 이름을 포함하지 않고 기본 파일을 제공하려면 메서드를 호출합니다 UseDefaultFiles .
UseDefaultFiles는 파일을 제공하지 않는 URL 재작성기입니다. 기존 호출이 MapStaticAssets (.NET 9 이상) 또는 UseStaticFiles (.NET 8 이하)로 이루어지기 전에, 요청 처리 파이프라인에서:
app.UseDefaultFiles();
UseDefaultFiles를 사용하면 wwwroot의 폴더에 대한 요청이 다음을 검색합니다.
default.htmdefault.htmlindex.htmindex.html
목록에서 찾은 첫 번째 파일이 요청에 파일 이름이 포함된 것처럼 제공됩니다. 브라우저 URL은 요청된 URI를 계속 반영합니다.
다음 코드는 기본 파일 이름을 다음과 같이 변경합니다 default-document.html.
var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("default-document.html");
app.UseDefaultFiles(options);
정적 파일, 기본 문서 및 디렉터리 검색 결합
UseFileServer는 UseStaticFiles, UseDefaultFiles 및 선택적으로 UseDirectoryBrowser의 기능을 병행합니다.
기존에 .NET 버전 9 이상에서는 MapStaticAssets을, 버전 8 이하에서는 UseStaticFiles을 호출한 후, 정적 파일 및 기본 파일 제공 기능을 활성화하기 위해 호출 UseFileServer를 실행합니다.
app.UseFileServer();
이전 예제에서는 디렉터리 검색을 사용할 수 없습니다.
다음 코드에서는 정적 파일, 기본 파일 및 디렉터리 검색을 제공할 수 있습니다.
서비스 등록:
builder.Services.AddDirectoryBrowser();
기존 호출 UseStaticFiles 후의 요청 처리 파이프라인에서:
app.UseFileServer(enableDirectoryBrowsing: true);
Startup.ConfigureServices의 경우
services.AddDirectoryBrowser();
Startup.Configure의 기존 호출 후에 UseStaticFiles 내에서:
app.UseFileServer(enableDirectoryBrowsing: true);
호스트 주소(/) UseFileServer 의 경우 기본 페이지() 또는 기본 MVC 보기(RazorPages/Index.cshtml)의 앞에 기본 Home/Index.cshtml HTML 문서를 반환합니다.
다음 디렉터리 계층 구조를 고려해보세요.
wwwrootcssimagesjs
ExtraStaticFilesimageslogo.png
default.html
다음 코드는 정적 파일의 제공, 기본 파일 및 디렉터리 검색을 ExtraStaticFiles사용하도록 설정합니다.
다음 API에 대한 네임스페이스:
using Microsoft.Extensions.FileProviders;
서비스 등록:
builder.Services.AddDirectoryBrowser();
기존 호출 UseStaticFiles 후의 요청 처리 파이프라인에서:
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files",
EnableDirectoryBrowsing = true
});
다음 API에 대한 네임스페이스:
using Microsoft.Extensions.FileProviders;
using System.IO;
Startup.ConfigureServices의 경우
services.AddDirectoryBrowser();
Startup.Configure의 기존 호출 후에 UseStaticFiles 내에서:
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files",
EnableDirectoryBrowsing = true
});
AddDirectoryBrowser는 EnableDirectoryBrowsing 속성 값이 true인 경우 호출해야 합니다.
위의 파일 계층 구조와 코드를 사용하여 URL은 다음 표와 같이 확인됩니다( {HOST} 자리 표시자는 호스트).
| URI | 응답 파일 |
|---|---|
https://{HOST}/static-files/images/logo.png |
ExtraStaticFiles/images/logo.png |
https://{HOST}/static-files |
ExtraStaticFiles/default.html |
디렉터리에 ExtraStaticFiles 기본 명명된 파일이 https://{HOST}/static-files 없으면 클릭 가능한 링크가 있는 디렉터리 목록을 반환합니다. 여기서 {HOST} 자리 표시자는 호스트입니다.
UseDefaultFiles 및 UseDirectoryBrowser는 후행 /가 없는 대상 URI에서 후행 /가 있는 대상 URI로 클라이언트 쪽 리디렉션을 수행합니다. 예를 들어, https://{HOST}/static-files (후행 / 없음)에서 https://{HOST}/static-files/ (후행 / 포함)으로 이동합니다. 디렉터리 내의 상대 URL은 후행 슬래시(ExtraStaticFiles)가 없으면 /에서 RedirectToAppendTrailingSlash 옵션을 사용하지 않는 한 유효하지 않습니다.
파일 확장자를 MIME 형식에 매핑
Note
앱에 Blazor 적용되는 지침은 ASP.NET Core Blazor 정적 파일을 참조하세요.
MIME 콘텐츠 형식 매핑에 파일 확장자를 추가하거나 수정하는 데 사용합니다 FileExtensionContentTypeProvider.Mappings . 다음 예제에서는 여러 파일 확장자를 알려진 MIME 형식에 매핑합니다. 확장이 .rtf 대체되고 .mp4 제거됩니다.
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
...
// 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
});
구성할 정적 파일 옵션이 여러 개 있는 경우 다음을 사용하여 StaticFileOptions공급자를 설정할 수도 있습니다.
var provider = new FileExtensionContentTypeProvider();
...
builder.Services.Configure<StaticFileOptions>(options =>
{
options.ContentTypeProvider = provider;
});
app.UseStaticFiles();
Startup.Configure의 경우
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 = "/images",
ContentTypeProvider = provider
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/images"
});
자세한 내용은 MIME 콘텐츠 형식을 참조하세요.
비표준 콘텐츠 형식
정적 파일 미들웨어는 거의 400가지의 알려진 파일 콘텐츠 형식을 이해합니다. 사용자가 알 수 없는 파일 형식의 파일을 요청하는 경우 정적 파일 미들웨어가 해당 요청을 파이프라인의 다음 미들웨어로 전달합니다. 요청을 처리한 미들웨어가 없으면 ‘404 찾을 수 없음’ 응답이 반환됩니다. 디렉터리 찾아보기가 사용 가능한 경우 파일에 대한 링크가 디렉터리 목록에 표시됩니다.
다음 코드는 알 수 없는 콘텐츠 형식을 제공하고 알 수 없는 파일을 이미지로 렌더링합니다.
app.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true,
DefaultContentType = "image/png"
});
위의 코드를 사용하면 알 수 없는 콘텐츠 형식의 파일에 대한 요청은 이미지로 반환됩니다.
Warning
ServeUnknownFileTypes를 사용하도록 설정하는 것은 보안상 위험합니다. 기본적으로 비활성화되어 있으며 사용은 권장되지 않습니다. 파일 확장자를 MIME 형식에 매핑하는 것은 비표준 확장명을 사용하는 것보다 더 안전한 대안입니다.
사용자 지정 정적 파일 매니페스트 제공
staticAssetsManifestPath가 null인 경우, IHostEnvironment.ApplicationName는 매니페스트를 찾는 데 사용됩니다. 또는 매니페스트 파일의 전체 경로를 지정합니다. 만약 상대 경로를 사용할 경우, 프레임워크는 AppContext.BaseDirectory에서 파일을 검색합니다.
정적 파일의 보안 고려 사항
Warning
UseDirectoryBrowser 및 UseStaticFiles는 비밀 정보를 누출 할 수 있습니다. 프로덕션 환경에서는 디렉터리 검색을 비활성화하는 것이 좋습니다.
UseStaticFiles 또는 UseDirectoryBrowser를 통해 어떤 디렉터리가 활성화되었는지 주의 깊게 검토하세요. 전체 디렉터리와 해당 하위 디렉터리는 공개적으로 액세스할 수 있습니다.
<content_root>/wwwroot와 같은 전용 디렉터리에 공개적으로 제공하는 데 적합한 파일을 저장합니다. MVC 뷰, Razor Pages, 구성 파일 등과 해당 파일을 분리합니다.
UseDirectoryBrowser 및 UseStaticFiles로 노출된 콘텐츠에 대한 URL은 대/소문자 구분 및 기본 파일 시스템의 문자 제한이 적용됩니다. 예를 들어 Windows는 대/소문자를 구분하지 않지만 macOS 및 Linux는 대/소문자를 구분합니다.
IIS에서 호스팅되는 ASP.NET Core 앱은 ASP.NET Core 모듈을 사용하여 정적 파일 요청을 비롯한 모든 요청을 앱에 전달합니다. IIS 정적 파일 처리기는 사용되지 않으며 요청을 처리할 수 없습니다.
서버 또는 웹 사이트 수준에서 IIS 정적 파일 처리기를 제거하려면 IIS 관리자에서 다음 단계를 완료합니다.
- 모듈 기능으로 이동합니다.
- 목록에서 StaticFileModule을 선택합니다.
- 동작 사이드바에서 제거를 클릭합니다.
Warning
IIS 정적 파일 처리기를 사용하도록 설정되었으며 그리고 ASP.NET Core 모듈이 올바르게 구성되지 않은 경우, 정적 파일이 제공됩니다. 예를 들어, web.config 파일이 배포되지 않으면 이러한 문제가 발생합니다.
- 코드 파일을
.cs및.cshtml를 포함하여 앱 프로젝트의 웹 루트 외부에 배치합니다. 따라서 논리적 분리가 앱의 클라이언트 쪽 콘텐츠 및 서버 기반 코드 사이에 만들어집니다. 그러면 서버 쪽 코드가 유출되지 않습니다.
MSBuild 속성
다음 표에서는 정적 파일 MSBuild 속성 및 메타데이터 설명을 보여 줍니다.
| 재산 | Description |
|---|---|
EnableDefaultCompressedItems |
기본 압축 포함/제외 패턴을 사용하도록 설정합니다. |
CompressionIncludePatterns |
압축을 위해 포함할 파일 패턴의 세미콜론으로 구분된 목록입니다. |
CompressionExcludePatterns |
압축에서 제외할 파일 패턴의 세미콜론으로 구분된 목록입니다. |
EnableDefaultCompressionFormats |
기본 압축 형식(Gzip 및 Brotli)을 사용하도록 설정합니다. |
BuildCompressionFormats |
빌드하는 동안 사용할 압축 형식입니다. |
PublishCompressionFormats |
게시하는 동안 사용할 압축 형식입니다. |
DisableBuildCompression |
빌드하는 동안 압축을 사용하지 않도록 설정합니다. |
CompressDiscoveredAssetsDuringBuild |
빌드하는 동안 검색된 자산을 압축합니다. |
BrotliCompressionLevel |
Brotli 알고리즘의 압축 수준입니다. |
StaticWebAssetBuildCompressAllAssets |
빌드 중에 검색되거나 계산된 자산뿐만 아니라 빌드 중에 모든 자산을 압축합니다. |
StaticWebAssetPublishCompressAllAssets |
빌드 중에 검색되거나 계산된 자산뿐만 아니라 게시 중에 모든 자산을 압축합니다. |
| 재산 | Description |
|---|---|
StaticWebAssetBasePath |
라이브러리의 모든 자산에 대한 기본 URL 경로입니다. |
StaticWebAssetsFingerprintContent |
캐시 파열에 콘텐츠 지문을 사용하도록 설정합니다. |
StaticWebAssetFingerprintingEnabled |
정적 웹 자산에 지문 기능을 사용하도록 설정합니다. |
StaticWebAssetsCacheDefineStaticWebAssetsEnabled |
정적 웹 자산 정의에 대한 캐싱을 사용하도록 설정합니다. |
StaticWebAssetEndpointExclusionPattern |
엔드포인트를 제외하는 패턴입니다. |
| 항목 그룹 | Description | 메타데이터 |
|---|---|---|
StaticWebAssetContentTypeMapping |
파일 패턴을 콘텐츠 형식에 매핑하고 엔드포인트에 대한 헤더를 캐시합니다. |
Pattern, Cache |
StaticWebAssetFingerprintPattern |
캐시 파열을 위해 정적 웹 자산에 지문을 적용하는 패턴을 정의합니다. |
Pattern, Expression |
메타데이터 설명:
Pattern: 파일을 일치시킬 때 사용되는 glob 패턴입니다. 의 경우StaticWebAssetContentTypeMapping파일과 일치하여 콘텐츠 형식(예:*.jsJavaScript 파일)을 결정합니다. 의 경우StaticWebAssetFingerprintPattern특별한 지문 처리가 필요한 다중 확장 파일을 식별합니다(예:*.lib.module.js).Cache: 일치하는 콘텐츠 형식의 헤더 값을 지정Cache-Control합니다. 이렇게 하면 브라우저 캐싱 동작(예:max-age=3600, must-revalidate미디어 파일)이 제어됩니다.Expression: 지문이 파일 이름에 삽입되는 방법을 정의합니다. 기본값은#[.{FINGERPRINT}]확장 앞에 지문({FINGERPRINT}자리 표시자)을 삽입하는 것입니다.
다음 예제에서는 비트맵 파일 패턴(.bmp)을 image/bmp 지문이 없는 엔드포인트에 사용할 헤더를 {CACHE HEADER} 나타내는 자리 표시자를 사용하여 콘텐츠 형식 Cache-Control 에 매핑합니다.
<ItemGroup>
<StaticWebAssetContentTypeMapping Include="image/bmp" Cache="{CACHE HEADER}" Pattern="*.bmp" />
</ItemGroup>
런타임 구성 옵션
다음 표에서는 런타임 구성 옵션에 대해 설명합니다.
| 구성 키 | Description |
|---|---|
ReloadStaticAssetsAtRuntime |
정적 콘텐츠의 개발 시간 핫 로딩을 활성화합니다. 빌드 시간 매니페스트 버전 대신 수정된 웹 루트(wwwroot) 파일을 전달합니다. ETag을(를) 다시 계산하고 필요한 경우 다시 압축합니다. 명시적으로 설정하지 않는 한 빌드 매니페스트를 제공하는 경우에만 기본적으로 사용하도록 설정됩니다. |
DisableStaticAssetNotFoundRuntimeFallback |
true 빌드 매니페스트에 없는 새로 추가된 파일을 제공하는 대체 엔드포인트를 억제합니다.
false가 없을 때, 파일 존재 여부를 확인하는 {**path} 대체(GET/HEAD)가 경고를 기록하고, 계산된 ETag와 함께 파일을 제공합니다. |
EnableStaticAssetsDevelopmentCaching |
이 경우 true자산 설명자에 원래 Cache-Control 헤더를 유지합니다.
false가 있을 때 또는 없을 경우, 개발 중에 공격적인 클라이언트 캐싱을 방지하기 위해 Cache-Control 헤더를 no-cache로 다시 작성합니다. |
EnableStaticAssetsDevelopmentIntegrity |
true이(가) 있을 경우, 자산 설명자에 무결성 속성을 유지합니다. 또는 없는 경우 false 개발 중에 파일이 변경되는 경우 불일치를 방지하기 위해 무결성 속성을 제거합니다. |
추가 리소스
ASP.NET Core