掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中

目录

程序发布操作

Docker容器注册表

文件夹发布

导入配置文件

网站运行操作

程序发布操作

        当我们想对我们已经写好的后端项目发布到网站的时候,可以直接将项目文件目录中的bin/Debug部署到生产环境的服务器上,但是缺点也很明显需要发布网站提前安装好.net运行时环境并且性能方面也是比较差的,我们创建的做法就是采用自带的发布功能进行操作,以下是对程序进行发布操作的基本流程:

右键我们的项目,点击发布按钮,然后进入到下面的界面,让我们选择用什么样的方式进行发布,如下可以看到.net core给我们提供的方式也是挺多的,每种发布方式注意的点也很多,接下来就着重对某些发布的操作进行讲解吧!

如果真的需要在服务器上面安装配置.net运行时环境,则需要访问 官网 根据需要安装对应的.net的sdk环境,如下所示:

下载完成之后,我们将其安装到服务器当中,然后把要发布到服务器的后端发布文件复制到服务器中然后运行即可,接下来我们介绍一下上面发布时的几种部署方式吧!

Docker容器注册表

Docker:是一种开源的容器化平台允许开发人员将应用程序及其所有依赖项打包到一个标准化的单元中,称为“容器”。这个容器可以在任何地方运行,无论是本地开发环境、测试环境还是生产环境,Docker使得开发和部署应用程序变得更加简单、灵活和可移植,其官网 地址 如下:

在项目中如果我们想使用Docker进行程序发布的话,我们可以右键项目然后点击添加,选择Docker支持,如下所示:

然后我们接下来开始选择容器基础框架的选项操作,如下所示:

1)容器OS:专门为运行容器优化的操作系统,专门为运行容器优化的操作系统
2)容器生成类型:构建容器的方式和方法,选择合适的构建类型能优化镜像大小、构建速度和可维护性
3)容器镜像SKU:容器镜像的不同配置版本,一个镜像可以有多个不同的SKU版本这些版本之间可能包含不同的库、应用或系统设置
4)Docker生成上下文:在构建Docker镜像时所需要的文件、目录及其他资源的集合,上下文中通常包含应用代码、配置文件、依赖文件等

点击确定之后就会在项目中生成一个Dockerfile文件,我们可以根据需要添加如下内容:

# 使用官方的 .NET Core SDK 镜像来构建应用
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app

# 复制 csproj 并还原依赖
COPY *.csproj .
RUN dotnet restore

# 复制所有文件并构建应用
COPY . .
RUN dotnet publish -c Release -o out

# 使用运行时镜像来运行应用
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app/out .

# 设置应用默认端口
ENV ASPNETCORE_URLS=http://+:80
EXPOSE 80

# 启动应用
ENTRYPOINT ["dotnet", "webapi-study.dll"]

当然我们也可以在项目根目录中创建一个.dockerignore 文件以避免将不需要的文件复制到Docker镜像中,可以添加如下内容:

bin/
obj/
*.sln
*.user

然后我们在项目的根目录下,使用以下命令构建Docker镜像,t是指定镜像名,.是表示当前目录也就是Dockerfile文件所在的目录,如果是本地打包直接定位到文件目录,然后输入docker build就可以了:

docker build -t auth .

构建完成后,可以通过以下命令运行Docker容器,此命令会将容器的80端口映射到宿主机的5000端口,现在可以通过访问http://localhost:5000来访问Web API了:

docker run -d -p 5000:80 --restart=always --name mywebapi mywebapi

在运行应用时,如果需要检查容器的状态或停止它,可以通过如下命令进行操作:

# 查看正在运行的容器:
docker ps

停止容器:
# docker stop mywebapi_container

删除容器:
# docker rm mywebapi_container

当然如果我们本地安装了Docker的话,可以通过页面端进行操作:

文件夹发布

这里我们采用发布文件夹的方式进行部署我们的后端应用,点击之后进入如下界面,这里提供了本地和线上两种方式,这里我们就拿本地进行举例吧,这里我将发布的文件放在bin目录下,当然你也可以自定义位置,都是可以的:

进入发布界面,这里我们点击显示所有配置然后进入到如下的详细发布界面,其中有四个发布配置

1)配置:选择发布的环境,这里我们一定要选择Release开发环境

2)目标框架:可以根据需要选择要发布的.net框架的版本

3)部署模式:有两种选择部署模式,如下:

框架依赖:生成的程序集是不包含.net运行时的,需要服务器上预先单独再安装.net运行时

独立:生成的程序集是包含.net运行时的,不需要服务器上预先单独再安装.net运行时

4)目标运行时:当我们部署模式选择框架依赖的时候,是有一个可移植选项的,意味着我们可以发布到任何环境,只要该环境配置了对应的.net运行时;如果我们部署模式选择独立的时候则意味着无需服务器再安装.net运行时,但是却没有了可移植的选择,只能发布选择了特定的环境当中,且发布的时间较长

配置完上面四个主要的配置选项之后,接下来还有两个额外配置,文件发布选项和数据库:

文件发布选项

1)生成单个文件

尝试把尽可能多的发布文件合并到一个文件,对开发客户端比较重要一点

2)启用ReadyToRun编译

主要针对启动性能的优化而对应用运行期间的性能提升影响较小,启用ReadyToRun编译会增加发布包的大小,因为它将机器码直接打包到应用程序中

3)裁剪未使用的代码

尝试把一些用不到的程序集给删掉,因为发布的程序当中是可能有一些程序集是没有用到的,但是程序可能会基于安全考虑给我们也拷进发布程序当中了,如果我们对发布程序的包的大小有要求的话,可以选择勾选

4)在发布前删除所有现有文件

在发布前会把之前发布的程序都删除一遍然后再生成新的文件,避免有一些旧的文件被插入到新的发布版本里面

数据库:让发布工具帮助我们生成和EFCore相关的一些迁移脚本,甚至自动帮助我们完成数据库的迁移,如果我们的代码涉及到EFCore相关的话,该选项会让我们连一下数据库然后它会帮助我们完成数据库的迁移,不过大部分情况下我们是不需要采用这种方式的。

导入配置文件

如果我们想选择导入配置文件进行发布的话,需要我们导入一个配置文件到程序当中,这个配置文件一般,如下所示:

该配置文件一般都是当我们创建好web应用之后,点击保存来保存你的配置文件,通常它会保存在项目文件夹下的Properties/PublishProfiles文件夹中,然后还需要在appsettings.json文件夹下配置对应的命令,在创建web应用的时候都已经给到了,类似下面这种的:

AzureAd: {
   "Instance":httos://login.microsoftonline.com/"
    "TenantId":“44c24123356",
    "ClientId:"2c6ala51-17324f2b2ee09”,
    "ClientSecret": "uWm8Q6yOuJ5ii2347ac7",
    "Scope":"api://2c6ala51-170f2b2ee09",
    "AllowWebApiToBeAuthorizedByACL:true
}

网站运行操作

当我们完成了后端程序的发布之后,后面就需要了解并掌握如何对网站进行持续运行操作相关知识的概念了,这一块说实话我了解的也不是很多,虽然.net core已经内置了Kestrel来来作为独立的Web服务器来进行使用,也就是我们直接双击发布程序的exe文件,但是一般我们也不会让Kestrel直接面对终端用户的请求,配置域名、记录请求日志、url重写等操作皆是由反向代理服务器进行负责的,这里我们可以了解一下多种部署模式:

1)K8S+容器:推荐但是配置难度较高

2)Linux+Nginx

3)云平台

4)Windows+IIS

