【ASP.NET Core 基础知识】--Web API--创建和配置Web API(二)

书接上文,继续讲。

一、数据访问与数据库配置

集成Entity Framework Core(EF Core)是在ASP.NET Core Web API中进行数据库访问的常见方式。以下是集成EF Core的基本步骤:

  1. 安装Entity Framework Core包

    • 在你的ASP.NET Core项目中,使用以下命令来安装EF Core包:

      bash 复制代码
      dotnet add package Microsoft.EntityFrameworkCore
  2. 选择数据库提供程序

    • 根据你的数据库选择合适的EF Core数据库提供程序,例如,使用SQL Server数据库提供程序:

      bash 复制代码
      dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  3. 创建数据模型类

    • 定义表示数据库表的数据模型类,并使用数据注解或Fluent API配置模型。例如:

      csharp 复制代码
      public class Product
      {
          public int Id { get; set; }
          public string Name { get; set; }
          public decimal Price { get; set; }
      }
  4. 创建DbContext类

    • 创建一个派生自DbContext的类,表示数据库上下文,并在该类中声明DbSet属性以表示每个数据模型。例如:

      csharp 复制代码
      using Microsoft.EntityFrameworkCore;
      
      public class ApplicationDbContext : DbContext
      {
          public DbSet<Product> Products { get; set; }
      
          public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
              : base(options)
          {
          }
      }
  5. 配置数据库连接

    • Startup.cs文件的ConfigureServices方法中配置数据库连接,以及注册数据库上下文服务。例如:

      csharp 复制代码
      public void ConfigureServices(IServiceCollection services)
      {
          services.AddDbContext<ApplicationDbContext>(options =>
              options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
          // Other configurations...
      }
  6. 进行数据库迁移

    • 使用以下命令创建和应用数据库迁移:

      bash 复制代码
      dotnet ef migrations add InitialCreate
      dotnet ef database update

    这将在数据库中创建所定义的表。

  7. 在控制器中使用DbContext

    • 在需要访问数据库的控制器中注入DbContext,然后可以使用它进行数据库操作。例如:

      csharp 复制代码
      [ApiController]
      [Route("api/[controller]")]
      public class ProductsController : ControllerBase
      {
          private readonly ApplicationDbContext _context;
      
          public ProductsController(ApplicationDbContext context)
          {
              _context = context;
          }
      
          // Controller actions that interact with the database...
      }

通过这些步骤,你就能够在ASP.NET Core Web API中成功集成Entity Framework Core,实现对数据库的访问和操作。

二、实现CRUD操作

2.1 创建资源

在控制器中添加用于创建资源的API端点。通过接收POST请求,将客户端提供的数据映射到数据模型,并添加到数据库中。例如:

csharp 复制代码
 // POST: api/products
 [HttpPost]
 public IActionResult CreateProduct([FromBody] Product product)
 {
     if (product == null)
     {
         return BadRequest("Product data is null.");
     }

     // Add to database
     _context.Products.Add(product);
     _context.SaveChanges();

     // Return a response, e.g., the created product with its ID
     return Ok(product);
 }

在上述例子中,CreateProduct 方法接收一个 Product 对象,将其添加到数据库并返回一个成功的响应。

2.2 读取资源

读取资源是 ASP.NET Core Web API 中的一项基本操作。使用 Entity Framework Core(EF Core)可以方便地从数据库中读取资源。以下是在 Web API 中读取资源的步骤:

在控制器中添加用于读取资源的 API 端点。通过接收 GET 请求,从数据库中获取资源,并将其返回给客户端。例如:

csharp 复制代码
 [ApiController]
 [Route("api/[controller]")]
 public class ProductsController : ControllerBase
 {
     private readonly ApplicationDbContext _context;

     public ProductsController(ApplicationDbContext context)
     {
         _context = context;
     }

     // GET: api/products
     [HttpGet]
     public IActionResult GetProducts()
     {
         var products = _context.Products.ToList();
         return Ok(products);
     }

     // GET: api/products/1
     [HttpGet("{id}")]
     public IActionResult GetProductById(int id)
     {
         var product = _context.Products.FirstOrDefault(p => p.Id == id);

         if (product == null)
         {
             return NotFound(); // 404 Not Found
         }

         return Ok(product);
     }
 }

在上述例子中,GetProducts 方法返回所有产品资源,而 GetProductById 方法根据传入的 ID 返回对应的产品资源。确保适当地处理数据库中不存在的资源,以提供正确的响应给客户端。通过这些步骤,你就能够在 ASP.NET Core Web API 中成功实现读取资源的功能。

2.3 更新资源

ASP.NET Core Web API 中使用 Entity Framework Core(EF Core)更新资源的过程通常包括以下步骤:

在控制器中添加用于更新资源的 API 端点。通过接收 PUT 或 PATCH 请求,从数据库中获取要更新的资源,将客户端提供的新数据应用于资源,并保存更新。例如:

csharp 复制代码
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public ProductsController(ApplicationDbContext context)
    {
        _context = context;
    }

    // PUT: api/products/1
    [HttpPut("{id}")]
    public IActionResult UpdateProduct(int id, [FromBody] Product updatedProduct)
    {
        var existingProduct = _context.Products.FirstOrDefault(p => p.Id == id);

        if (existingProduct == null)
        {
            return NotFound(); // 404 Not Found
        }

        // Apply updates
        existingProduct.Name = updatedProduct.Name;
        existingProduct.Price = updatedProduct.Price;

        // Update in the database
        _context.SaveChanges();

        return Ok(existingProduct);
    }
}

