白骑士的C#教学实战项目篇 4.3 Web开发
系列目录
上一篇:白骑士的C#教学实战项目篇 4.2 图形用户界面(GUI)应用
在这一部分,我们将从桌面应用程序扩展到 Web 开发。Web 开发是现代软件开发的重要领域,涵盖了从前端用户界面到后端服务器逻辑的完整堆栈。在这部分中,我们将介绍 ASP.NET Core 的基础知识,学习如何创建和配置 Web API,并通过一个开发博客系统的项目来综合应用这些知识。
Web 开发涉及到创建能够在浏览器中运行的应用程序。ASP.NET Core 是一个用于构建现代、云优先的 Web 应用程序的开源框架。它具有高性能、跨平台的特点,适用于开发各种类型的 Web 应用程序和服务。
ASP.NET Core基础
ASP.NET Core 是一个轻量级、跨平台的框架,用于构建现代 Web 应用程序。它由模块化的中间件组件组成,允许开发人员根据需要配置和扩展应用程序。
创建一个简单的 ASP.NET Core 应用程序
- 安装 .NET SDK:确保已安装最新版本的 .NET SDK。可以从 Microsoft 官方网站下载。
- 创建新项目:在命令行中运行以下命令创建一个新的 ASP.NET Core Web 应用程序:
dotnet new webapp -o MyWebApp cd MyWebApp - 运行应用程序:
dotnet run
在浏览器中访问 ‘http://localhost:5000‘,可以看到一个简单的 ASP.NET Core Web 应用程序。
创建与配置Web API
Web API 是用于构建 RESTful 服务的接口,允许不同的客户端(例如浏览器和移动设备)与服务器进行通信。ASP.NET Core 提供了简便的方式来创建和配置 Web API。
创建一个简单的 Web API
- 创建新项目:在命令行中运行以下命令创建一个新的 ASP.NET Core Web API 项目:
dotnet new webapi -o MyWebAPI cd MyWebAPI - 定义数据模型:在 ‘Models‘ 文件夹中创建一个新的数据模型,例如 ‘Post‘:
- 创建控制器:
public class Post {public int Id { get; set; }public string Title { get; set; }public string Content { get; set; } }在 ‘Controllers‘ 文件夹中创建一个新的控制器,例如 ‘PostsController‘:
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Linq;[Route("api/[controller]")][ApiController] public class PostsController : ControllerBase {private static List<Post> posts = new List<Post>{new Post { Id = 1, Title = "First Post", Content = "This is the first post" },new Post { Id = 2, Title = "Second Post", Content = "This is the second post" }};[HttpGet]public ActionResult<IEnumerable<Post>> GetPosts(){return posts;}[HttpGet("{id}")]public ActionResult<Post> GetPost(int id){var post = posts.FirstOrDefault(p => p.Id == id);if (post == null){return NotFound();}return post;}[HttpPost]public ActionResult<Post> CreatePost(Post post){post.Id = posts.Max(p => p.Id) + 1;posts.Add(post);return CreatedAtAction(nameof(GetPost), new { id = post.Id }, post);}[HttpPut("{id}")]public IActionResult UpdatePost(int id, Post post){var existingPost = posts.FirstOrDefault(p => p.Id == id);if (existingPost == null){return NotFound();}existingPost.Title = post.Title;existingPost.Content = post.Content;return NoContent();}[HttpDelete("{id}")]public IActionResult DeletePost(int id){var post = posts.FirstOrDefault(p => p.Id == id);if (post == null){return NotFound();}posts.Remove(post);return NoContent();} } - 运行应用程序:
dotnet run
在浏览器中访问 ‘http://localhost:5000/api/posts‘,可以看到一个简单的 Web API 服务。
实践项目:开发一个博客系统
现在我们将综合运用 ASP.NET Core 技术,开发一个简单的博客系统。这个博客系统将包括基本的博客文章管理功能,如创建、读取、更新和删除(CRUD)。
项目结构
- 创建 ASP.NET Core 项目:
dotnet new webapi -o BlogSystem cd BlogSystem - 定义数据模型:在 ‘Models‘ 文件夹中创建数据模型 ‘BlogPost‘:
public class BlogPost {public int Id { get; set; }public string Title { get; set; }public string Content { get; set; }public DateTime CreatedAt { get; set; } } - 创建数据上下文:在 ‘Data‘ 文件夹中创建数据上下文 ‘BlogContext‘:
using Microsoft.EntityFrameworkCore;public class BlogContext : DbContext {public BlogContext(DbContextOptions<BlogContext> options) : base(options) { }public DbSet<BlogPost> BlogPosts { get; set; } } - 配置数据库连接:在 ‘appsettings.json‘ 文件中配置数据库连接字符串:
"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BlogDB;Trusted_Connection=True;MultipleActiveResultSets=true" } - 配置启动文件:在 ‘Startup.cs‘ 文件中配置服务:
public void ConfigureServices(IServiceCollection services) {services.AddDbContext<BlogContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));services.AddControllers(); } - 创建控制器:在 ‘Controllers‘ 文件夹中创建 ‘BlogPostsController‘:
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;[Route("api/[controller]")][ApiController] public class BlogPostsController : ControllerBase {private readonly BlogContext _context;public BlogPostsController(BlogContext context){_context = context;}[HttpGet]public async Task<ActionResult<IEnumerable<BlogPost>>> GetBlogPosts(){return await _context.BlogPosts.ToListAsync();}[HttpGet("{id}")]public async Task<ActionResult<BlogPost>> GetBlogPost(int id){var blogPost = await _context.BlogPosts.FindAsync(id);if (blogPost == null){return NotFound();}return blogPost;}[HttpPost]public async Task<ActionResult<BlogPost>> CreateBlogPost(BlogPost blogPost){_context.BlogPosts.Add(blogPost);await _context.SaveChangesAsync();return CreatedAtAction(nameof(GetBlogPost), new { id = blogPost.Id }, blogPost);}[HttpPut("{id}")]public async Task<IActionResult> UpdateBlogPost(int id, BlogPost blogPost){if (id != blogPost.Id){return BadRequest();}_context.Entry(blogPost).State = EntityState.Modified;try{await _context.SaveChangesAsync();}catch (DbUpdateConcurrencyException){if (!BlogPostExists(id)){return NotFound();}else{throw;}}return NoContent();}[HttpDelete("{id}")]public async Task<IActionResult> DeleteBlogPost(int id){var blogPost = await _context.BlogPosts.FindAsync(id);if (blogPost == null){return NotFound();}_context.BlogPosts.Remove(blogPost);await _context.SaveChangesAsync();return NoContent();}private bool BlogPostExists(int id){return _context.BlogPosts.Any(e => e.Id == id);} } - 运行应用程序:
dotnet run
在浏览器中访问 ‘http://localhost:5000/api/blogposts‘,可以看到一个简单的博客系统 API。
总结
在本节中,我们从桌面应用程序扩展到 Web 开发,学习了 ASP.NET Core 的基础知识和如何创建和配置 Web API。通过开发一个博客系统的项目,我们综合运用了这些知识,展示了如何设计和实现一个实际的 Web 应用程序。继续练习和扩展这些项目,可以帮助您进一步提高 Web 开发技能,为更复杂的项目打下坚实的基础。
下一篇:白骑士的C#教学实战项目篇 4.4 游戏开发
相关文章:
白骑士的C#教学实战项目篇 4.3 Web开发
系列目录 上一篇:白骑士的C#教学实战项目篇 4.2 图形用户界面(GUI)应用 在这一部分,我们将从桌面应用程序扩展到 Web 开发。Web 开发是现代软件开发的重要领域,涵盖了从前端用户界面到后端服务器逻辑的完整堆栈。在这…...
【数据分析】(交互) 延迟互信息(熵、概率密度、高斯核、带宽估计)
文章目录 一、互信息基础二、延迟互信息2.1 交互延迟互信息三、时间序列互信息中的概率计算(高斯核密度估计)四、python 示例补充 1:熵熵的定义熵的性质熵的单位和对数底数熵的最大值高熵、低熵的分辨补充 2:概率密度 和 高斯核概率密度高斯核拓展3 :核密度函数带宽估计在…...
html转vue项目
HTML是一种用于构建网页的标记语言,而Vue是一种用于构建用户界面的JavaScript框架。在HTML中使用Vue可以提供更加灵活和动态的用户界面功能。本文将介绍如何将HTML代码转换为Vue,并提供具体的代码示例。 首先,我们需要在项目中引入Vue框架。…...
.NET系列 定时器
net一共4种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…...
【Golang】火焰图空白部分是什么?
起因 被同事灵魂拷问:图中这块空白是什么东西? 豆包回答说是数据采样不完整,特定函数或代码段未被调用之类的原因,感觉都不太合理。 之前看过一篇文章说:Heap Profiling的采样是无时无刻不在发生的,执行…...
Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]
Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader] [FromBody][FromQuery][FromRoute] or [FromUri][FromHeader] [FromBody] FromBody 属性在使用 application/json 内容类型并在正文中传递 JSON 时使用通常情况下,FromBody 在一个操作中只…...
Messari 摘要报告:Covalent Network(CXT)2024 Q2 品牌重塑、AI模块化数据、亚太地区扩展、代币回购计划和网络增长
摘要 Covalent Network(CXT)在将质押从 Moonbeam 迁移到以太坊后,质押的 CQT 百分比恢复到了 20% 以上。 Covalent Network(CXT)在第二季度新增了五个网络运营商,使 BSP 集增长了 36%,提升了协…...
Open3D 计算点云的面状指数
目录 一、概述 1.1原理 1.2实现步骤 步骤 1:确定邻域点 步骤 2:计算协方差矩阵 步骤 3:特征值分解 步骤 4:计算面状指数 步骤 5:可视化与应用 1.3应用领域 二、代码实现 2.1关键函数 2.2完整代码 三、实现…...
python下麦克风设备选择和录音
import pyaudio import threading import wave import numpy as np def audio_f2i(data, width16):"""将浮点数音频数据转换为整数音频数据。"""data np.array(data)return np.int16(data * (2 ** (width - 1)))def audio_i2f(data, width16)…...
云和集群有什么区别?
我们常说的集群是针对于某项单独的功能或者说是某几个功能的集合体。 举个例子,比方有100台机器组成一个集群,这个集群里面50台机器装了hadoop,10台机器装了spark,剩下40台机器再装一个查询引擎presto。诸如此类,把多…...
无人机视角下的EasyCVR视频汇聚管理:构建全方位、智能化的AI视频监控网络
随着5G、AI、物联网(IoT)等技术的快速发展,万物互联的时代已经到来,视频技术作为信息传输和交互的重要手段,在多个领域展现出了巨大的应用潜力和价值。其中,EasyCVR视频汇聚平台与无人机结合的AI应用更是为…...
数字影像技术是如何改变我们看待世界的方式呢?
在当今的科技时代,数字影像技术正以惊人的速度改变着我们的生活和视觉体验。那么,什么是数字影像技术呢? 数字影像技术是指通过数字化手段对图像和视频进行获取、处理、存储、传输和展示的一系列技术。 它利用各种数字设备,如数…...
Chainlit实现启动页面选择不同的LLM启动器等设置界面
基本概念:启动选择器(Starters) 启动选择器(Starters) 是一种帮助用户开始与您的助手互动的建议。您可以为助手定义最多4个启动建议,并且可以为每个启动建议指定一个图标。 示例代码 (starters.py) impo…...
SQL - 增、改、删
插入 (insert into) 插入单行 insert into 表名 values ( 对应列的值,用,号间隔) //一般主键值用default,不可填null的不要填null insert into 表名 (需要提供值的列名) values (与之对应的提供的值) //其他的值只需mysql默认提供 insert into 表名 子查…...
怎么屏蔽电脑监控软件?企业管理者的智慧选择——精准定位,合理屏蔽,让监控软件成为助力而非障碍!
电脑监控软件在企业管理中扮演着日益重要的角色,它们能够提升工作效率、保障信息安全、预防内部风险。然而,过度或不当使用监控软件也可能引发员工隐私担忧,影响工作积极性和团队氛围。因此,作为企业管理者,如何精准定…...
Linux·权限与工具-make
1. Makefile/makefile工具 首先展示一下,makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件,m大小写均可。我们在文件中写入这样两行 wq保存退出后,我们使用 make 命令 可以看到生成了可执行程序ÿ…...
C++的序列容器——数组
前言: 这篇文章我们就开始新的章节,我们之前说的C/C的缺陷那部分内容就结束了。在开始新的章之前我希望大家可以先对着题目思考一下,C的容器是什么?有什么作用?下面让我们开始新的内容: 目录 前言&#x…...
TCC 和 XA 协议之间的区别?
TCC(Two-Phase Commit)协议和XA协议都是用于分布式系统中确保事务原子性的协议。它们在实现分布式事务协调方面有一些相似之处,但也存在一些关键的不同点。 协议的协调者(Coordinator)角色: TCC协议&#x…...
萌啦数据插件使用情况分析,萌啦数据插件下载
在当今数字化时代,数据已成为企业决策与个人分析不可或缺的重要资源。随着数据分析工具的日益丰富,一款高效、易用的数据插件成为了众多用户的心头好。其中,“萌啦数据插件”凭借其独特的优势,在众多竞品中脱颖而出,成…...
C++初学(13)
13.1、for循环的组成部分 for循环的组成部分完成下面这些步骤: (1)设置初始值。 (2)执行测试,看看循环是否应当继续。 (3)执行循环操作。 (4)更新用于测试的值。 C循环设计中包含这要素,很容易识别,初始化、测试和更新操作工…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
