当前位置: 首页 > news >正文

白骑士的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 应用程序

  1. 安装 .NET SDK:确保已安装最新版本的 .NET SDK。可以从 Microsoft 官方网站下载。
  2. 创建新项目:在命令行中运行以下命令创建一个新的 ASP.NET Core Web 应用程序:
    dotnet new webapp -o MyWebApp
    cd MyWebApp
  3. 运行应用程序:
    dotnet run

        在浏览器中访问 ‘http://localhost:5000‘,可以看到一个简单的 ASP.NET Core Web 应用程序。

创建与配置Web API

        Web API 是用于构建 RESTful 服务的接口,允许不同的客户端(例如浏览器和移动设备)与服务器进行通信。ASP.NET Core 提供了简便的方式来创建和配置 Web API。

创建一个简单的 Web API

  1. 创建新项目:在命令行中运行以下命令创建一个新的 ASP.NET Core Web API 项目:
    dotnet new webapi -o MyWebAPI
    cd MyWebAPI

  2. 定义数据模型:在 ‘Models‘ 文件夹中创建一个新的数据模型,例如 ‘Post‘:
  3. 创建控制器:
    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();}
    }
  4. 运行应用程序:
    dotnet run

        在浏览器中访问 ‘http://localhost:5000/api/posts‘,可以看到一个简单的 Web API 服务。

实践项目:开发一个博客系统

        现在我们将综合运用 ASP.NET Core 技术,开发一个简单的博客系统。这个博客系统将包括基本的博客文章管理功能,如创建、读取、更新和删除(CRUD)。

项目结构

  1. 创建 ASP.NET Core 项目:
    dotnet new webapi -o BlogSystem
    cd BlogSystem
  2. 定义数据模型:在 ‘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; }
    }
  3. 创建数据上下文:在 ‘Data‘ 文件夹中创建数据上下文 ‘BlogContext‘:
    using Microsoft.EntityFrameworkCore;public class BlogContext : DbContext
    {public BlogContext(DbContextOptions<BlogContext> options) : base(options) { }public DbSet<BlogPost> BlogPosts { get; set; }
    }
  4. 配置数据库连接:在 ‘appsettings.json‘ 文件中配置数据库连接字符串:
    "ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BlogDB;Trusted_Connection=True;MultipleActiveResultSets=true"
    }

  5. 配置启动文件:在 ‘Startup.cs‘ 文件中配置服务:
    public void ConfigureServices(IServiceCollection services)
    {services.AddDbContext<BlogContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));services.AddControllers();
    }

  6. 创建控制器:在 ‘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);}
    }

  7. 运行应用程序:
    dotnet run

        在浏览器中访问 ‘http://localhost:5000/api/blogposts‘,可以看到一个简单的博客系统 API。

总结

        在本节中,我们从桌面应用程序扩展到 Web 开发,学习了 ASP.NET Core 的基础知识和如何创建和配置 Web API。通过开发一个博客系统的项目,我们综合运用了这些知识,展示了如何设计和实现一个实际的 Web 应用程序。继续练习和扩展这些项目,可以帮助您进一步提高 Web 开发技能,为更复杂的项目打下坚实的基础。

下一篇:白骑士的C#教学实战项目篇 4.4 游戏开发​​​​​​​

相关文章:

白骑士的C#教学实战项目篇 4.3 Web开发

系列目录 上一篇&#xff1a;白骑士的C#教学实战项目篇 4.2 图形用户界面&#xff08;GUI&#xff09;应用 在这一部分&#xff0c;我们将从桌面应用程序扩展到 Web 开发。Web 开发是现代软件开发的重要领域&#xff0c;涵盖了从前端用户界面到后端服务器逻辑的完整堆栈。在这…...

【数据分析】(交互) 延迟互信息(熵、概率密度、高斯核、带宽估计)

文章目录 一、互信息基础二、延迟互信息2.1 交互延迟互信息三、时间序列互信息中的概率计算(高斯核密度估计)四、python 示例补充 1:熵熵的定义熵的性质熵的单位和对数底数熵的最大值高熵、低熵的分辨补充 2:概率密度 和 高斯核概率密度高斯核拓展3 :核密度函数带宽估计在…...

html转vue项目

HTML是一种用于构建网页的标记语言&#xff0c;而Vue是一种用于构建用户界面的JavaScript框架。在HTML中使用Vue可以提供更加灵活和动态的用户界面功能。本文将介绍如何将HTML代码转换为Vue&#xff0c;并提供具体的代码示例。 首先&#xff0c;我们需要在项目中引入Vue框架。…...

.NET系列 定时器

net一共&#xff14;种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…...

【Golang】火焰图空白部分是什么?

起因 被同事灵魂拷问&#xff1a;图中这块空白是什么东西&#xff1f; 豆包回答说是数据采样不完整&#xff0c;特定函数或代码段未被调用之类的原因&#xff0c;感觉都不太合理。 之前看过一篇文章说&#xff1a;Heap Profiling的采样是无时无刻不在发生的&#xff0c;执行…...

Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]

Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader] [FromBody][FromQuery][FromRoute] or [FromUri][FromHeader] [FromBody] FromBody 属性在使用 application/json 内容类型并在正文中传递 JSON 时使用通常情况下&#xff0c;FromBody 在一个操作中只…...

