ASP.NET Web应用程序升级最新的MSBuild格式后,Visual Studio 2022中如何调试?

摘要

把ASP.NET的Web应用程序,Project文件从

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

改为

<Project Sdk="Microsoft.NET.Sdk.Web">

之后,升级成了最新的格式之后,如何在Visual Studio中调试.aspx页面,成了头疼的问题。本文详细描述了升级项目文件之后,在Visual Studio 2022中如何调试ASP.NET Web应用程序。

为什么要升级项目文件的格式?

  • 使用NuGet包的时候更清晰、优雅
    主要为了把packages.config升级到PackageReference,前者当你引用一个包的时候,会自动添加一堆相关的包,后者就是极其优雅;
  • 使用最新的MSBuild技术,.csproj文件更清晰、简洁、易读。

1、在.csproj文件末尾追加复制任务

    ………省略………<Target Name="MoveBinContentToRoot" Condition="'$(Configuration)' == 'Debug'" AfterTargets="AfterBuild"><ItemGroup><ResourceFiles Include="$(OutputPath)*.*" /></ItemGroup><!-- 执行复制操作 --><Copy SourceFiles="@(ResourceFiles)" DestinationFolder="X:\loda\GxHub\ordercenter\GX订单后台\GxHub.PurchaseOrders.Web\bin\" /><Exec Command="rmdir /S /Q $(OutputPath)" /></Target></Project>

MSBuild在生成之后执行上述Target,做两个动作:

  • 把所有的dll从bin\Debug\net481拷贝到bin目录;
  • 在bin\Debug\net481下递归删除所有文件及子目录。

1)为什么有这个步骤?

因为在Visual Studio 2022里生成解决方案或Web应用程序之后,在bin目录下会有roslyn文件夹:

img

但是Web应用程序的dll,生成之后,总是放在bin\Debug\net481这么深的目录下:

img

2)我们有两种选择把Web应用程序跑起来:

  • 以bin\Debug\net481为网站根目录
    把roslyn文件夹,从bin拷贝到bin\Debug\net481,在.csproj中设置所有的.aspx和.ascx等文件都拷贝到输出目录。实践证明这个方式行不通,会报如下大黄页面:

img

  • 以.csproj所在目录为网站根目录
    只需要把bin\Debug\net481下的dll,复制到bin目录即可。所以我们在.csproj文件末尾,定义了一个复制任务,把dll文件从bin\Debug\net481拷贝到了bin目录下。这是最优雅的复制方式。
    实践证明这个方式可行,这样就准备好进行下一步。
    还有一个额外的设置:
    <ItemGroup><Content Include="Global.asax"><CopyToPublishDirectory>Always</CopyToPublishDirectory></Content><!-- 包含子目录下的特定类型文件 --><Content Include="**\*.aspx;**\*.ascx;**\*.master;**\*.png;**\*.gif;**\*.js;**\*.jpg;**\*.css;**\*.ico"><CopyToPublishDirectory>Always</CopyToPublishDirectory></Content><!-- 特殊处理,如果需要 --><!-- 注意:确保构建系统支持双星号(**)作为递归通配符 --></ItemGroup>

上述设置和前文有所不同,复制这堆内容文件只有Publish网站的时候才做。因此我们平时在Visual Studio 2022中“生成”的时候,就不会把.aspx等各种内容再拷贝到bin\Debug\net481了。而Gitlab Runner在服务器上打包网站,是用的Publish,所以输出目录上会包含上述定义的内容文件。

2、把.csproj文件所在的目录设置为网站根目录

这里有两种做法:

1)在IIS Express配置文件中设置网站

IIS Express的配置,是放在“我的文档”下边

img
打开applicationhost.config,找到如下节点就是设置网站的:

<sites><site name="WebSite1" id="1" serverAutoStart="true"><application path="/"><virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" /></application><bindings><binding protocol="http" bindingInformation=":8080:localhost" /></bindings></site><site name="Web" id="2"><application path="/" applicationPool="Clr4IntegratedAppPool"><virtualDirectory path="/" physicalPath="X:\loda\GxHub\ordercenter\GX订单后台\GxHub.PurchaseOrders.Web" /></application><bindings><binding protocol="http" bindingInformation="*:8002:localhost" /><binding protocol="https" bindingInformation="*:44301:localhost" /></bindings></site><siteDefaults><!-- To enable logging, please change the below attribute "enabled" to "true" --><logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="true"/><traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="true" maxLogFileSizeKB="1024" /></siteDefaults><applicationDefaults applicationPool="Clr4IntegratedAppPool" /><virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

上述配置中,采购订单的Web程序启动后,监听http协议的8002端口和https协议的44301端口,而且都只能以localhost访问。
上述配置中,应用程序池applicationPool的值,是出现在这个配置文件的前边节点:

<system.applicationHost><applicationPools><add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" /><add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" /><add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" /><add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" /><add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" /><applicationPoolDefaults managedRuntimeVersion="v4.0"><processModel loadUserProfile="true" setProfileEnvironment="false" /></applicationPoolDefaults></applicationPools>

有了上述配置,再要启动IIS Express的时候,在命令行中执行:

.\iisexpress /site:Web

site参数后,就是上述配置中site的name属性。
这里有两个知识点:

  • 如果SSL证书失效了、麻烦了,用下边的命令重新生成SSL证书:
