现在我们在“~/wwwroot/img/”目录下创建一个名为index.htm的默认页面,现在利用浏览器访问这个目录对应的URL(“:5000/img/”),显示就时这个页面的内容。
我们必须在注册StaticFileMiddleware和DirectoryBrowserMiddleware之前注册DefaultFilesMiddleware,否则它起不了任何作用。由于DirectoryBrowserMiddleware和DefaultFilesMiddleware这两个中间件处理的均是针对目录的请求,如果DirectoryBrowserMiddleware先被注册,那么显示的总是目录的内容。若DefaultFilesMiddleware先被注册,在默认页面不存在情况下回显示目录的内容。至于为什么要先于StaticFileMiddleware之前注册DefaultFilesMiddleware,则是因为后者是通过采用URL重写的方式实现的,也就是说这个中间件会将针对目录的请求改写成针对默认页面的请求,而最终针对默认页面的请求还得依赖StaticFileMiddleware完成。
DefaultFilesMiddleware中间件在默认情况下总是以约定的名称(default.htm、default.html、index.htm或者index.html)在当前请求的目录下定位默认页面。如果我们希望作为默认页面的文件不能按照这样的约定命名(比如readme.htm),我们需要按照如下的方式显式指定默认页面的文件名。
1: public class Program 2: { 3: public static void Main() 4: { 5: string contentRoot = Directory.GetCurrentDirectory(); 6: IFileProvider fileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "doc")); 7: 8: DefaultFilesOptions options1 = new DefaultFilesOptions(); 9: DefaultFilesOptions options2 = new DefaultFilesOptions{ 10: RequestPath = "/documents", 11: FileProvider = fileProvider 12: }; 13: options1.DefaultFileNames.Add("readme.htm"); 14: options2.DefaultFileNames.Add("readme.htm"); 15: 16: new WebHostBuilder() 17: .UseContentRoot(contentRoot) 18: .UseKestrel() 19: .Configure(app => app 20: .UseDefaultFiles(options1) 21: .UseDefaultFiles(options2) 22: .UseStaticFiles() 23: .UseStaticFiles(new StaticFileOptions{ 24: FileProvider = fileProvider, 25: RequestPath = "/documents" 26: }) 27: .UseDirectoryBrowser() 28: .UseDirectoryBrowser(new DirectoryBrowserOptions{ 29: FileProvider = fileProvider, 30: RequestPath = "/documents" 31: })) 32: .Build() 33: .Run(); 34: } 35: }
四、映射媒体类型通过上面演示的实例可以看出,浏览器能够正确的将请求的目标文件的内容正常的呈现出来。对HTTP协议具有基本了解的人都应该知道,响应的文件能够在支持的浏览器上呈现具有一个基本的前提,那就是响应消息通过Content-Type报头携带的媒体类型必须与内容一致。我们的实例演示了针对两种类型文件的请求,一种是JPG文件,另一种是PDF文件,对应的媒体类型分别是“image/jpg”和“application/pdf”,那么StaticFileMiddleware是如何正确解析出正确的媒体类型的呢?