返回
Featured image of post ASP.NET文件服务器

ASP.NET文件服务器

1.选择合适的项目模板

在创建项目模板时选择ASP.NET Core Web项目,创建后项目会默认为我们创建一个基础的Web模板

项目模板中做了什么

我并非Web开发者,只是个游戏前端开发人员,第一次接触这个未免有点摸不着头脑。

创建Web应用

ASP.NET Core Web应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器。其中Main方法是应用的托管入口点,Main 方法调用 WebHost.CreateHostBuilder来创建Web主机(IHost),自动分配了 Kestrel Web 服务器。IHostBuilderBuild 方法生成 IHost 对象调用Run 方法启动IHost,此时托管应用并开始侦听 HTTP 请求。

应用启动 Startup类

IHostBuilder类的UseStartup调用启动类,按照约定命名为Startup,该类必须是公共类,用于定义请求处理管道和配置应用所需的任何服务。当应用启动时会调用 ConfigureServicesConfigure两个方法。ConfigureServices 用于注入服务, Configure用于响应HTTP请求。

ConfigureServices方法

ConfigureServices 方法负责注入服务。该方法在IHostConfigure方法之前被调用,将服务添加到服务容器使得它们可以通过依赖注入在应用程序中使用,在IHost启动之前会加载该方法中的服务。(模板中通过services.AddRazorPages();方法添加了MVC所需服务。)

典型模式是调用Add{service}方法注入服务,然后调用所有 services.Configure{Service} 方法。注入服务后,使其在应用和 Configure 方法中使用服务。在参数IServiceCollection (服务容器)上有 Add[Service] 扩展方法,用于添加自带的framework框架服务(例如添加EF,identity,mvc服务)也可以在IServiceCollection上注入自定义服务。

Configure方法

Configure方法用于指定应用响应 HTTP 请求的方式。可将中间件注册到IApplicationBuilder 实例来配置请求管道。每一个use开头的扩展方法将一个中间件添加到IApplicationBuilder请求管道中。

模板的中间件包括: ExceptionHandler异常/错误处理、HttpsRedirection重定向、StaticFiles静态文件服务器、Routing路由、Authorization许可证书等中间件。

2.搭建文件服务器

文件目录浏览

首先,我们需要将模板内的功能都清空,删除StartupConfigureServicesConfigure方法中的所有代码。

接下来我们需要向ConfigureServices方法中添加目录浏览服务,同时在Configure方法中使用目录浏览功能。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDirectoryBrowser(); //添加目录浏览器中间件服务。
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseDirectoryBrowser(); //使用目录浏览功能
        }

接下来,我们运行项目即可在网页中看到我们的文件服务器。

有同学这时候会问了,文件目录地址在哪。它其实指向的是工程目录下的wwwroot文件。(图中的TestFile文件夹是我自建的)

文件获取

这时候我们其实还只能访问目录,无法下载或查看文件。

其原因是我们只开启了浏览目录功能,未开启文件访问功能。我们需要在Configure方法中开启静态文件功能。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseDirectoryBrowser(); //使用目录浏览功能
            app.UseStaticFiles(); //使用静态文件功能
        }

现在我们重新运行项目,打开文本文件。

更多的顾虑

现在我们希望指定目录为文件服务器该如何做呢。

我们可以在开启目录与静态文件功能时配置参数。其中

  • FileProvider指向的是我们的系统桌面目录。
  • ServeUnknownFileTypes允许我们服务未知的文件类型。
  • DefaultContentType将未识别的文件类型设置为下载对象。
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            var staticfile = new StaticFileOptions
            {
                ServeUnknownFileTypes = true,//允许服务未知文件
                FileProvider = new PhysicalFileProvider(@"C:\Users\FoxOffice\Desktop"), //指定默认地址
                DefaultContentType = "application/x-msdownload" //给未识别的文件设置一个默认值。
            };

            var directoryBrowserOptions = new DirectoryBrowserOptions()
            {
                FileProvider = staticfile.FileProvider
            };

            app.UseDirectoryBrowser(directoryBrowserOptions); //使用目录浏览功能
            app.UseStaticFiles(staticfile); //使用静态文件功能
        }

现在我们重新启动项目,目录会导向我们的桌面。(桌面太乱了,打个码)

3.完善细节

如果我们默认的端口5000和5001都被占用了怎么办,接下来我们来尝试自定义端口号

修改ProgramCreateHostBuilder方法如下:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls(new string[] { "http://*:8088","http://*:8080" });
                    webBuilder.UseStartup<Startup>();
                });

在上面代码中,我们通过IWebHostBuilder.UseUrls方法指定了两个端口号,这样我们就可以通过本机Ip加端口号来访问资源文件夹了。

完整代码

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace FileServer
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls(new string[] { "http://*:8088","http://*:8080" });
                    webBuilder.UseStartup<Startup>();
                });
    }
}
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;

namespace FileServer
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDirectoryBrowser(); //添加目录浏览器中间件服务。
            services.AddLogging();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment()) app.UseDeveloperExceptionPage();

            var staticfile = new StaticFileOptions
            {
                ServeUnknownFileTypes = true,//允许服务未知文件
                FileProvider = new PhysicalFileProvider(@"C:\Users\FoxOffice\Desktop"), //指定默认地址
                DefaultContentType = "application/x-msdownload" //给未识别的文件设置一个默认值。
            };

            var directoryBrowserOptions = new DirectoryBrowserOptions()
            {
                FileProvider = staticfile.FileProvider
            };

            app.UseDirectoryBrowser(directoryBrowserOptions); //使用目录浏览功能
            app.UseStaticFiles(staticfile); //使用静态文件功能

        }
    }
}

Licensed under CC BY-NC-SA 4.0
0