对于网站运行时的安全提醒的话,这边建议启用https,如果运维人员需要通过远程桌面或者SSH连接到服务器,那么一定要再服务器的防火墙上设置只允许运维人员的IP段访问相关端口,并且需要严格区分开发环境和生产环境,不要随意相信客户端请求,一定要进行数据校验。具体的等我后面也学习了解到了运维等相关方面的知识的话,我在继续讲解吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode配置C/C++开发环境|最新教程202502

📢 ‌Windows版VSCode配置C/C开发环境(单文件多文件全解析)‌ 一、 ‌环境准备‌ ✅‌必需工具‌:Visual Studio Code 2025‌ ✅扩展插件‌:C/C(Microsoft官方扩展)📢 这个必须安…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 文章导读 阿华将发布项目复盘系列的文章,旨在: 1:手把手细致带大家从0到…

cs106x-lecture12(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture12 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) travel Write a recursive function named travel that accepts integers x and y as parameters and uses recursive backtracking to print all solution…

vue取消全选功能按钮注意事项

这里这个功能是通过各种条件查出数据,但只取一条数据进行后续业务,虽然每一条数据前面都有多选框,但只需要选一个,所以在业务上分析可以把这个全选按钮取消掉 这里不是简单的把多选组件的selection-change"handleSelectionChange"和handleSelectionChange方法去掉,因…

三维扫描仪:如何快速获取产品外部结构尺寸?

在精密制造与质量控制领域,传统测量方法因接触式检测效率低、数据维度单一等问题,正面临数字化升级的迫切需求。 传统测量方法的局限性: 传统的测量工具,如卡尺、千分尺和三坐标测量仪,虽然在精度上有一定的保证&…

无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷达:Livox_Mid-360 1、安装激光雷达驱动 下载安装Livox-SDK2 如果git clone不了,在github上下载相应的zip进行手动安装,安装网址如下: https://github.com/L…

ubuntu22.04使用minikube安装k8s

ubuntu使用minikube安装k8s 准备工作安装步骤安装docker安装kubectl安装minikube导入相关镜像安装相关指令启动minikube服务 安装dashboard组件导入相关镜像创建服务账号安装组件本体验证安装结果 准备工作 下载离线安装包,安装包内容如下: 软件说明ki…

西门子1200下载、上传程序。

下载 第一种 直接点击图标下载,此种方式PLC会停机。 第二种 这三种的区别: 上传 创建新的项目。

基于Openlayers对GeoServer发布的数据进行增删改

使用GeoServer进行图斑数据管理 本文将介绍如何使用GeoServer进行图斑数据的新增、删除和修改。我们将通过一个Vue.js应用来演示这些功能。 设置Vue.js应用 首先,我们设置Vue.js应用,并添加必要的组件和交互逻辑。 Check.vue Check.vue文件包含初始…

自动化之ansible(二)

一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

函数执行中的栈和寄存器调用

函数执行中的栈和寄存器调用 函数执行过程中主要用到的寄存器有程序计数器和栈指针。 程序计数器(IP):指向下一条执行指令的地址,其值用%rip来表示 栈指针:指向栈顶地址,其值用%rsp来表示 当过程P调用过…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11

这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…

PHP会务会议系统小程序源码

📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…

Unity通过Vosk实现离线语音识别方法

标注:deepseek直接生成,待验证 在Unity中实现离线语音识别可以通过集成第三方语音识别库来实现。以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。 准备工作 Vosk:一个开源的离线语音识别库&am…

架构学习第七周--Prometheus

目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…

技术总结 | MySQL面试知识点

MySQL面试知识点 1.存储引擎1.1 Archive1.2 BlackHole1.3 MyISAM1.4 InnoDB (重点记一下哦)1.5 Memory1.6 CSV 2. 事务2.1. 什么是事务2.2. 事务的特性2.3. 事务的操作sql2.4. 事务的隔离级别 3.三大日志3.1. undo log 回滚日志3.2. redo log 重做日志3.3. bin log 二进制日志4…