在上述例子中,UpdateProduct 方法根据传入的 ID 获取现有产品资源,然后将客户端提供的更新应用于该资源,并保存到数据库中。确保在更新之前验证资源是否存在,并适当处理不存在的情况。通过这些步骤,你就能够在 ASP.NET Core Web API 中成功实现更新资源的功能。

2.4 删除资源

在ASP.NET Core Web API中,使用Entity Framework Core(EF Core)实现删除资源的过程通常包括以下步骤:

在控制器中添加用于删除资源的API端点。通过接收DELETE请求,从数据库中找到要删除的资源,并执行删除操作。例如:

csharp 复制代码
 [ApiController]
 [Route("api/[controller]")]
 public class ProductsController : ControllerBase
 {
     private readonly ApplicationDbContext _context;

     public ProductsController(ApplicationDbContext context)
     {
         _context = context;
     }

     // DELETE: api/products/1
     [HttpDelete("{id}")]
     public IActionResult DeleteProduct(int id)
     {
         var product = _context.Products.FirstOrDefault(p => p.Id == id);

         if (product == null)
         {
             return NotFound(); // 404 Not Found
         }

         // Remove from the database
         _context.Products.Remove(product);
         _context.SaveChanges();

         return NoContent(); // 204 No Content
     }
 }

在上述例子中,DeleteProduct 方法根据传入的ID获取要删除的产品资源,然后从数据库中删除它。确保在删除之前验证资源是否存在,并适当处理不存在的情况。成功删除后,通常返回204 No Content表示操作成功,但没有返回任何内容。通过这些步骤,你就能够在ASP.NET Core Web API中成功实现删除资源的功能。

三、添加身份验证与授权

在ASP.NET Core Web API中,添加身份验证与授权是确保API端点仅对经过身份验证和已授权的用户可用的重要步骤。以下是在Web API中配置身份验证、实现授权策略以及保护API端点的基本步骤:

3.1 配置身份验证

首先,需要配置身份验证服务。在Startup.cs文件的ConfigureServices方法中添加身份验证服务:

csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    // Other services...

    services.AddAuthentication("Bearer")
        .AddJwtBearer(options =>
        {
            options.Authority = "https://your-authorization-server";
            options.Audience = "your-api-audience";
        });

    services.AddAuthorization();
}

上述代码使用JWT令牌进行身份验证,需要根据实际情况配置AuthorityAudience

3.2 实现授权策略

Startup.cs文件的ConfigureServices方法中,可以定义授权策略。授权策略定义了在哪些条件下用户被授予特定权限。

csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    // Other services...

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdminRole", policy =>
            policy.RequireRole("Admin"));
        
        // Add other policies as needed...
    });
}

上述代码定义了一个名为RequireAdminRole的授权策略,要求用户具有Admin角色。

3.3 保护API端点

在需要进行身份验证和授权的API端点上添加Authorize特性,并根据需要指定授权策略:

csharp 复制代码
[ApiController]
[Route("api/[controller]")]
[Authorize] // Requires authentication
public class ProductsController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public ProductsController(ApplicationDbContext context)
    {
        _context = context;
    }

    // GET: api/products
    [HttpGet]
    [Authorize(Policy = "RequireAdminRole")] // Requires "Admin" role
    public IActionResult GetProducts()
    {
        // Implementation...
    }

    // Other actions...
}

上述代码中,[Authorize]特性要求对API端点的访问进行身份验证,而[Authorize(Policy = "RequireAdminRole")]则要求用户具有Admin角色。

通过这些步骤,你可以为ASP.NET Core Web API配置身份验证、实现授权策略,并保护API端点,确保只有经过身份验证且已授权的用户可以访问。请根据实际需求和安全要求调整上述代码。

四、异常处理与日志记录

4.1 实现全局异常处理

在ASP.NET Core Web API中,实现全局异常处理是确保在应用程序中的任何位置都能够捕获和处理异常的重要步骤。以下是在Web API中实现全局异常处理的基本步骤:

  1. 创建异常处理中间件
    Startup.cs文件的Configure方法中添加异常处理中间件:
csharp 复制代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Other middleware...

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/error");
        app.UseHsts();
    }

    // Other middleware...
}

上述代码中,UseExceptionHandler("/error")用于指定异常处理的端点路径,可以根据需要自定义路径。

  1. 创建异常处理控制器
    创建一个用于处理异常的控制器。在控制器中,你可以定义返回给客户端的错误响应的格式和内容。
csharp 复制代码
[ApiController]
[Route("error")]
public class ErrorController : ControllerBase
{
    [HttpGet]
    public IActionResult Error()
    {
        var exceptionHandlerPathFeature =
            HttpContext.Features.Get<IExceptionHandlerPathFeature>();

        // Log or handle the exception as needed

        return Problem(
            detail: "An unexpected error occurred.",
            title: "Internal Server Error");
    }
}

上述代码中,Problem方法用于返回一个标准的问题详情,其中包含错误的详细信息。

  1. 配置全局异常过滤器(Optional)
    另一种方式是通过配置全局异常过滤器。在Startup.cs文件的ConfigureServices方法中添加以下代码:
csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    // Other services...

    services.AddControllers(options =>
    {
        options.Filters.Add(new ApiExceptionFilter());
    });
}

然后创建一个实现IExceptionFilter接口的过滤器类:

csharp 复制代码
public class ApiExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        // Log or handle the exception as needed

        context.Result = new ObjectResult(new
        {
            error = new
            {
                message = "An unexpected error occurred.",
                detail = context.Exception.Message
            }
        })
        {
            StatusCode = 500,
        };

        context.ExceptionHandled = true;
    }
}

通过这些步骤,你就能够在ASP.NET Core Web API中实现全局异常处理。这有助于统一处理应用程序中的异常,提供一致的错误响应,并记录必要的异常信息以进行调试和监控。

4.2 集成日志记录

集成日志记录对于Web API是非常重要的,可以帮助你在生产环境中监控和调试应用程序。在ASP.NET Core中,使用内置的日志系统非常简单。以下是集成日志记录的基本步骤:

  1. Startup.cs中配置日志服务
    ConfigureServices方法中添加日志服务的配置:
csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    // Other services...

    services.AddLogging(builder =>
    {
        builder.AddConsole(); // 添加Console日志提供程序
        builder.AddDebug();   // 添加Debug日志提供程序
    });

    // Other services...
}

上述代码添加了Console和Debug日志提供程序,你还可以添加其他的日志提供程序,如AddFileAddEventLog等,具体取决于你的需求。

  1. 在控制器或服务中使用日志
    在需要记录日志的地方,注入ILogger<T>并使用它记录日志。例如,在控制器中:
csharp 复制代码
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly ILogger<ProductsController> _logger;

    public ProductsController(ILogger<ProductsController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IActionResult GetProducts()
    {
        try
        {
            // Your code here...
            _logger.LogInformation("GetProducts endpoint called.");

            return Ok();
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "An error occurred while processing the request.");
            return StatusCode(500, "Internal Server Error");
        }
    }
}
  1. 配置日志级别(Optional)
    appsettings.json文件中配置日志级别,以便在运行时控制日志的详细程度。例如:
json 复制代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

