ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统
一、创建项目
本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上。这里以ASP.NET Core WebApi为例进行讲解。首先创建一个ASP.NET Core WebApi项目,使用默认的Values控制器,这里使用Visual Studio 2019创建一个ASP.NET Core 3.1d的WebApi项目。
创建新项目的时候选项ASP.NET Core Web应用程序,如下图所示:

配置新项目界面界面设置项目名称和位置,如下图所示:

选择.Net Core框架下面的ASP.NET Core 3.1,创建一个API项目,不勾选“为HTTPS配置”,如下图所示:

这样就创建好了一个Web Api项目,我们访问项目:

浏览器里面可以正常访问,说明我们创建的项目没有问题,接下来我们就把这个项目部署到windows系统上面。
二、发布项目
我们在上面创建了一个Web Api项目,下面先发布项目。ASP.NET Core项目有两种发布部署模式,下面分分进行讲解。
1、框架依赖
框架依赖(FDD):即Framework-dependent deployments的缩写。这种发布方式依赖于Framework框架,即要部署的服务器上面必须按照ASP.NET Core 运行时环境(ASP.NET Core Runtime)。这种部署方式是微软默认推荐的。下面我们看看如何使用框架依赖进行部署。
我们在项目上面右键选择“发布”:

发布目标选择发布到文件夹,将文件发布到FDD文件夹,然后点击“高级”:

在发布界面,部署模式选择框架依赖,目标运行时选择默认的可移植:

我们看到目标运行时下面有好多选项,这里选择“可移植”,表示编译后的文件可以部署到windows平台、Max平台、Linux平台。如果只想部署到某一个平台,那么可以选择具体的一个平台。比如只想部署到Linux系统的x64架构,那么选择“linux-x64”即可。
最后点击“保存”按钮,然后发布即可:

这样就使用FDD方式发布成功了。我们看看发布后的文件:

可以看到,框架依赖方式发布后的文件很少。
2、独立部署
独立(SCD):即Self-contained deployments的缩写。这种方式表示独立提供运行时环境,即要部署的服务器上面不需要安装ASP.NET Core运行时环境即可部署。由于不需要预先安装运行时环境,所以这种发布方式编译后的文件大小会比框架依赖方式编译后的文件大小大。在发布的时候,部署模式选择独立即可:

这时候目标运行时就没有可移植选项了,由于我们要在windows系统上面部署,所以这里选择win-x64。最后保存发布即可。发布完成以后,我们在看看发布后的文件:

可以看到,发布后的文件很多,这时因为发布的时候有一些程序运行需要使用的dll文件夹会打包进来。
三、部署
1、配置部署环境
我们在上面的步骤中,已经把程序发布到文件夹了,下面进行部署。我们先演示如何使用FCD模式进行部署。FCD模式需要依赖于Framework框架,由于我们只是部署,所以只需要安装ASP.NET Core Runtime即可,不需要安装SDK。我们首先需要在服务器上面安装ASP.NET Core runtime,去微软官网下载相应版本进行安装即可,这里选择ASP.NET Core Runtime 3.1:

这里选择下载Hosting Bundle。因为Hosting Bundle包括了.Net Core运行时和IIS支持。
下载完成以后,双击exe文件即可进行安装:

安装完成以后我们在命令行里面输入下面的命令,检查是否安装成功:
dotnet --info
如下图所示:

可以看到提示我们已经安装了.NET Core runtimes环境,没有安装SDK。
由于我们需要部署到IIS上面,所以安装完以后要重启电脑,或者使用下面的命令行重启IIS服务:
net stop was /y
net start w3svc
如下图所示:

注意:要以管理员身份运行命令行,否则会报拒绝访问的错误
还可以管理服务器里面重启启动IIS,如下图所示:

2、控制台方式部署
我们先使用控制台的方式进行部署。进入发布后的路径,执行下面的命令,以命令行的方式进行启动:
dotnet dll文件名称
如下图所示:

可以看到项目已经启动了,正在监听5000端口,我们在浏览器里面访问下面的url地址:http://localhost:5000/weatherforecast

可以看到能够正常返回信息。
这里测试的时候是在Windows服务器上部署的,如果是在个人电脑上面部署,在浏览器里面浏览的时候会直接在web页面里面显示。
我们是把程序部署到了服务器上面,在服务器上面可以浏览,那么在远程电脑上面能不能浏览呢?我们在远程电脑上面浏览:

可以看到拒绝我们的访问,这是为什么呢?因为监听的IP地址是localhost,如果想要远程电脑可以访问,还需要使用urls参数进行设置:

这里使用了*号,表示任意网址都可以访问,我们再次访问:

这次我们就可以访问了。使用urls参数还可以指定访问的端口号,比如我们想监听8090端口,就可以使用下面的命令:
dotnet AspNetCoreDeployDemo.dll --urls http://*:8090
直接以控制台的方式部署程序,一般适合于我们自己开发调试程序,真实的生产环境中,不建议使用这种方式。这种方式是Kestrel服务器直接处理HTTP请求,在windows系统中,我们一般是把ASP.NET Core 程序部署在IIS上面,IIS作为反向代理服务器使用。下面我们看看如何部署到IIS上。
3、部署到IIS
在传统的.NET Framework中,ASP.NET程序发布到IIS上面,是由IIS的工作进程(w3wp.exe)托管的,在任务管理器中可以找到该进程。在ASP.NET Core程序中不再是由IIS工作进程托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,然后将接收到的请求推送至中间件管道中,处理完请求后在将HTTP响应数据重新回写到IIS中,最终通过IIS转达到不同的客户端。在这过程中,最重要的角色便是AspNetCoreModuleV2(asp.net core 2.0以前版本中是AspNetCoreModuleV2,asp.net core 2.x版本是AspNetCoreModule,从3.0开始又改回了AspNetCoreModuleV2),它是IIS中的一个模块,HTTP请求进入到IIS之后便立即由它转发,并迅速重定向到ASP.NET Core项目中。因为IIS只是作为反向代理负责转发请求,不负责监听HTTP请求端口,所以不需要使用应用程序池来托管我们的代码。
电脑上面安装好了asp.net core 运行时以后,在IIS的模块里面会有AspNetCoreModule:

双击“模块”,查看里面是否有AspNetCoreModule模块:

接下来在IIS里面添加网站,如下图所示:

最后点击“确定”按钮,网站及部署完成。我们在浏览器里面进行浏览:

这样就可以访问了。
在ASP.NET Core 3.x以前版本中,部署完网站之后,我们还需要设置应用程序池,将.NET CLR版本设置为“无托管代码”,在ASP.NET Core 3.x开始的版本中,无需在设置应用程序池,部署完网站之后就可以直接访问了。我们也可以设置应用程序池为“无托管代码”,如下图所示:

4、独立部署
上面的两种部署方式都是基于框架依赖发布后的文件进行部署的,我们在看看如何使用独立部署发布后的文件进行部署,我们看到发布后有一个exe文件:

我们双击该exe文件,会看到直接以控制台的方式启动:

这时可以在浏览器里面进行访问了。这样就可以部署了,真实生产中不建议使用这种方式。
ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统的更多相关文章
- 利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务
背景 2019第一篇文章. 此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只 ...
- .NET Core Generic Host项目使用Topshelf部署为Windows服务
1..NET Core Generic Host是什么? 在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机). 现在在2.1版本的Asp.Net Core中 ...
- 使用NSSM把.Net Core部署至 Windows 服务
为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.net Core就更少了.一般情况下,Asp.net Core会部署 ...
- NSSM把.Net Core部署至 Windows 服务
NSSM把.Net Core部署至 Windows 服务 https://www.cnblogs.com/emrys5/p/nssm-netcore.html 为什么部署至Windows Servic ...
- 零基础程序员入门Linux系统 !如何快速恢复系统?
新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- ASP.NET Core教程:使用Supervisor做ASP.NET Core应用程序守护进程
一.前言 在上一篇文章中,我们讲解了如何在Linux服务器上面部署ASP.NET Core应用程序,并且使用Nginx作为反向代理.我们在Linux服务器上面,是通过ASP.NET Core自宿主的方 ...
- ASP.NET Core教程:ASP.NET Core程序部署到Linux
一.前言 这篇文章我们将讲解如何将ASP.NET Core 程序部署到Linux.这里我们使用的是虚拟机里面安装的Centos7.这里的ASP.NET Core程序,以上篇文章中发布的框架依赖文件为例 ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...
随机推荐
- 从零学习SpringSecurity
一.简介 SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,和spring项目整合更加方便. 二.核心功能 认证(Authentication):指的是验证某个用户能否访 ...
- ADB命令 连接WIFI检测序列号
利用ADB 电脑与手机相连 查看序列号: adb shell getprop ro.serialno 查看机器的SN号 adb shell getprop 查看机器的全部信息参数 查看IP地址: a ...
- python 读取 查询 更新 删除 sql2008 类及应用
import pymssql class MSSQL: def __init__(self,host,user,pwd,db): self.host = host self.user = user s ...
- Windows内核驱动--实现修改线程优先级demo
在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级: Client代码: #include <Windows.h> #include < ...
- 构建高效Presubmit卡点,落地测试左移最佳实践
樊登有一节课讲的挺有意思,说中国有个组织叫绩效改进协会,专门研究用技控代替人控的事情.其用麦当劳来举例子,他说麦当劳其实招人标准很低,高中文凭就可以,但是培养出来的人,三五年之后,每一个都是大家争抢的 ...
- 在Python中执行普通除法
如果希望Python只执行普通的除法,那么可以在程序前加上以下语句: 1 from _future_ import division 如果通过命令行(比如在Linux系统上)运行Python,可以使用 ...
- 构建前端第3篇之---使用scss
张艳涛 写于2021-1-20 主要解决俩个问题: 在单个vue文件中 <style rel="stylesheet/scss" lang="scss"& ...
- 使用C#winform编写渗透测试工具--敏感目录扫描
使用C#winform编写渗透测试工具--敏感目录扫描 由于之前在做渗透测试的时候,发现使用的工具较多,切换起来较麻烦,便萌生了开发一个包含各种渗透测试工具的小程序,包括敏感目录扫描.端口查询.子域名 ...
- K-Fold 交叉验证
转载--原文地址 www.likecs.com 1.K-Fold 交叉验证概念 在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集.测试集是与训练独立的数据,完全不参与训练,用于最终模型的 ...
- 8.7考试总结(NOIP模拟)[Smooth·Six·Walker]
前言 踩了挺多以前没踩过的坑... T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后, 突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍 ...