ASP.NET Core中的静态文件介绍

 更新时间:2022年04月13日 10:33:22   作者:Ruby_Lu  
这篇文章介绍了ASP.NET Core中的静态文件,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。

静态文件通常位于网站根目录(web root) <content-root>/wwwroot文件夹下。通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseContentRoot(Directory.GetCurrentDirectory()) //设置当前目录
                .UseStartup<Startup>();

静态文件能够被保存在网站根目录下的任意文件夹内,并通过相对根的路径来访问。使用vs创建一个默认的Web应用程序时,在wwwroot目录下会生成几个文件夹:css,images,js。如果压迫访问images目录下的图片:

http://<app>/iamges/filename

https://localhost:44303/iamges/filename

要想使用静态文件服务,必须配置中间件,把静态文件中间件加入到管道。静态文件一般会默认配置,在Configure方法中调用app.UseStaticFiles()。

app.UseStaticFiles() 使得web root(默认为wwwroot)下的文件可以被访问。同时可以通过UseStaticFiles方法将其他目录下的内容也可以向外提供:

假如wwwroot外面有一个MyStaticFiles文件夹,要访问文件夹里面的资源test.png:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseStaticFiles(new StaticFileOptions() {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")), //用于定位资源的文件系统
                RequestPath = new PathString("/StaticFiles") //请求地址
            });

        }

可以通过访问

http://<app>/StaticFiles/test.png

https://localhost:44303/StaticFiles/test.png

1.静态文件授权

静态文件组件默认不提供授权检查。任何通过静态文件中间件访问的文件都是公开的。要想给文件授权,可以将文件保存在wwwroot之外,并将目录设置为可被静态文件中间件能够访问,同时通过一个controller action来访问文件,在action中授权后返回FileResult

2.目录浏览

目录浏览允许网站用户看到指定目录下的目录和文件列表。基于安全考虑,默认情况下是禁止目录访问功能。在Startup.Configure中调用UseDirectoryBrowser扩展方法可以开启网络应用目录浏览:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseStaticFiles();

            app.UseDirectoryBrowser(new DirectoryBrowserOptions() {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(),@"wwwroot\images")),
                RequestPath = new PathString("/MyImages") //如果不指定RequestPath,会将PhysicalFileProvider中的路径参数作为默认文件夹,替换掉wwwroot
}); }

然后在Startup.CongigureServices中调用AddDirectoryBrowser扩展方法。

这样就可以通过访问http://<app>/MyImages浏览wwwroot/images文件夹中的目录,但是不能访问文件:

要想访问具体文件需要调用UseStaticFiles配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseStaticFiles();
            app.UseStaticFiles(new StaticFileOptions() {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")), //用于定位资源的文件系统
                RequestPath = new PathString("/MyImages")
            });
            app.UseDirectoryBrowser(new DirectoryBrowserOptions() {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(),@"wwwroot\images")),
                RequestPath = new PathString("/MyImages")
            });

        }

3.默认文件

设置默认首页能给站点的访问者提供一个起始页,在Startup.Configure中调用UseDefaFiles扩展方法:

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

UseDefaultFiles必须在UseStaticFiles之前调用。UseDefaultFiles只是重写了URL,而不是真的提供了一个这样的文件,浏览器URL将继续显示用户输入的URL。所以必须开启静态文件中间件。而且默认文件必须放在静态文件中间件可以访问得到的地方,默认是wwwroot中。

通过UseDefaultFiles,请求文件夹的时候检索以下文件:

default.htm

default.html

index.htm

index.html

也可以使用UseDefaultFiles将默认页面改为其他页面:

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

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


            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

4.UseFileServer

UseFileServer集合了UseStaticFiles,UseDefaultFiles,UseDirectoryBrowser。

调用app.UseFileServer(); 请用了静态文件和默认文件,但不允许直接访问目录。需要调用app.UseFileServer(enableDirectoryBrowsing:true); 才能启用目录浏览功能。