IisExpressAdminCmd.exe setupsslUrl -url:https://localhost:44301/ -UseSelfSigned

注意,上边的命令必须是管理员权限运行。

  • SSL的端口范围必须是44301到44398之间
  • 为什么要用SSL端口?
    因为你的Chrome等浏览器可能非要求网站是https不可。否则就用http在本地调试,省去SSL的烦恼。

2)在任意位置用命令行启动IIS Express网站

推荐做法,还是在项目根目录放一个start.bat,内容如下

@echo off
chcp 65001
echoiisexpress /path:X:\loda\GxHub\ordercenter\GX订单后台\GxHub.PurchaseOrders.Web /port:8002ECHO.
ECHO.BIN and OBJ folders have been successfully deleted. Press any key to exit.
pause > nul

3、web.config中需要有针对IIS Express的设置

	<system.webServer><validation validateIntegratedModeConfiguration="false" /><modules runAllManagedModulesForAllRequests="true"></modules><handlers></handlers></system.webServer>

其实主要就是启用所有的托管模块.

4、访问某个.aspx页面

img

5、附加到进程

img

img

6、设置断点

img

弄熟了一点都不麻烦.每次修改代码了,记得重新生成一遍Web项目就好.IIS Express网站启动一次以后,就不用管了.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI带你玩转音乐,使你成为真正音乐人(AI歌曲制作)

利用AI工具快速完成一首歌: 歌由词和曲组成。 词可以利用文心一言 输入:写一首赞扬国家繁华发展的歌词 这样一首歌的词部分已经出来。 曲部分: 利用https://suno.com/create生成: 拷贝文心一言生成的词 选择定制模式Custom Mode有更多的风格可以制作点击生成就可以完成曲制…

零基础写框架(2):故障排查和日志基础

关于从零设计 .NET 开发框架 作者:痴者工良 教程说明: 仓库地址:https://github.com/whuanle/maomi 文档地址:https://maomi.whuanle.cn 作者博客: https://www.whuanle.cn https://www.cnblogs.com/whuanle 故障排查和日志 .NET 程序进行故障排查的方式有很多,笔者个人总…

使用Visual Studio分析.NET Dump

前言 内存泄漏和高CPU使用率是在日常开发中经常遇到的问题,它们可能会导致应用程序性能下降甚至崩溃。今天我们来讲讲如何使用Visual Studio 2022分析.NET Dump,快速找到程序内存泄漏问题。 什么是Dump文件? Dump文件又叫内存转储文件或者叫内存快照文件。用于存储程序运行时…

springboot模块化开发项目搭建

1.New一个Project,命名,Next,Finish 2.根据需要修改Maven配置 3.初始化后,删除无用文件4.选中项目创建Module,命名,Next,一般模块包括common、dao、service、web、entrance(入口文件),也可以增加订单、会员等各种业务模块,各模块之间依赖引用即可5.删除无用文件,删…

组合数学中的食用工具

背景: 教授在打概率和期望中的《灯蹬登》,需要推式子。众所周知,一个正确的式子不光要可以解释已有的数据,还要能预测未知数据的结果。在这样的情况下,组合数学的工具是必不可少的。我们通过这个工具实现了三种计算器无法直接实现的功能:输入\(A,m,n\),表示求\(A^m_n\)的…

读AI未来进行式笔记03自然语言处理技术

自然语言处理1. AI伙伴 1.1. 作为AI能力的集大成者,AI伙伴融合了各种复杂的AI技术 1.2. 人类唯一可能超越AI的领域,只可能在机器无法触及之处,那是属于人类感性与直觉的领域 1.3. 要读懂人类,需要漫长而平缓的学习过程 1.4. AI塑造了我们,我们反过来也塑造了AI 1.5. AI的“…

PyQT5之单行文本输入到多行显示窗

from PyQt5 import QtWidgets from PyQt5 import QtCore, QtGui import sys import cv2class TextDemoPanel(QtWidgets.QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)select_btn = QtWidgets.QPushButton("输入")self.line_text …

ipsec-vpen核心demo

撸起袖子加油干!!!

什么是Transform转换

在WPF框架中有一个抽象类叫Transform,它定义了实现二维平面中的转换的功能。它包括旋转 (RotateTransform)、缩放 (ScaleTransform)、倾斜 (SkewTransform) 和平移 (TranslateTransform)4个子类。它定义如何将点从一个坐标空间映射或转换到另一个坐标空间。 此映射由转换 Matr…

Kubernetes – NodePort 服务

Kubernetes 中的 NodePort 服务是一种用于将应用程序公开到互联网的服务,最终用户可以从互联网访问它。如果您创建 NodePort 服务,Kubernetes 将分配 (30000-32767) 范围内的端口。最终用户可以使用节点的 IP 地址访问该应用程序。 Kubernetes 服务的类型 在Kubernetes 中,有…

造车新势力盘点

造车新势力盘点 雷军大声疾呼:“大家不要在小问题上卷了,没有价值!” 余承东表态:“要卷价值而不是卷价格!卷智能化、自动化,卷安全、高质量,卷卓越的、舒享的用户体验。” 6月1日,在第二届未来汽车先行者大会上,雷军、余承东等车企负责人发表了“反内卷”宣言。 确实…