【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包:
      dotnet add package Microsoft.EntityFrameworkCore
      
  2. 选择数据库提供程序

    • 根据你的数据库选择合适的EF Core数据库提供程序,例如,使用SQL Server数据库提供程序:
      dotnet add package Microsoft.EntityFrameworkCore.SqlServer
      
  3. 创建数据模型类

    • 定义表示数据库表的数据模型类,并使用数据注解或Fluent API配置模型。例如:
      public class Product
      {public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
      }
      
  4. 创建DbContext类

    • 创建一个派生自DbContext的类,表示数据库上下文,并在该类中声明DbSet属性以表示每个数据模型。例如:
      using Microsoft.EntityFrameworkCore;public class ApplicationDbContext : DbContext
      {public DbSet<Product> Products { get; set; }public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options){}
      }
      
  5. 配置数据库连接

    • Startup.cs文件的ConfigureServices方法中配置数据库连接,以及注册数据库上下文服务。例如:
      public void ConfigureServices(IServiceCollection services)
      {services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));// Other configurations...
      }
      
  6. 进行数据库迁移

    • 使用以下命令创建和应用数据库迁移:
      dotnet ef migrations add InitialCreate
      dotnet ef database update
      

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

  7. 在控制器中使用DbContext

    • 在需要访问数据库的控制器中注入DbContext,然后可以使用它进行数据库操作。例如:
      [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请求,将客户端提供的数据映射到数据模型,并添加到数据库中。例如:

 // 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 IDreturn Ok(product);}

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

2.2 读取资源

读取资源是 ASP.NET Core Web API 中的一项基本操作。使用 Entity Framework Core(EF Core)可以方便地从数据库中读取资源。以下是在 Web API 中读取资源的步骤:
在控制器中添加用于读取资源的 API 端点。通过接收 GET 请求,从数据库中获取资源,并将其返回给客户端。例如:

 [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 请求,从数据库中获取要更新的资源,将客户端提供的新数据应用于资源,并保存更新。例如:

[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 updatesexistingProduct.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请求,从数据库中找到要删除的资源,并执行删除操作。例如:

 [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方法中添加身份验证服务:

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方法中,可以定义授权策略。授权策略定义了在哪些条件下用户被授予特定权限。

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特性,并根据需要指定授权策略:

[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" rolepublic 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方法中添加异常处理中间件:
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. 创建异常处理控制器
    创建一个用于处理异常的控制器。在控制器中,你可以定义返回给客户端的错误响应的格式和内容。
[ApiController]
[Route("error")]
public class ErrorController : ControllerBase
{[HttpGet]public IActionResult Error(){var exceptionHandlerPathFeature =HttpContext.Features.Get<IExceptionHandlerPathFeature>();// Log or handle the exception as neededreturn Problem(detail: "An unexpected error occurred.",title: "Internal Server Error");}
}

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

  1. 配置全局异常过滤器(Optional)
    另一种方式是通过配置全局异常过滤器。在Startup.cs文件的ConfigureServices方法中添加以下代码:
public void ConfigureServices(IServiceCollection services)
{// Other services...services.AddControllers(options =>{options.Filters.Add(new ApiExceptionFilter());});
}

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

public class ApiExceptionFilter : IExceptionFilter
{public void OnException(ExceptionContext context){// Log or handle the exception as neededcontext.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方法中添加日志服务的配置:
public void ConfigureServices(IServiceCollection services)
{// Other services...services.AddLogging(builder =>{builder.AddConsole(); // 添加Console日志提供程序builder.AddDebug();   // 添加Debug日志提供程序});// Other services...
}

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

  1. 在控制器或服务中使用日志
    在需要记录日志的地方,注入ILogger<T>并使用它记录日志。例如,在控制器中:
[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文件中配置日志级别,以便在运行时控制日志的详细程度。例如:
{"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用于生产环境配置。在这些文件中,你可以指定数据库连接字符串、日志级别、第三方服务密钥等信息。
// appsettings.Production.json
{"ConnectionStrings": {"DefaultConnection": "your-production-connection-string"},"Logging": {"LogLevel": {"Default": "Warning"}},"ApiKey": "your-production-api-key"
}
  1. 启动环境变量
    通过设置ASPNETCORE_ENVIRONMENT环境变量来指定应用程序运行的环境。例如,设置为Production
export ASPNETCORE_ENVIRONMENT=Production

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

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

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

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

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

六、总结

我们深入了解了Web API的重要性,探讨了如何通过Entity Framework Core集成数据库访问,包括创建数据模型、DbContext以及进行数据库迁移等关键步骤。我们还学习了如何使用DTOs传输数据,进行数据模型验证以确保数据的完整性和合法性。
进一步,我们讨论了如何添加身份验证与授权,包括配置身份验证、实现授权策略以及保护API端点的方法。这是确保Web API安全性的关键步骤。
另外,我们介绍了全局异常处理的实现,帮助在应用程序中统一处理异常,提供一致的错误响应,并记录必要的异常信息以进行调试和监控。
最后,我们学习了如何集成日志记录,以便更好地监控和调试应用程序。通过使用内置的日志系统,我们能够灵活地配置和记录应用程序的日志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符&#xff1a; 大小写字母、数字、标点符号及一些其它符号元字符&#xff1a; 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

MySQL 备份恢复

1.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了。 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数…

2024 高级前端面试题之 前端安全模块 「精选篇」

该内容主要整理关于 前端安全模块 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 前端安全模块精选篇 1. 代码注入XSS如何攻击如何防御cookie 如何防范 XSS 攻击 2. 跨站请求伪造CSRF3. 浏览器同源策略 SOP4. 跨域资源共享 CORS5. 密码…

机器学习2-简单的二分类问题

需求&#xff1a; 假设现在需要对数据进行二分类&#xff0c;小于0.5的&#xff0c;打上0的标记&#xff0c;大于0.5的&#xff0c;打上1的标记&#xff0c;怎么做&#xff1f; 分析&#xff1a; 这是一个简单的二分类问题&#xff0c;使用逻辑回归模型。 代码&#xff1a; …

【PostgresSQL系列】 ltree简介及基于SpringBoot实现 ltree数据增删改查

本文将对PostgresSQL中的ltree进行相关概念介绍&#xff0c;并以示例代码讲解ltree数据增删改查功能的实现。 作者&#xff1a;后端小肥肠 目录 1.前言 2. 基础概念 2.1. ltree 2.2. lquery 2.3. ltxtquery 2.4. ltree函数及操作符 2.4.1. ltree函数 2.4.2. ltree操作符…

Python实现TCP和UDP通信

目录 一&#xff1a;TCP 二&#xff1a;UDP 一&#xff1a;TCP 在Python中实现TCP通信可以通过使用内置的socket模块来完成。以下是一个简单的示例&#xff0c;展示了如何使用Python的socket模块创建一个TCP客户端和服务器。 TCP服务器 import socket def start_server(): s…

Linux之系统安全与应用续章

目录 一. PAM认证 1.2 初识PAM 1.2.1 PAM及其作用 1.2.2 PAM认证原理 1.2.3 PAM认证的构成 1.2.4 PAM 认证类型 1.2.5 PAM 控制类型 二. limit 三. GRUB加密 /etc/grub.d目录 四. 暴力破解密码 五. 网络扫描--NMAP 六. 总结 一. PAM认证 1.2 初识PAM PAM是Linux系…

【深蓝学院】移动机器人运动规划--第3章 基于采样的路径规划--作业

0. Assignment T1. MATLAB实现RRT 1.1 GPT-4任务分析 RRT伪代码&#xff1a; 任务1即使用matlab实现RRT&#xff0c;结合作业所给框架&#xff0c;简单梳理&#xff0c;可结合1.2代码理解&#xff1a; 设置start&#xff0c;goal&#xff0c;near to goal threshold Thr&am…

react+ts

1.概念 React和TypeScript集合使用的重点集中在 存储数据/状态有关的Hook函数以及组件接口的位置&#xff0c;这些地方最需要数据类型校验 2.使用Vite创建项目 Vite是前端工具链工具&#xff0c;可以帮助我们快速创建一个 reactts 的工程化环境出来 Vite官网&#xff1a;ht…

2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的D题&#xff01; 完整内容可以在文章末尾领…

子查询练习2

数据表 链接&#xff1a;https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码&#xff1a;b0rp --来自百度网盘超级会员V5的分享 1.查询和Zlotkey相同部门的员工姓名和工资 2.查询工资比公司平均工资高的员工的员工号,姓名和工资 3.查询工资大于所有JOB_IDSA_MAN的员工…

大白话理解大型语言模型(LLM):预训练和微调

引言&#xff1a; 在人工智能的世界里&#xff0c;大型语言模型&#xff08;LLM&#xff09;已成为一种强大的工具&#xff0c;它们不仅能理解和生成自然语言&#xff0c;还能在各种复杂任务中表现出色。本文将深入探讨这些模型的两个关键阶段&#xff1a;预训练和微调&#xf…

Python中的单元测试框架:使用unittest进行有效测试

一、介绍 在软件开发中&#xff0c;单元测试是一种测试方法&#xff0c;它用于检查单个软件组件&#xff08;例如函数或方法&#xff09;的正确性。Python 提供了一个内置的单元测试库&#xff0c;名为 unittest&#xff0c;可以用来编写测试代码&#xff0c;然后运行测试&…

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证 引言crypto/ed25519 算法简介环境搭建和准备工作生成密钥对进行数字签名 验证签名实际应用场景案例总结 引言 在当今数字化时代&#xff0c;网络安全显得尤为重要。无论是在网上进行交易、签署合同&#xff0c;还是发…

BioTech - 小分子药物设计与优化 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135998902 小分子药物设计与优化&#xff0c;是利用计算机辅助技术&#xff0c;根据特定的生物学靶点&#xff0c;发现和改进具有治疗作用的小分子…

某赛通电子文档安全管理系统 34处 反序列化RCE漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

C++ Webserver从零开始:基础知识(七)——多进程编程

前言 在学习操作系统时&#xff0c;我们知道现代计算机往往都是多进程多线程的&#xff0c;多进程和多线程技术能大大提高了CPU的利用率&#xff0c;因此在web服务器的设计中&#xff0c;不可避免地要涉及到多进程多线程技术。 这一章将简要讲解web服务器中的多进程编程&#x…

全国疫情实时监测系统(附源码)

目录 一.项目背景 1.有力支持疫情防控知识传播 2.迅速锁定“涉疫”人员流动轨迹 3.开展疫情发展态势预测与溯源 4.一图胜过千言万语&#xff01;&#xff01;&#xff01; 二.研究过程&#xff08;项目技术的利用&#xff09; 1.总述 2.所用技术介绍 2.1Python 2.2Pyt…

基于布谷鸟搜索的多目标优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 1. 布谷鸟搜索算法基础 2. 多目标优化问题 3. 基于布谷鸟搜索的多目标优化算法 4. 解的存储和选择策略 5.算法步骤 5.完整程序 1.程序功能描述 基于布谷鸟搜索的多目标优化&#xff0c;…

社区店加盟多少钱?费用全解及 2024 年加盟趋势

在探讨社区店加盟费用之前&#xff0c;我们首先要明确一个概念&#xff1a;社区店不仅仅是一个简单的销售点&#xff0c;更是连接品牌与消费者的桥梁。 特别是在鲜奶行业&#xff0c;社区店承载着为消费者提供新鲜、健康产品的重任。作为一名拥有多年鲜奶吧经营经验的创业者&a…