Backend - C# asp .net core

目录

一、各大框架理解

[(一)ASP.NET Core](#(一)ASP.NET Core)

[(二)ASP.NET Core Web Application](#(二)ASP.NET Core Web Application)

[(三)ASP.NET Core MVC](#(三)ASP.NET Core MVC)

[(四)ASP.NET Core Web API](#(四)ASP.NET Core Web API)

[(五)ASP.NET Core 和 EF Core 的关系](#(五)ASP.NET Core 和 EF Core 的关系)

二、前后端分离架构

[(一) ASP.NET Core Web MVC 应用程式(前+后台)](#(一) ASP.NET Core Web MVC 应用程式(前+后台))

[1. 文件创建](#1. 文件创建)

[2. 文件目录](#2. 文件目录)

[3. MVC 知识点](#3. MVC 知识点)

[(二)ASP.NET Core Web API(纯后台)](#(二)ASP.NET Core Web API(纯后台))

[1. 文件创建](#1. 文件创建)

[2. 文件目录](#2. 文件目录)

[3. API 知识点](#3. API 知识点)

[三、.net core 知识点](#三、.net core 知识点)

(一)自定义命名空间

(二)项目文件

[1. 项目文件的打开方式](#1. 项目文件的打开方式)

[2. 项目文件的后缀是.csproj](#2. 项目文件的后缀是.csproj)

[3. 项目文件的内容](#3. 项目文件的内容)

[(1)< PropertyGroup >标签中](#(1)< PropertyGroup >标签中)

标签:

标签:

例如:

(2)标签中

标签:

例如:

[(三)中间件 Middleware](#(三)中间件 Middleware)

[1. 常见中间件](#1. 常见中间件)

[2. 特点](#2. 特点)

[3. programs.cs文件中处理请求的中间件](#3. programs.cs文件中处理请求的中间件)

[(1)app.Use() 中间件 & 搭配 next() :](#(1)app.Use() 中间件 & 搭配 next() :)

[(2)app.Run() 中间件:](#(2)app.Run() 中间件:)

(3)注意:

[4. 中间件执行顺序(举例)](#4. 中间件执行顺序(举例))

(四)launchSettings.json文件

[1. 作用](#1. 作用)

[2. 位置](#2. 位置)

[3. 注意](#3. 注意)

(五)appsettings.json文件

[1. 作用](#1. 作用)

[2. 获取方式](#2. 获取方式)

[3. 知识点](#3. 知识点)

(1)appsettings..json

(2)优先级

[4. 举例](#4. 举例)

(六)Programs.cs文件

[1. 作用](#1. 作用)

[2. 内容](#2. 内容)

(七)静态文件

[1. 存放在wwwroot目录中](#1. 存放在wwwroot目录中)

[2. wwwroot文件夹的作用](#2. wwwroot文件夹的作用)

[3. 浏览器可访问wwwroot目录](#3. 浏览器可访问wwwroot目录)

[4. 设置默认首页(用default.html文件):](#4. 设置默认首页(用default.html文件):)

[5. 设置默认首页(用自定义的文件)](#5. 设置默认首页(用自定义的文件))

[6. 使用UseFileServer(不推荐)](#6. 使用UseFileServer(不推荐))

(八)命令行启动项目(cmd)

[1. 作用](#1. 作用)

[2. 启动](#2. 启动)

[3. 命令行中输入命令](#3. 命令行中输入命令)

(九)获取环境信息

(十)依赖注入的特点

[1. 低耦合](#1. 低耦合)

[2. 提高测试效率](#2. 提高测试效率)

(十一)代码模拟数据库的注意事项

[1. 注册单例服务](#1. 注册单例服务)

[2. AddSingleton](#2. AddSingleton)

[3. AddScoped](#3. AddScoped)

(十二)包管理工具LibMan

[1. 作用](#1. 作用)

[2. 前提](#2. 前提)

[3. 安装](#3. 安装)

[4. 使用](#4. 使用)

(十三)拦截处理异常

[1. 处理404异常](#1. 处理404异常)

(1)异常:通过参数找不到指定的信息

(2)异常:请求的url和页面路由不匹配

[2. 全局异常处理](#2. 全局异常处理)

[(十四)Razor Page](#(十四)Razor Page)

[1. @page](#1. @page)

[2. @model](#2. @model)

(1)test.cshtml

(2)test.cshtml.cs


一、各大框架理解

(一)ASP.NET Core

是基于 ASP.NET 的升级版,是开发框架。

用于构建web应用程序,可跨平台(.NET Framework是Windows,.NET Core 是包括Windows和Mac)。

(二)ASP.NET Core Web Application

是基于 ASP.NET Core 框架的 Web 应用。

包括 MVC 应用、Web API、Razor 页面应用等。

(三)ASP.NET Core MVC

是基于 MVC (Model-View-Controller)架构的 Web 应用框架。

基于模型-视图-控制器的设计模式,适合构建传统的动态网站或 Web 应用,将应用程序分解为三个主要组件:模型(Model),视图(View)和控制器(Controller)。

模型负责处理数据逻辑和数据库操作,视图负责呈现用户界面,控制器负责处理用户请求和协调模型和视图之间的数据传输。

(四)ASP.NET Core Web API

是用于构建 RESTful API,主要提供数据接口,不包含 UI。

(五)ASP.NET Core 和 EF Core 的关系

ASP.NET Core 是用于构建 Web 应用、API 和服务的框架,处理 HTTP 请求、定义路由、控制器、视图渲染等功能。

EF Core 是一个轻量级的 ORM(对象关系映射)框架,用于访问数据库并将数据转换为 C# 对象。简化与数据库的交互(支持LINQ查询语法),通过对象而非 SQL 语句来进行数据存储、查询和更新等操作。

例如,在一个 ASP.NET Core MVC 或 Web API 应用中,EF Core 用于在数据库中存取数据,而 ASP.NET Core 用于处理用户请求、渲染视图或者返回 JSON 数据。

二、前后端分离架构

前端和后端分离(web应用程式和API)。

(一) ASP.NET Core Web MVC 应用程式(前+后台)

1. 文件创建

2. 文件目录

3. MVC 知识点

可参考另一篇文章:Backend - C# asp .net core MVC_c# .cshtml-CSDN博客

(二)ASP.NET Core Web API(纯后台)

可搭配swagger。

1. 文件创建

2. 文件目录

3. API 知识点

可参考另一篇文章:Backend - C# asp .net core API(使用swagger)_c# useswagger-CSDN博客

三、.net core 知识点

(一)自定义命名空间

一般用项目工程名+所在目录名

(二)项目文件

1. 项目文件的打开方式

点击项目"专案"名(是单个"专案"名,而不是整个"方案"名),即可看到该文件的内容。

2. 项目文件的后缀是.csproj

3. 项目文件的内容

(1)< PropertyGroup >标签中
<TargetFramework>标签:

指定目标框架。

<AspNetCoreHostingModel>标签:

默认采用outofprocess托管(web请求转发到后端的asp.net core中,整个应用程序运行在asp.net core内置的跨平台服务器kestrel中)。

其中,InProcess和OutOfProcess:

Inprocess只有一个服务器(要么是IIS,要么是Kestrel)。

Outofprocess有两个服务器(内部是.net core内置服务器即Kestrel,外部是代理服务器如IIS或Nginx等。作用是Internet <==http请求==> 外部服务器 <==http请求==> 内部服务器)。

例如:
cs 复制代码
<PropertyGroup>
    <TargetFramework>net8.0</TargetFramework> <!--框架 -->
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> <!-- 配置为 InProcess 模式 -->
</PropertyGroup>
(2)<ItemGroup>标签中
<PackageReference>标签:

引用NuGet包。

例如:
cs 复制代码
<ItemGroup> 
    <PackageReference Include="NLog.Web.AspNetCore" Version="5.3.15" />
</ItemGroup>

(三)中间件 Middleware

1. 常见中间件

Logging日志中间件、StaticFiles中间件、MVC中间件

2. 特点

可同时被访问和请求、多个中间件是按照添加的顺序执行的。

3. programs.cs文件中处理请求的中间件

(1)app.Use() 中间件 & 搭配 next() :

继续传递控制给下一个中间件或路由。

(2)app.Run() 中间件:

一般用于处理最终的响应,它应该放在管道的最后。

(3)注意:

Run()会使管道短路,不会再执行其他中间件。

即,所有的中间件应该放在 app.Run() 前面执行。

4. 中间件执行顺序(举例)

cs 复制代码
// Programs.cs文件
using System;
 
var builder = WebApplication.CreateBuilder(args);
 
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
 
var app = builder.Build();
 
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
 
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
 
// 获取日志记录器
var logger = app.Services.GetRequiredService<ILogger<Program>>(); 

// 自定义中间件1
app.Use(async (context, next) =>
{
    logger.LogInformation("First processing request for: {Url} ----Start", context.Request.Path); // 记录日志
    await next(); // 必须调用 next() 让管道继续执行
    logger.LogInformation("First processing request for: {Url} ----End", context.Request.Path); // 记录日志
});
 
// 自定义中间件2
app.Use(async (context, next) =>
{
    logger.LogInformation("Second processing request for: {Url} ----Start", context.Request.Path); // 记录日志
    await next(); // 必须调用 next() 让管道继续执行
logger.LogInformation("Second processing request for: {Url} ----End", context.Request.Path); // 记录日志
});
 
// 自定义中间件3 (另一个路由)
app.MapGet("/anotherUrl", () =>
{
    logger.LogInformation("Final processing request ----End"); // 记录日志
    return "Hello, World!";
});
 
// 终端中间件4
app.Run();
 
// 最终输出台中的结果显示为:
// First processing request for: / anotherUrl----Start
// Second processing request for: / anotherUrl----Start
// Final processing request----End
// Second processing request for: / anotherUrl----End
// First processing request for: / anotherUrl----End

(四)launchSettings.json文件

1. 作用

设置专案启动。

2. 位置

在Properties目录中。

3. 注意

若在launchSettings.json文件中配置一些信息,是在"environmentVariables"里面,且"ASPNETCORE_ENVIRONMENT"后面进行设置。

例如:

cs 复制代码
"environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "Lytest": "This is a test data!!!" // 配置Lytest变量数据
}

(五)appsettings.json文件

1. 作用

配置环境(如数据库信息等)。

2. 获取方式

若其他cs文件想获取该文件设定的数据内容,需要:

先导入Configuration(即,using Microsoft.Extensions.Configuration;),

再注入依赖(在构造函数中声明),然后使用字典取值的方式获取值。

3. 知识点

(1)appsettings.<environment>.json

appsettings.json目录下还有一个appsettings.Development.json,appsettings.Development.json 优先级更高。

(2)优先级

命令行参数 > 环境变量launchSettings.json > 用户机密 > 托管环境appsettings.Development.json > appsettings.json。

4. 举例

cs 复制代码
// appsettings.json 文件
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
 
  "Lytest": "This is a test data!!!",  // 测试获取该文件的配置信息
  "Lytest2": { "test1": { "test2": "This is a test2 data!!!" } }
}
 
// WeatherForecast.cs 文件
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration; // 导入Configuration
using System.Linq;
 
namespace ASPNetAPI.Controllers
{
    [ApiController]
    [Route("[controller]")] 
    public class WeatherForecastController : ControllerBase
    {
        private readonly IConfiguration _configuration;
 
        public WeatherForecastController(IConfiguration configuration)
        {
            _configuration = configuration; // 注入Configuration依赖
        }
 
        [HttpGet] 
        // [HttpGet(Name = "GetWeatherForecast")] // 作用是需要先经过Url.Link() 或 Url.Action() 这类方法来根据路由名称生成 URL,然后测试路由是:https://localhost:44372/WeatherForecast
        public String Get()
        {
            // 获取配置信息
            var testmsg1 =_configuration["Lytest"]); // 获取值
            var testmsg2 = _configuration.GetValue<string>("Lytest2:test1:test2"); // 针对多重字典
            return testmsg2; 
        }
    }
}

(六)Programs.cs文件

1. 作用

配置和启动应用程序,程式进入点。

2. 内容

针对net5,还搭配了Startup.cs。

作用是中间件,配置服务。主要存放startup和configuration代码,载动页面前启动服务。

(七)静态文件

1. 存放在wwwroot目录中

读作w3root、webroot。

wwwroot文件夹默认是没有的,需要自己手动创建。

2. wwwroot文件夹的作用

存放静态文件(如html、css、js、images等文件)。

该文件夹的内容会放在服务器上,客户端只能访问该文件夹。

3. 浏览器可访问wwwroot目录

浏览器可访问wwwroot目录下的静态文件,如wwwroot/images目录下的某png。

首先,需要在program.cs文件配置:

在var app = builder.Build();后面配置 app.UseStaticFiles(); // 启用静态文件中间件

然后,浏览器访问:

用IP+端口+wwwroot里的目录+文件,如:https://localhost:44372/images/dog.png

4. 设置默认首页(用default.html文件):

首先,在app.UseStaticFiles();的前面配置app.UseDefaultFiles();

其中,UseDefaultFiles的代码位置一定是放在UseStaticFiles前面。

代码写法如:

cs 复制代码
var app = builder.Build();
app.UseDefaultFiles(); // 启用默认文件中间件
app.UseStaticFiles();  // 允许访问 wwwroot 中的静态文件

然后,在wwwroot中建立default.html文件。(默认文件固定有default.html、index.html,但default.html显示优先级高于index.html)

然后,在浏览器中访问:用IP+端口,如https://localhost:44372/

5. 设置默认首页(用自定义的文件)

首先,代码写法如下:

cs 复制代码
var app = builder.Build();
DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("testhtmlpage.html");
app.UseDefaultFiles(defaultFilesOptions); // 启用自定义默认文件中间件
app.UseStaticFiles();  // 允许访问 wwwroot 中的静态文件

然后,在wwwroot中建立testhtmlpage.html文件。

再在浏览器访问:用IP+端口,如https://localhost:44372/

6. 使用UseFileServer(不推荐)

该方法包括上述的UseDefaultFiles、UseStaticFiles、以及UseDirectoryBrowser方法。

不推荐使用该方法的原因:有一个UseDirectoryBrowser方法,会暴露文件根目录到外网。因为UseDirectoryBrowser方法允许用户访问某个目录,并查看该目录下的子目录列表和所有文件,所以,不推荐在生产环境中使用。(一般用于测试和开发环境)

代码写法如:

cs 复制代码
var app = builder.Build();
FileServerOptions fileServerOptions = new FileServerOptions();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Clear();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Add("testhtmlpage.html");
app.UseFileServer(fileServerOptions);

(八)命令行启动项目(cmd)

1. 作用

可查看运行的异常详情。

2. 启动

在文件管理器中,找到项目专案位置,然后在项目专案所在路径中,输入cmd,打开命令行。

3. 命令行中输入命令

bash 复制代码
dotnet run

# 举例(ASPNetAPI是专案名,命名行中输入命令):
E:\CSharpPro\test\ASPNetAPI>  dotnet run

(九)获取环境信息

代码如下:

cs 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
Console.WriteLine("环境"+app.Environment.EnvironmentName);
app.Run();

(十)依赖注入的特点

1. 低耦合

2. 提高测试效率

(十一)代码模拟数据库的注意事项

1. 注册单例服务

在用代码模拟数据库时,若新增一笔数据,并将该数据呈现到页面上,需注册单例服务。

即,在服务注册到依赖注入容器时,使用AddSingleton而不是AddScoped。

例如:

cs 复制代码
builder.Services.AddSingleton<IMusicRepository, MockMusicRepository>();

2. AddSingleton

首次请求时会创建Singleton服务实例,后续所有该请求都会使用该实例。

特点:针对整个应用程序生命周期,都会使用该单个实例(仅实例化一次)。

3. AddScoped

每次请求都会创建新的Scoped服务实例(每次请求都要实例化)。

同个请求复用,跨请求则不共享。

(十二)包管理工具LibMan

1. 作用

客户端库管理工具(轻量级)。例如管理boostrap库。

2. 前提

visual studio 2017版本15.8版本及以上。

3. 安装

右击wwwroot文件夹 > 添加 > 客户端库>提供者选择cdnjs > 程式库输入twitter-bootstrap(会默认给出版本号) > 勾选包含所有程式库档案 > 目标位置输入"wwwroot/lib/twitter-bootstrap/"中(新增一个lib文件夹来放置twitter-bootstrap库) > 点击安装(可在控制台"输出"中选择输出来源为"程式库管理员",就可以查看安装进度。若想返回查看运行信息,则选择"帧错") > 安装完成后,会在wwwroot中生成/lib/twitter-bootstrap目录,并且专案根目录会自动生成一个libman.json文件。

4. 使用

打开libman.json文件进行设定,设定好后保存会自动下载相应的库。

其中,libman.json文件是一个库管理器的清单文件。

内容如下:

javascript 复制代码
{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "library": "twitter-bootstrap@5.3.3",
      "destination": "wwwroot/lib/twitter-bootstrap/"
    },
    //{
    //  "library": "jquery@3.6.0",
    //  "destination": "wwwroot/lib/jquery/"
    //},
    //{
    //  "provider": "unpkg",
    //  "library": "abp-web-resources@6.0.1",
    //  "destination": "wwwroot/lib/"
    //},
  ]
}

(十三)拦截处理异常

1. 处理404异常

常见的有两种:

(1)异常:通过参数找不到指定的信息

处理方式如下代码:

cs 复制代码
public ViewResult ShowOneSong(int? id) 
{
    Music musicmodel = _musicRepository.GetSong(id ?? 1);
    if (musicmodel==null) // 直接在执行方法中处理异常
    {
        Response.StatusCode = 404; 
        return View("MusicNotFond", id); // 返回到一个自定义的异常显示界面
    }
    return View(musicmodel);
}
(2)异常:请求的url和页面路由不匹配

处理方式如下代码:

cs 复制代码
// programs.cs文件中
if (app.Environment.IsDevelopment())
{
	app.UseDeveloperExceptionPage(); // 开发环境下,呈现未处理的异常
}
else
{
    //app.UseStatusCodePages(); // 第一种 不推荐!不方便处理
    //app.UseStatusCodePagesWithRedirects("/Error/{0}"); // 第二种  不推荐!会拦截错误路由,重新定义一个路由(请求code也会变成200,但实际应该是错误路由且code是404)
    app.UseStatusCodePagesWithReExecute("/Error/{0}"); // 第三种 推荐!!会保留原有错误路由(其中的Error是自定义的Controller视图名)
}


//ErrorController.cs文件中
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
namespace ASPNetAPI.Controllers
{
	public class ErrorController: Controller
	{
		[Route("Error/{statusCode}")] // statusCode是http请求中的
		public IActionResult HttpStatusCodeHandler(int statuscode)
		{
			var statusCodeRes = HttpContext.Features.Get<IStatusCodeReExecuteFeature>(); // 获取statuscode结果
			switch (statuscode)
			{
				case 404:
					ViewBag.ErrorMsg = $"访问的页面不存在!{statuscode}";
					// statusCodeRes比较有用的两个变量是OriginalPath、OriginalQueryString
					ViewBag.ErrorPath = statusCodeRes.OriginalPath;  // 查看路由
					ViewBag.ErrorQueryStr = statusCodeRes.OriginalQueryString; // 查看路由带的Querystring
					break;
			}
			return View("NotFond");
		}
	}
}

2. 全局异常处理

cs 复制代码
// programs.cs文件中
if (app.Environment.IsDevelopment())
{
	app.UseDeveloperExceptionPage(); // 开发环境下,呈现未处理的异常
}
else
{
       app.UseExceptionHandler("/Error"); // 拦截异常(全局异常处理)。一定要有斜杠/。
       app.UseStatusCodePagesWithReExecute("/Error/{0}"); // 拦截404找不到页面的异常信息。
}


// ErrorController.cs文件中
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;

namespace ASPNetAPI.Controllers
{
	public class ErrorController: Controller
	{
		[Route("Error/{statusCode}")] // statusCode是http请求的
	           public IActionResult HttpStatusCodeHandler(int statuscode)
		{
			var statusCodeRes = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
			switch (statuscode)
			{
				case 404:
					ViewBag.ErrorMsg = $"访问的页面不存在!{statuscode}";
					ViewBag.ErrorPath = statusCodeRes.OriginalPath;
					ViewBag.ErrorQueryStr = statusCodeRes.OriginalQueryString;
					break;
			}
			return View("NotFond");
		}

		[AllowAnonymous]
	          [Route("Error")] 
		public IActionResult Error()  // 全局异常处理
		{
			var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
			ViewBag.ExceptionPath = exceptionHandlerPathFeature.Path; // 异常路径
			ViewBag.ExceptionMessage = exceptionHandlerPathFeature.Error.Message; // 异常内容
			ViewBag.ExceptionStackTrace = exceptionHandlerPathFeature.Error.StackTrace; // 异常堆栈跟踪
		            return View("Error");
		}
	}
}

(十四)Razor Page

1. @page

声明一个Page页面。

设置相对路径,不要设为绝对路径。

若@page后为空,则未设置路由,走默认路由,也就是https://XXXX.XXX。若在@page后面匹配路由,如@page "/my_router/2",则访问该页面时用https://XXXX.XXX/my_router/2。

2. @model

设置连接ViewModel数据类(一般对应在cshtml下面的cs文件中)

例如:

(1)test.cshtml
html 复制代码
@model
@page
@model testpro1.Pages.IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
(2)test.cshtml.cs
cs 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace testpro1.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;

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

        public void OnGet()
        {

        }
    }
}
相关推荐
Libby博仙14 分钟前
.net core 为什么使用 null!
javascript·c#·asp.net·.netcore
码农君莫笑1 小时前
Blazor用户身份验证状态详解
服务器·前端·microsoft·c#·asp.net
Archy_Wang_13 小时前
ASP.NET Core 实现微服务 -- Polly 服务降级熔断
后端·微服务·asp.net
Damon小智6 小时前
C#进阶-在Ubuntu上部署ASP.NET Core Web API应用
linux·nginx·c#·asp.net·.net·.net core
csdn_aspnet6 小时前
C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件
c#·excel·.netcore
小禾家的6 小时前
asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?
后端·asp.net
Libby博仙6 小时前
asp.net core mvc中的模板页(父页面,布局页)和部分视图(Partial View)
后端·asp.net·mvc
小兜全糖(xdqt)6 小时前
Meilisearch ASP.Net Core API 功能demo
asp.net
时光追逐者21 小时前
精选2款.NET开源的博客系统
开源·c#·.net·.netcore·微软技术