上述配置将默认日志级别设置为Information,而对于Microsoft命名空间,设置为Warning。你可以根据需要进行调整。

通过这些步骤,你就能够在ASP.NET Core Web API中集成日志记录,以便更好地监控和调试应用程序。日志将在控制台或其他配置的日志目标中记录,并可根据需要设置详细程度。

五、部署

将ASP.NET Core Web API部署到不同环境通常涉及到配置管理、数据库连接字符串、日志记录等方面的调整。以下是一些在不同环境中部署ASP.NET Core Web API的常见步骤:

  1. 环境配置
    在ASP.NET Core中,你可以使用appsettings.{Environment}.json文件来存储每个环境的配置。例如,appsettings.Production.json用于生产环境配置。在这些文件中,你可以指定数据库连接字符串、日志级别、第三方服务密钥等信息。
json 复制代码
// appsettings.Production.json
{
  "ConnectionStrings": {
    "DefaultConnection": "your-production-connection-string"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ApiKey": "your-production-api-key"
}
  1. 启动环境变量
    通过设置ASPNETCORE_ENVIRONMENT环境变量来指定应用程序运行的环境。例如,设置为Production
bash 复制代码
export ASPNETCORE_ENVIRONMENT=Production

或者在运行应用程序的命令中指定:

bash 复制代码
dotnet run --environment Production
  1. 发布应用程序
    使用以下命令来发布应用程序:
bash 复制代码
dotnet publish -c Release

这将在设置的目录中生成发布版本的应用程序。

  1. 在服务器上配置环境变量
    在部署服务器上,使用环境变量或配置文件来指定应用程序的环境、数据库连接字符串等。具体的配置方式取决于你选择的部署方式(如Docker、Azure、IIS等)。
  2. 配置IIS或反向代理
    如果你选择使用IIS或反向代理,确保在服务器上正确配置应用程序池、反向代理设置等。
  3. 数据库迁移
    如果使用了Entity Framework Core并且有数据库迁移,确保在新环境中应用迁移以更新数据库。
bash 复制代码
dotnet ef database update --environment Production

通过这些步骤,你就可以将ASP.NET Core Web API成功地部署到不同的环境中。确保在不同的环境中正确配置和管理应用程序的设置,以确保应用程序在各种情况下都能够正常运行。

六、总结

我们深入了解了Web API的重要性,探讨了如何通过Entity Framework Core集成数据库访问,包括创建数据模型、DbContext以及进行数据库迁移等关键步骤。我们还学习了如何使用DTOs传输数据,进行数据模型验证以确保数据的完整性和合法性。

进一步,我们讨论了如何添加身份验证与授权,包括配置身份验证、实现授权策略以及保护API端点的方法。这是确保Web API安全性的关键步骤。

另外,我们介绍了全局异常处理的实现,帮助在应用程序中统一处理异常,提供一致的错误响应,并记录必要的异常信息以进行调试和监控。

最后,我们学习了如何集成日志记录,以便更好地监控和调试应用程序。通过使用内置的日志系统,我们能够灵活地配置和记录应用程序的日志。

相关推荐
RestCloud7 分钟前
ETLCloud中的数据转化规则是什么意思?怎么执行
数据库·数据仓库·etl
JuneXcy7 分钟前
18.web api 9
前端·javascript
枫叶丹48 分钟前
【Qt开发】常用控件(五)
服务器·前端·qt
一个天蝎座 白勺 程序猿22 分钟前
Apache IoTDB(4):深度解析时序数据库 IoTDB 在Kubernetes 集群中的部署与实践指南
数据库·深度学习·kubernetes·apache·时序数据库·iotdb
JarvanMo25 分钟前
如何在处理大型列表时修复 Flutter 卡顿的滚动性能问题
前端
玲小珑30 分钟前
Next.js 教程系列(二十八)Next.js 的安全最佳实践
前端·next.js
超级小忍34 分钟前
CSS 常用动画属性详解(含实用示例)
前端·css
.Shu.1 小时前
Redis zset 渐进式rehash 实现原理、触发条件、执行流程以及数据一致性保障机制【分步源码解析】
数据库·redis·缓存
君不见,青丝成雪1 小时前
大数据技术栈 —— Redis与Kafka
数据库·redis·kafka
悟能不能悟1 小时前
排查Redis数据倾斜引发的性能瓶颈
java·数据库·redis