按照上面这段程序指定的映射关系,对于存储在“~/doc/”目录下的这个PDF文件(“checklist.pdf”),发布在Web上的URL为“:5000/documents/checklist.pdf”。当我们在浏览器上请求这个地址时,该PDF文件的内容将会按照如下图所示的形式显示在浏览器上。
二、浏览目录内容注册的StaticFileMiddleware中间件只会处理针对某个具体静态文件的额请求,如果我们向针对某个目录的URL发送HTTP请求(比如“:5000/img/”),得到的将是一个状态为404的响应。不过我们可以通过注册另一个名为DirectoryBrowserMiddleware的中间件来显示请求目录的内容。具体来说,这个中间件会返回一个HTML页面,请求目录下的所有文件将以表格的形式包含在这个页面中。对于我们演示的这个应用来说,我们可以按照如下的方式调用UseDirectoryBrowser方法来注册这个DirectoryBrowserMiddleware中间件。
1: public class Program 2: { 3: public static void Main() 4: { 5: string contentRoot = Directory.GetCurrentDirectory(); 6: IFileProvider fileProvider = new PhysicalFileProvider( 7: Path.Combine(contentRoot, "doc")); 8: new WebHostBuilder() 9: .UseContentRoot(contentRoot) 10: .UseKestrel() 11: .Configure(app => app 12: .UseStaticFiles() 13: .UseStaticFiles(new StaticFileOptions { 14: FileProvider = fileProvider, 15: RequestPath = "/documents" 16: }) 17: .UseDirectoryBrowser() 18: .UseDirectoryBrowser(new DirectoryBrowserOptions { 19: FileProvider = fileProvider, 20: RequestPath = "/documents" 21: })) 22: .Build() 23: .Run(); 24: } 25: }
当上面这个应用启动之后,如果我们利用浏览器向针对某个目录的URL(比如“:5000/”或者“:5000/img/”),目标目录的内容(包括子目录和文件)将会以下图所示的形式显示在一个表格中。不仅仅如此,子目录和文件均会显示为链接,指向目标目录或者文件的URL。
三、显示默认页面从安全的角度来讲,利用注册的UseDirectoryBrowser中间件显示一个目录浏览页面会将整个目标目录的接口和所有文件全部暴露出来,所���这个中间件需要根据自身的安全策略谨慎使用。对于针对目录的请求,另一种更为常用的响应策略就是显示一个保存在这个目录下的默认页面。按照约定,作为默认页面的文件一般采用如下四种命名方式:default.htm、default.html、index.htm或者index.html。针对目标目录下默认页面的呈现实现在一个名为DefaultFilesMiddleware的中间件中,我们演示的这个应用可以按照如下的方式调用UseDefaultFiles方法来注册这个中间件。
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: new WebHostBuilder() 9: .UseContentRoot(contentRoot) 10: .UseKestrel() 11: .Configure(app => app 12: .UseDefaultFiles() 13: .UseDefaultFiles(new DefaultFilesOptions{ 14: RequestPath = "/documents", 15: FileProvider = fileProvider, 16: }) 17: .UseStaticFiles() 18: .UseStaticFiles(new StaticFileOptions 19: { 20: FileProvider = fileProvider, 21: RequestPath = "/documents" 22: }) 23: .UseDirectoryBrowser() 24: .UseDirectoryBrowser(new DirectoryBrowserOptions 25: { 26: FileProvider = fileProvider, 27: RequestPath = "/documents" 28: })) 29: .Build() 30: .Run(); 31: } 32: }