Messari 摘要报告:Covalent Network(CXT)2024 Q2 品牌重塑、AI模块化数据、亚太地区扩展、代币回购计划和网络增长

摘要 Covalent Network&#xff08;CXT&#xff09;在将质押从 Moonbeam 迁移到以太坊后&#xff0c;质押的 CQT 百分比恢复到了 20% 以上。 Covalent Network&#xff08;CXT&#xff09;在第二季度新增了五个网络运营商&#xff0c;使 BSP 集增长了 36%&#xff0c;提升了协…...

Open3D 计算点云的面状指数

目录 一、概述 1.1原理 1.2实现步骤 步骤 1&#xff1a;确定邻域点 步骤 2&#xff1a;计算协方差矩阵 步骤 3&#xff1a;特征值分解 步骤 4&#xff1a;计算面状指数 步骤 5&#xff1a;可视化与应用 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)…...

云和集群有什么区别?

我们常说的集群是针对于某项单独的功能或者说是某几个功能的集合体。 举个例子&#xff0c;比方有100台机器组成一个集群&#xff0c;这个集群里面50台机器装了hadoop&#xff0c;10台机器装了spark&#xff0c;剩下40台机器再装一个查询引擎presto。诸如此类&#xff0c;把多…...

无人机视角下的EasyCVR视频汇聚管理:构建全方位、智能化的AI视频监控网络

随着5G、AI、物联网&#xff08;IoT&#xff09;等技术的快速发展&#xff0c;万物互联的时代已经到来&#xff0c;视频技术作为信息传输和交互的重要手段&#xff0c;在多个领域展现出了巨大的应用潜力和价值。其中&#xff0c;EasyCVR视频汇聚平台与无人机结合的AI应用更是为…...

数字影像技术是如何改变我们看待世界的方式呢?

在当今的科技时代&#xff0c;数字影像技术正以惊人的速度改变着我们的生活和视觉体验。那么&#xff0c;什么是数字影像技术呢&#xff1f; 数字影像技术是指通过数字化手段对图像和视频进行获取、处理、存储、传输和展示的一系列技术。 它利用各种数字设备&#xff0c;如数…...

Chainlit实现启动页面选择不同的LLM启动器等设置界面

基本概念&#xff1a;启动选择器&#xff08;Starters&#xff09; 启动选择器&#xff08;Starters&#xff09; 是一种帮助用户开始与您的助手互动的建议。您可以为助手定义最多4个启动建议&#xff0c;并且可以为每个启动建议指定一个图标。 示例代码 (starters.py) impo…...

SQL - 增、改、删

插入 (insert into) 插入单行 insert into 表名 values ( 对应列的值&#xff0c;用,号间隔) //一般主键值用default&#xff0c;不可填null的不要填null insert into 表名 (需要提供值的列名) values (与之对应的提供的值) //其他的值只需mysql默认提供 insert into 表名 子查…...

怎么屏蔽电脑监控软件?企业管理者的智慧选择——精准定位,合理屏蔽,让监控软件成为助力而非障碍!

电脑监控软件在企业管理中扮演着日益重要的角色&#xff0c;它们能够提升工作效率、保障信息安全、预防内部风险。然而&#xff0c;过度或不当使用监控软件也可能引发员工隐私担忧&#xff0c;影响工作积极性和团队氛围。因此&#xff0c;作为企业管理者&#xff0c;如何精准定…...

Linux·权限与工具-make

1. Makefile/makefile工具 首先展示一下&#xff0c;makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件&#xff0c;m大小写均可。我们在文件中写入这样两行 wq保存退出后&#xff0c;我们使用 make 命令 可以看到生成了可执行程序&#xff…...

C++的序列容器——数组

前言&#xff1a; 这篇文章我们就开始新的章节&#xff0c;我们之前说的C/C的缺陷那部分内容就结束了。在开始新的章之前我希望大家可以先对着题目思考一下&#xff0c;C的容器是什么&#xff1f;有什么作用&#xff1f;下面让我们开始新的内容&#xff1a; 目录 前言&#x…...

TCC 和 XA 协议之间的区别?

TCC&#xff08;Two-Phase Commit&#xff09;协议和XA协议都是用于分布式系统中确保事务原子性的协议。它们在实现分布式事务协调方面有一些相似之处&#xff0c;但也存在一些关键的不同点。 协议的协调者&#xff08;Coordinator&#xff09;角色&#xff1a; TCC协议&#x…...

萌啦数据插件使用情况分析,萌啦数据插件下载

在当今数字化时代&#xff0c;数据已成为企业决策与个人分析不可或缺的重要资源。随着数据分析工具的日益丰富&#xff0c;一款高效、易用的数据插件成为了众多用户的心头好。其中&#xff0c;“萌啦数据插件”凭借其独特的优势&#xff0c;在众多竞品中脱颖而出&#xff0c;成…...

C++初学(13)

13.1、for循环的组成部分 for循环的组成部分完成下面这些步骤&#xff1a; (1)设置初始值。 (2)执行测试&#xff0c;看看循环是否应当继续。 (3)执行循环操作。 (4)更新用于测试的值。 C循环设计中包含这要素&#xff0c;很容易识别&#xff0c;初始化、测试和更新操作工…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...