添加静态文件中间件
现在让我们来实现ASP.NET Core应用程序中对静态文件(HTML、图像、CSS和Javascript等文件)的支持。
-
默认情况下,ASP.NET Core应用程序是不会提供静态文件的支持。
-
静态文件的默认目录是wwwroot,此目录必须位于项目文件夹的根目录中。
手动创建一个wwwroot文件夹,然后准备图片文件,将其复制并粘贴到wwwroot文件夹中。我们假设文件的名称是image1.png。
为了能从浏览器访问此文件,设置路径为http://{{serverName}}/image1.png,使其在本地计算机上运行,URL为http://localhost:3330/image1.png(读者的计算机上的端口号可能不同)。
当从浏览器导航到上面的URL的时候,我们仍然是通过Run()方法注册的中间件返回响应的结果。这里没有看到图片文件image1.png,因为目前我们的应用程序请求处理管道没有可以提供静态文件所需的中间件——UseStaticFiles()中间件。
修改Configure()方法中的代码,将UseStaticFiles()中间件添加到应用程序的请求处理管道中,如下所示:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加静态文件中间件
app.UseStaticFiles();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World");
});
}
在wwwroot文件夹中没有像Visual Studio提供的默认模板一样把图片、CSS和Javascript等文件进行分类,我们建议按不同的文件类型对文件夹进行区分,参考图中的结构:
为了在浏览器上能访问image1.png,我们输入地址http://localhost:3330/images/image1.png。
默认情况下,UseStaticFiles()中间件仅提供wwwroot文件夹中的静态文件。如果读者愿意,还可以在wwwroot文件夹之外提供静态文件。
支持默认文件
大多数Web程序都有一个默认文件,它是用户访问程序地址时显示的文件内容。比如,有一个名为default.html的默认文件,并且读者希望在用户访问应用程序根节点的URL时提供它,即http://localhost:3330。
此时,我们来访问这个地址,可以看到使用Run()方法注册的中间件产生的回调,但是没有看到默认文件default.html的内容,为了提供默认页面,我们必须在应用程序的请求处理管道中添加UseDefaultFiles()中间件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//添加默认文件中间件
app.UseDefaultFiles();
//添加静态文件中间件
app.UseStaticFiles();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World");
});
}
请注意,必须在UseStaticFiles之前通过注册UseDefaultFiles来提供默认文件。UseDefaultFiles是一个URL重写器,实际上并没有提供文件。它只是将URL重新定位到默认文件,然后还是有静态文件中间件来提供。地址栏中显示的URL仍然是根节点的URL,而不是重写的URL。
以下是UseDefaultFiles()中间件默认会去查找的地址信息的顺序:
- Index.htm。
- Index.html。
- default.htm。
- default.html。
新增的default.html文件需要放入wwwroot文件夹的目录中,否则无法运行。
自定义默认文件
如果要使用其他文件,比如将Error.html指定为默认文件,读者可以使用以下代码实现。
DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("Error.html");
//添加默认文件中间件
app.UseDefaultFiles(defaultFilesOptions);
//添加静态文件中间件
app.UseStaticFiles();
需要注意的是,这些静态文件均需要放入文件夹wwwroot,Error.html文件的代码请前往获取。运行项目后的效果如图所示:
UseFileServer中间件
UseFilesServer()结合了UseStaticFiles()、UseDefaultFiles()和UseDirectoryBrowser()中间件的功能。DirectoryBrowser()中间件支持目录浏览,并允许用户查看指定目录中的文件。我们可以用UseFileServer()中间件替换UseStaticFiles()和UseDefaultFiles()中间件。
我们可以将刚刚的代码修改为以下代码,运行项目后得到的结果是一致的。
//使用UseFileServer()而不是UseDefaultFiles()和UseStaticFiles()
FileServerOptions fileServerOptions = new FileServerOptions();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Clear();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Add("Error.html");
app.UseFileServer(fileServerOptions);
请注意,凡是开发.Net Core项目,我们都应该将中间件添加到应用程序的请求处理管道中进行开发。而大多数情况下,中间件都是以Use开头的扩展方法。如下所示:
UseDeveloperExceptionPage()
UseDefaultFiles()
UseStaticFiles()
UseFileServer()
如果要定义这些中间件,对应的可配置参数对象如表所示:
中间件 | 可配置参数对象 |
---|---|
UseDeveloperExceptionpage | DeveloperExceptionPageOptions |
UseDefaultFiles | DefaultFilesOptions |
UseStaticFiles | StaticFilesOptions |
UseFileServer | FileServerOptions |
总结
- ASP.NET Core默认不支持静态文件的服务。
- 默认的静态文件服务文件夹为wwwroot。
- 要使用静态文件,必须使用UseStaticFiles中间件。
- 要定义默认文件,必须使用UseDefaultFiles中间件。
- 默认支持的文件如下:
- Index.htm。
- Index.html。
- default.htm。
- default.html。
- 必须在UseStaticFiles()之前注册UseDefaultFiles()。
- UseFileServer()中间件结合了UseStaticFiles()、UseDefaultFiles()和UseDirectoryBrowser()中间件的功能。