ASP.NET Core Web API 教程Project Configuration(2)

public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }

其中,正如方法名字所示, ConfigureServices() 方法用于配置应用程序使用的服务,而服务就是为应用程序添加功能的一些可重用的代码。在 Configure() 方法中将会向应用程序的请求管道添加不同的中间件。

由于较大的应用程序可能包含许多不同的服务,因此在 ConfigureServices() 方法中可能会出现大量的代码,这样会导致代码看起来混乱臃肿、可读性差。为了提高代码可读性,我们可以将添加服务的代码分离成一个个的扩展方法。

4. 扩展方法和 CORS 配置

扩展方法本质上是一种静态方法。它与其他静态方法的不同之处在于,它接受 this 作为第一个参数, this 表示使用该扩展方法的对象的数据类型。

扩展方法必需定义在静态类中,它扩展了.NET 中类型的行为。一旦定义了扩展方法,就可以在同一类型的对象上多次链式调用它。

接下来开始写代码,首先在项目中创建一个新的文件夹: Extensions

ASP.NET Core Web API 教程Project Configuration

然后在该文件夹中创建一个类: ServiceExtensions ,并将这个类改为静态类,代码如下:

public static class ServiceExtensions { }

接下来就开始实现一个具体的功能,这样就能看到应该如何使用静态类。我们要做的第一件事就是在应用程序中配置 CORS。CORS ( Cross-Origin Resource Sharing,跨资源共享 ) 是一种向来自不同域的应用程序授予或者限制访问权限的机制。

如果我们想从不同的域向应用程序发送请求,那就必须配置 CORS。所以接下来就在 ServiceExtensions 类中添加一个扩展方法来允许将来自所有域的所有请求发送到我们的 API:

public static void ConfigureCors(this IServiceCollection services) => services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); });

我们这里暂时使用基本的 CORS 策略设置,因为目前来说允许所有来源 ( origin )、所有类型的方法、所有 header 是可以接受的。但是如果是生产环境,那我们应该尽可能的将策略设置的更严格。

当有需要的时候,我们可以使用 WithOrigins("https://example.com") 方法来限制请求只能来自某个具体源,而不是使用 AllowAnyOrigin() 方法允许来自所有源的请求。同样,可以使用 WithMethods("POST","GET") 方法来限制请求只能是特定的 HTTP 方法,而不是使用 AllowAnyMethods() 方法允许所有类型的 HTTP 方法。另外,可以使用 WithHeaders("accept","content-type") 方法来限制请求包含特定的 headers。

5. IIS 配置

ASP.NET Core 应用默认是自托管(self hosted),当然我们也可以通过配置 IIS 集成来帮助我们将应用使用 IIS 托管,可以通过添加以下扩展方法来实现:

public static void ConfigureIISIntegration(this IServiceCollection services) => services.Configure<IISOptions>(options => { });

目前我们使用默认配置就可以,所以在上述代码中没有初始化 options 的任何属性。如果想修改某些配置,可以参考 官方文档 :

ASP.NET Core Web API 教程Project Configuration

至此,我们已经编写了用于支持 CORS 和 IIS 集成的扩展方法,接下来就在 Startup 类中进行调用,注意引用命名空间 using CompanyEmployees.Extensions , ConfigureService() 代码如下:

// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //custom extension methods services.ConfigureCors(); services.ConfigureIISIntegration(); services.AddControllers(); }

对于直接在 ConfigureServices() 方法中添加一系列代码来说,使用扩展方法后可以使代码更简洁,可读性更高。另外扩展方法的命名要尽可能准确、明了。

我们已经成功的将 CORS 和 IIS 配置添加到应用程序的服务容器中,但是还没有真正用到这些服务,所以还需要在 Configure() 方法中添加一些使用服务的代码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwpzz.html