如果想要访问wwwroot以外的文件,需要配置一个FileServerOptions对象

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
app.UseStaticFiles();//如果不调用,将不会启动默认功能。
            app.UseFileServer(new FileServerOptions()
            {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),
                RequestPath = new PathString("/StaticFiles"),
                EnableDirectoryBrowsing = true
            });
}

注意,如果将enableDirectoryBrowsing设置为true,需要在ConfigureServices中调用services.AddDirectoryBrowser();

如果默认文件夹下有默认页面,将显示默认页面,而不是目录列表。

5.FileExtensionContentTypeProvider

FileExtensionContentTypeProvider类包含一个将文件扩展名映射到MIME内容类型的集合。

例如:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            var provider = new FileExtensionContentTypeProvider();
            provider.Mappings[".htm3"] = "text/html";
            provider.Mappings["images"] = "iamge/png";
            provider.Mappings.Remove(".mp4");

            app.UseStaticFiles(new StaticFileOptions() {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),
                RequestPath = new PathString("/StaticFiles"),
                ContentTypeProvider = provider
            });
}

更多MIME类型可以访问:http://www.iana.org/assignments/media-types/media-types.xhtml

6.非标准的内容类型

如果用户请求了一个未知的文件类型,静态文件中间件将会返回HTTP 404响应。如果启用目录浏览,则该文件的链接将会被显示,但RUI会返回一个HTTP404错误。

使用UseStaticFiles方法可以将未知类型作为指定类型处理:

app.UseStaticFiles(new StaticFileOptions() {
                ServeUnknownFileTypes = true,
                DefaultContentType = "application/x-msdownload"
            });

对于未识别的,默认为application/x-msdownload,浏览器将会下载这些文件。

到此这篇关于ASP.NET Core静态文件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • ASP.NET MVC下Ajax.BeginForm方式无刷新提交表单实例

    ASP.NET MVC下Ajax.BeginForm方式无刷新提交表单实例

    下面小编就为大家分享一篇ASP.NET MVC下Ajax.BeginForm方式无刷新提交表单实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)

    Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)

    本文主要介绍了Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件的具体实例。文章篇尾附上源码下载,有兴趣的朋友可以看下
    2016-12-12
  • Asp.Net中索引器的用法分析

    Asp.Net中索引器的用法分析

    这篇文章主要介绍了Asp.Net中索引器的用法,以实例形式详细分析了Asp.Net中索引器的定义、属性与具体使用方法,并附带说明了相关的注意事项,在asp.net项目开发中有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法

    asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法

    这篇文章主要介绍了asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法,结合实例形式分析了asp.net中反射,泛型,静态方法给model赋值的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 关于.NET的集合总结

    关于.NET的集合总结

    集合是一些有共同特征的独立数据项组成的,通过集合,我们可以可以使用相同的调用代码来处理一个集合的所有元素,而不用单独处理每一个单独的项
    2013-04-04
  • .net decimal保留指定的小数位数(不四舍五入)

    .net decimal保留指定的小数位数(不四舍五入)

    大家都知道decimal保留指定位数小数的时候,.NET自带的方法都是四舍五入的。那么如何让decimal保留指定位数小数的时候不四舍五入呢,下面通过这篇文中的示例代码来一起看看吧。
    2016-12-12
  • .NET Core中使用HttpClient的正确姿势

    .NET Core中使用HttpClient的正确姿势

    使用HttpClient可以很方便的请求Web API,下面这篇文章主要给大家介绍了关于.NET Core中使用HttpClient的正确姿势,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习学习吧
    2018-09-09
  • vs2017软链接失效而导致无法进入安装界面的解决方法

    vs2017软链接失效而导致无法进入安装界面的解决方法

    这篇文章主要为大家详细介绍了vs2017软链接失效而导致无法进入安装界面的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • asp net core2.1如何使用jwt从原理到精通(二)

    asp net core2.1如何使用jwt从原理到精通(二)

    这篇文章主要给大家介绍了关于asp net core2.1如何使用jwt从原理到精通的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Linq中ToList()和CopyToDataTable()用法详解

    Linq中ToList()和CopyToDataTable()用法详解

    这篇文章介绍了Linq中ToList()和CopyToDataTable()的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论