ASP.NET Core 6 基础入门系列(12) 项目的多种启动方式及问题

在 .NET Framework 框架下创建的 ASP.NET Web 项目,启动并访问它只有VS调试与IIS部署承载这两种方式。在 ASP.NET Core Web 项目中提供了多种灵活的调试、启动及访问方式。

启动方式1:项目调试

VS中调试模式直接启动,选择【项目名称】调试方式

此模式下会启动一个控制台应用程序

控制台中显示Web服务器当前正在监听 https://localhost:7086 与 http://localhost:5086 两个地址与端口。

然后自动启动浏览器,访问如下:

此模式启动对应 launchSettings.json 文件中的如下配置信息

问题:ASP.NET Core Web 项目为什么能以控制台的形式运行?

(1)查看项目属性,应用程序 --> 常规 --> 输出类型。ASP.NET Core Web 项目新建时默认输出类型为“控制台应用程序”

(2)查看项目编译目录中的输出内容。ASP.NET Core Web 项目默认被编译为一个以项目名称命名的控制台应用程序

控制台运行的就是该.exe程序文件

启动方式2:IISExpress 调试

VS中调试模式直接启动,选择【IIS Express】调试方式

此模式下会启动 Visual Studio 内置的 IIS Express 工具来运行Web项目

然后自动启动浏览器,访问如下:

此模式启动对应 launchSettings.json 文件中的如下配置信息

启动方式3 脚本启动

(1)打开项目目录 (F:\Person\核心技术\.NET6\DotNet6_Study\DotNet6_Web_Study)

(2)在文件资源管理器地址栏中输入 cmd,回车,自动启动 cmd.exe 程序

(3)输入脚本命令: dotnet run,回车。开始生成项目

(4)生成结束后,在浏览器中输入地址即可访问

关于 dotnet CLI命令,请参考微软官方文档: https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-run

通过命令脚本启动并访问 ASP.NET Core Web 项目,启动了控制台程序,这里涉及到 .NET 跨平台运行的Web服务器问题,Kestrel 服务器

可以参考我的博客

启动方式4 脚本启动

(1)打开项目执行目录 (F:\Person\核心技术\.NET6\DotNet6_Study\DotNet6_Web_Study\bin\Debug\net6.0)

(2)在文件资源管理器地址栏中输入 cmd,回车,自动启动 cmd.exe 程序

(3)输入脚本命令: dotnet  DotNet6_Web_Study.dll  --urls=http://localhost:9007 ,回车

(4)在浏览器中输入步骤3中自定义的url地址 http://localhost:9007 即可访问

虽然能正常访问站点,但是与启动方式1、2、3中的浏览结果对比,发现呈现的样式错乱了。

下面来排查并分析具体原因

(1)F12打开浏览器的“DevTools”工具,切换到“网络”选项卡,发现如下错误记录

css样式文件与js文件均未找到。

(2)点击"/css/site.css",查看该异常记录的详细信息

请求的URL:http://localhost:9007/css/site.css ,服务器响应代码为 404 Not Found。

(3)在浏览器中再次访问 http://localhost:9007/css/site.css ,结果如下,再次确认了站点下确实没有/css/site.css 文件

(4)打开项目执行目录(F:\Person\核心技术\.NET6\DotNet6_Study\DotNet6_Web_Study\bin\Debug\net6.0),全部内容如下

执行目录下确实没有 css、js 相关目录及文件。原因是 ASP.NET Core Web 项目在编译过程中并没有把静态文件复制到执行目录中。

 (5)查看项目结构

 

静态资源都统一存放在wwwroot目录下。

关于ASP.NET Core Web 项目静态资源,请参考我的博客《ASP.NET Core 6 基础入门系列(7) 项目结构详解之wwwroot》

(6)转到项目目录,将  wwwroot 目录及所有子文件手动拷贝到执行目录下

(7)清理浏览器缓存

(8)再次打开项目执行目录 (F:\Person\核心技术\.NET6\DotNet6_Study\DotNet6_Web_Study\bin\Debug\net6.0)

(9)在文件资源管理器地址栏中输入 cmd,回车,自动启动 cmd.exe 程序

(10)输入脚本命令: dotnet  DotNet6_Web_Study.dll  --urls=http://localhost:9007 ,回车

(11)在浏览器中输入自定义的url地址 http://localhost:9007 访问

顶部菜单样式显示正常,底部版权信息的加载位置不正确。

正常访问时的效果如下

(12)再次F12打开浏览器的“DevTools”工具,切换到“网络”选项卡,发现还有一条异常记录

(13)点击 /DotNet6_Web_Study.styles.css 记录查看详细请求与响应信息

请求的URL:http://localhost:9007/DotNet6_Web_Study.styles.css ,服务器响应代码为 404 Not Found。

在浏览器中访问该文件同样是报错未找到该文件

点击“发起程序”列的“索引”链接

转到【源代码】栏目,其中第9行就是对应报错信息

在 wwwroot 目录及子目录中未找到该 DotNet6_Web_Study.styles.css 文件。在VS中使用搜索功能搜索该文件名称,也未找到该文件。奇怪啊o(╥﹏╥)o

根据内容到项目中查找视图文件,最终找到该文件的内容对应了\DotNet6_Study\DotNet6_Web_Study\Views\Shared\_Layout.cshtml 文件

将鼠标放置第9行代码的波浪线上,VS智能提示 wwwroot 目录下不存在 DotNet6_Web_Study.styles.css 文件

展开_Layout.cshtml 文件节点,其包含了一个子节点文件_Layout.cshtml.css

打开该文件,内容如下

如何确定该样式文件就是 

<link rel="stylesheet" href="~/DotNet6_Web_Study.styles.css" asp-append-version="true" />

加载的样式文件呢?

首先文件名称不对应。查看_Layout.cshtml 的文件内容,在第39至43行之间加载的就是底部的版权信息。

其中第39行class中引用了 footer 样式。

再去查看 _Layout.cshtml.css 文件内容,确实包含了 footer 样式

其中第43、44行的样式定义了版权信息内容位于页面的最底部。

该启动与访问方式由于未能正常加载样式文件,所以版权信息内容的显示位置未能正确渲染

 

再次来验证一下上面的分析是正确的:启动方式3中访问页面且渲染正常,https://localhost:7086/。打开F12,在【元素】栏中找到 head 中加载样式的代码行

<link rel="stylesheet" href="/DotNet6_Web_Study.styles.css?v=O4IC-uajZjT823GFW09Q_sNNvPHo6QyBugfRyy62zEc">

鼠标放置在该行上,右键点击【在新标签页中打开】

在浏览器中打开该样式文件,内容如下

仔细对比,发现与项目中的_Layout.cshtml.css 内容一致。

最终确认该文件就是引用的样式文件但是引用的样式文件名称不是 _Layout.cshtml.css该问题是 ASP.NET Core Web 项目模板中定义的项目结构造成的。既然是静态文件,为何不放到 wwwroot 目录下统一管理呢?暂时无解。

使用VS来发布该项目,查看发布后的内容,DotNet6_Web_Study.styles.css 文件确实被复制了一份。也再次验证了上述的问题分析过程是正确的。

针对该方式启动项目并访问时静态文件丢失的问题,暂时还未找到好的解决办法。临时建议不使用该方式启动和访问项目。 

启动方式5

Internet Information Services (IIS) 是一种灵活、安全且可管理的 Web 服务器,用于托管 Web 应用(包括 ASP.NET Core)。

该功能在后续文章中结合项目发布功能一起会做详细的介绍。

具体请参考《使用 IIS 在 Windows 上托管 ASP.NET Core》https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-6.0

其他启动方式

Nginx 与 Apache 是主流常用的反向代理服务器,在Linux服务器上一般使用这两种服务器来托管 ASP.Net Core Web 项目。

具体请参考《ASP.NET Core 中的 Web 服务器实现》https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/?view=aspnetcore-6.0

不同的启动方式对应的服务器

参考文献:

  • 《ASP.NET Core 中的应用启动》https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/startup?view=aspnetcore-6.0
  • 《ASP.NET Core 中的 Web 服务器实现》https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/?view=aspnetcore-6.0
posted @   张传宁  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
页脚 HTML 代码
点击右上角即可分享
微信分享提示