ASP.NET Core Web API 教程Project Configuration

目录
  • 1. 创建新项目
  • 2. launchSettings.json 文件
  • 3. Program.cs 和 Startup.cs
  • 4. 扩展方法和 CORS 配置
  • 5. IIS 配置
  • 6. Startup 类中的其它代码
  • 7. 基于环境的设置

前言:

本系列文章主要参考了《Ultimate ASP.NET Core 3 Web API》一书,对原文进行了翻译,同时适当删减、修改了一部分内容。

对于某些概念和原理,原书和本文中都没有进行详细描述,如果一一详细介绍,内容就显得臃肿且混乱,我个人是先对原书进行了通读,理解主要内容,然后再具体搜索了解其中不明白或者感兴趣的概念和知识点。

由于我的技术水平和英文水平都有限,且主要是为了方便以后自己查看回顾,所以有错误之处,还请各位批评指正。

 项目配置

本篇内容简介: Configuration 在开发过程中至关重要,我们首先需要了解如何配置我们的应用程序。在之前的 .NET Framework 项目中,我们一般是通过 web.config 文件来完成对应用程序的配置,而在 .NET Core 中,我们不再使用该文件,而是使用 .NET Core 内置的 Configuration 框架。本文将介绍 Startup 类中的配置方法以及如何通过这些方法来设置应用程序。除此之外,还将介绍如何注册服务以及如何通过扩展方法来实现注册。

1. 创建新项目

打开 Visual Studio 2019,点击 Create a new project ,然后选择 ASP.NET Core Web API :

填写项目名称并选择项目路径:

然后选择目标框架,并点击 Create :

2. launchSettings.json 文件

项目创建成功后,在解决方案的 Properties 节点下可以看到 launchSettings.json 文件:

这个文件决定了 ASP.NET Core 应用程序的启动行为,可以看到,它包含了 IIS 和自托管应用( self-hosted Kestrel 的启动设置的相关配置。

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:59126",
      "sslPort": 44389
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "CompanyEmployees": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

由于我们开发的是 Web API 项目,因此我们并不需要使用浏览器像查看 Web 项目一样来查看 API,我们之后会通过 Postman (以后会介绍)来调用并查看 API 的输出。而为了阻止应用程序启动时自动打开浏览器,需要将 launchBrowser 属性值设置为 false

"launchBrowser": false

在创建项目时,如果勾选了 Configure for HTTPS 的复选框,那么在 applicationUrl 节点中就会有两个 URL,一个用于 HTTP,另一个用于 HTTPS。

注意:此 HTTPS 配置项尽在本地环境中有效,当应用程序正式部署后,必需配置真实有效的证书。

在本地开发应用程序时,还有一个很重要的属性: launchUrl ,该属性定义了应用程序启动时默认导航到的 URL。如果要让该属性生效,就需要将 launchBrowser 属性值设置为 true 。

3. Program.cs 和 Startup.cs

ASP.NET Core 应用程序本质是一个控制台应用程序,它通过创建 web 服务器来托管应用程序并监听传入的HTTP请求,然后返回响应,所以程序的入口还是 Program 类的 Main() 方法,ASP.NET Core Web API 应用程序中的 Program 如下:

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.UseStartup<Startup>();
            });
}

关于 Host 的启动过程,可以参考:以后补充。

CreateDefaultBuilder(args) 方法设置项目的默认配置文件和变量,以及日志提供程序。在应用启动过程的早期配置好日志提供程序意味着可以使用日志记录发生在启动过程中的问题。

之后,调用 webBuilder.UseStartup<Startup>() 方法来初始化 Startup 类, Startup 类在 ASP.NET Core Web API 项目中是强制要求的类,需要在该类中配置应用程序需要的嵌入式或者自定义的服务,代码如下:

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

然后在该文件夹中创建一个类: 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 的任何属性。如果想修改某些配置,可以参考 官方文档 :

至此,我们已经编写了用于支持 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() 方法中添加一些使用服务的代码:

// 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();

    //custom pipeline start
    app.UseStaticFiles();

    app.UseCors("CorsPolicy");

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.All
    });
    //custom pipeline end

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

其中,

  • UseForwardedHeaders() :将转发的 header 应用于当前请求上的匹配的字段。按照约定, HTTP 代理以众所周知的 HTTP header 从客户端转发消息。该中间件读取这些 header 并填充 HttpContext 上的相关字段。
  • UseStaticFiles() 对当前请求的路径启用静态文件服务,意思就是可以通过路径访问当前目录的文件。如果没有设置静态文件目录的路径,则默认使用 wwwroot 目录。
  • UseCors() :将 CORS 中间件添加到应用程序的请求管道中以允许跨域请求。

6. Startup 类中的其它代码

ConfigureServices() 方法中,

AddControllers() :将控制器的服务添加到服务集合中。 AddMvc() 方法也可以将控制器添加到服务集合中,但它除了控制器外,还会将视图和页面添加到服务集合中。我们的项目是 Web API 项目,所以只需要控制器就可以。

Configure() 方法:

  • UseRouting() :将路由中间件添加到请求管道中。
  • UseAuthorization() :将授权中间件添加到请求管道中。
  • UseEndpoints() :为控制器的 Action 添加终结点并将终结点添加路由中。

7. 基于环境的设置

在开发应用程序时,我们使用 开发 (development) 环境,当我们发布了应用程序之后就需要使用 生产 (production) 环境。开发环境和生产环境对应不同的 URLs、端口、连接字符串、密码等其它敏感信息。所以我们需要根据环境来区分配置,这在 .NET Core 中是很容易实现的。

当我们创建一个项目后,可以在项目的根目录中看到 appsettings.json 文件,这就我们主要的配置文件,点击文件前面的箭头可以看到一个 appsettings.Development.json 文件。如果在系统的文件资源管理器中打开项目目录,可以看到这是两个不同的文件,但是在 Visual Studio 中,这两个配置文件被关联在了一起。

appsettings.{EnvironmentSuffix}.json 是用于特定环境时的配置文件,可以覆盖 appsettings.json 文件中的配置。如果 appsettings.{EnvironmentSuffix}.json 文件中存在与 appsettings.json 文件同名的键值对,则会覆盖键值对的值。另外我们还可以自定义特定的环境,例如,对于生产环境,我们可以添加另一个文件: appsettings.Production.json :

appsettings.Production.json 文件中应该包含用于生产环境的配置项。

为了设置应用程序运行时的环境,我们需要设置 ASPNETCORE_ENVIRONMENT 环境变量。例如,如果想让应用程序运行在生产环境中,就需要在部署的机器上将上述环境变量的值修改为 Production 。在 Windows 环境中,可以通过输入命令: set ASPNETCORE_ENVIRONMENT=Production 来实现。在 Linux 环境中,可以通过输入命令: export ASPNET_CORE_ENVIRONMENT=Production 来实现。

ASP.NET Core 应用程序通过上述环境变量的值来决定使用哪个 appsettings.json 文件,例如在生产环境中,将会使用 appsettings.Production.json 文件。默认情况下 ASPNETCORE_ENVIRONMENT 变量的值是 Development ,打开 launchSettings.json 文件可以看到:

对于应用程序开发来说,日志记录是非常重要的一项功能,无论是在开发中、还是部署后的使用中,日志都会帮助我们发现、记录问题,我们可以根据日志来定位、复现并修复问题,所以尽可能的早的将日志服务添加到应用程序中是很有必要的,

到此这篇关于ASP.NET Core Web API 教程Project Configuration的文章就介绍到这了,更多相关ASP.NET Core Web API 教程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 理解ASP.NET Core 依赖注入(Dependency Injection)

    目录 依赖注入 什么是依赖注入 依赖注入有什么好处 ASP.NET Core内置的依赖注入 服务生存周期 服务释放 TryAdd{Lifetime}扩展方法 解析同一服务的多个不同实现 Replace && Remove 扩展方法 Autofac 服务解析和注入 构造函数注入 方法注入 属性注入 一些注意事项 框架默认提供的服务 依赖注入 什么是依赖注入 简单说,就是将对象的创建和销毁工作交给DI容器来进行,调用方只需要接收注入的对象实例即可. 微软官方文档-DI 依赖注入有什么好处 依赖

  • ASP.NET Core 文件响应压缩的常见使用误区

    误区1:未使用 Brotil 压缩 几乎不需要任何额外的代价,Brotil 压缩算法可以帮助你的网站提升约 20% 静态资源加载性能. 同时启用 Gzip / Brotil 压缩 Gzip 有更好的 user-agent 兼容性,而 Brotli 有更好的性能. 所以我们通常需要在 ASP.NET Core 网站中同时启用这两种压缩. 如何区分 Gzip 压缩和 Brotli 压缩 网站启用 Brotli 压缩时,服务器请求返回头 Content-Encoding 中会包含 br 字样,否则是

  • asp.net core MVC之实现基于token的认证

    安装Nuget包 项目中添加包:dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer 添加认证配置 Startup类中添加如下配置: public void ConfigureServices(IServiceCollection services) { ... services.AddAuthentication(defaultScheme: JwtBearerDefaults.AuthenticationScheme

  • ASP.NET Core如何注入多个服务实现类

    目录 1.定义个接口 2.注入服务 3.功能类 4.高级类 前言: 依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依赖注入后,你的编程思维就得变一变了.在过去,许多功能性的类型(比如一个加密解密的类),我们都喜欢将其定义为静态(static),而有了依赖注入,你就要避免使用静态类型,应该交由服务容器帮你管理,只要你用好了,你会发现依赖注入是很方便

  • ASP.NET Core中间件初始化的实现

    前言 在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,ASP.NET Core默认也为我们内置了许多的中间件,甚至有时候我们需要自定义中间件来帮我们处理一些请求管道过程中的处理.接下来,我们将围绕着以下几个问题来简单探究一下,关于ASP.NET Core中间件是如何初始化的 首先,使用UseMiddleware注册自定义中间件和直接Use的方式有何不同 其次,使用基于约定的方式定义中间件和使用实现IMiddleware接口的方式定义中间件有何不同 再次,使用基

  • ASP.NET Core读取Request.Body的正确方法

    前言 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中.因为笔者日常开发所使用的主要也是ASP.NET Core所以笔者也遇到这这种场景,关于本篇文章所套路的内容,来自于在开发过程中我遇到的关于Request.Body的读取问题.在之前的使用的时候,基本上都是借助搜索引擎搜索的答案,并没有太关注这个,发现自己理解的和正确的使用之间存在很大的误区.故有感而发,便写下此文,以作记录

  • 理解ASP.NET Core 中间件(Middleware)

    目录 中间件 中间件管道 Run Use UseWhen Map MapWhen Run & Use & UseWhen & Map & Map 编写中间件并激活 基于约定的中间件 基于工厂的中间件 基于约定的中间件 VS 基于工厂的中间件 中间件 先借用微软官方文档的一张图: 可以看到,中间件实际上是一种配置在HTTP请求管道中,用来处理请求和响应的组件.它可以: 决定是否将请求传递到管道中的下一个中间件 可以在管道中的下一个中间件处理之前和之后进行操作 此外,中间件的注

  • 理解ASP.NET Core 启动类(Startup)

    目录 准备工作:一份ASP.NET Core Web API应用程序 Startup类 Startup构造函数 ConfigureServices Configure 省略Startup类 IStartupFilter IHostingStartup HostingStartup 程序集 HostingStartup 特性 激活HostingStarup程序集 1.使用环境变量(推荐) 2.在程序中配置 多环境配置 环境配置方式 基于环境的 Startup 1.将IWebHostEnvironm

  • asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    目录 认证授权 身份认证 授权 默认授权 选择授权 总结 开发了一个公司内部系统,使用asp.net core 3.1.在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据.并且只是几个简单的接口不准备再重新部署一个站点,所以就直接在MVC的项目里面加了一个API区域用来写接口.这时候因为是接口所以就不能用cookie方式进行认证,得加一个jwt认证,采用多种身份验证方案来进行认证授权. 认证授权 身份验证是确定用户身份的过程. 授权是确定用户是否有权

  • ASP.NET Core 集成 React SPA应用的步骤

    目录 wwwroot\ui ReactUIMiddleware 运行一下 总结 AgileConfig的UI使用react重写快完成了.上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题.现在使用react重写后,agileconfig成了个确确实实的前后端分离项目.那么其实部署的话要分2个站点部署,把前端build完的静态内容部署在一个网站,把server端也部署在一个站点.然后修改前端的baseURL让spa的api

  • 关于Jenkins + Docker + ASP.NET Core自动化部署的问题(避免踩坑)

    本来没想着要写这篇博客,但是在实操过程中,一个是被网络问题搞炸了心态(真心感觉网络能把人搞疯,别人下个包.下个镜像几秒钟搞定,我看着我的几KB小水管真是有苦说不出),另一个就是这里面坑还是有一些的,写出来也是为了让大家避免重复踩坑 几个注意点: 下方shell命令绝大部分都需要管理员权限,所以如果你使用的用户不是root,则都要加上sudo 对于较复杂的命令我都提供了注释版和无注释版,无注释版是为了让你复制起来方便 准备工作 CentOS 7.x Docker Jenkins 一份支持 dock

随机推荐