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

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

时间:2024-06-05 09:14:40浏览次数:13  
标签:bin Web ASP 文件 应用程序 Debug Visual net481

摘要

把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>

上述设置和前文有所不同,CopyToOutputDirectory会在每次“生成”都复制内容文件。CopyToPublishDirectory只有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
echo

iisexpress /path:X:\loda\GxHub\ordercenter\GX订单后台\GxHub.PurchaseOrders.Web /port:8002

ECHO.
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网站启动一次以后,就不用管了.

标签:bin,Web,ASP,文件,应用程序,Debug,Visual,net481
From: https://www.cnblogs.com/amisoft/p/18232183/how-to-debug-aspnet-web-with-newest-msbuild-for

相关文章

  • ASP.NET Web应用程序升级最新的MSBuild格式后,Visual Studio 2022中如何调试?
    摘要把ASP.NET的Web应用程序,Project文件从<ProjectToolsVersion="12.0"DefaultTargets="Build"xmlns="http://schemas.microsoft.com/developer/msbuild/2003">改为<ProjectSdk="Microsoft.NET.Sdk.Web">之后,升级成了最新的格式之后,如......
  • 分析webpack编译结果, 实现__webpack_require__函数
    分析webpack编译结果,实现__webpack_require__函数本篇文章我们通过手写来分析一下Webpack打包后的代码,并研究一下Webpack是如何将多个模块合并在一起的首先控制台输入npminit-y初始化一个项目,再输入npmiwebpackwebpack-cli-D安装Webpack在src目录想创建入......
  • 前端引入,Web服务器的本质,HTTP协议,HTML基础,常用标签介绍
    Ⅰ前端引入【一】前端/后端【1】什么是前端任何与用户直接打交道的操作界面都可以称之为前端前端可以是浏览器的界面、也可以是客户端的界面、还可以是手机的界面...比如电脑界面、手机界面、平板界面【2】什么是后端不直接与用户打交道的用于执行真正业务逻辑的代......
  • webapi 接收前端上传的文件
    usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingSystem.IO;usingSystem.IO.Compression;namespaceWebApplication1.Controllers{[Route("api/[controller]/[action]")][ApiController]publicclassValuesControlle......
  • 基于web学校校园教室预约管理系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 自宿主web服务器搭建记录
    建立3个项目,分别是类库WebSite、控制台TestWebSite、win服务WinService,目标框架均为.NETFramework4.8.1。其中控制台方便开发调试,win服务作为宿主服务,类库为自定义webservice的主体代码。TestWebSite和WinService引用nuget包 Microsoft.Owin.Host.HttpListener 4.2.2,不然......
  • Dynamics CRM 365 Web API 入门
    创建VisualStudio项目启动VisualStudio2022,然后选择“创建新项目”。创建新的控制台应用项目。通过设置“位置”和“项目名称”来配置项目。通过选择“.NET8.0(长期支持)”和“不使用顶级语句”来配置项目。然后单击“创建”。编辑Program.cs按照以下后续步骤为主程......
  • Visual Studio常用快捷键
    VisualStudio常用快捷键前言对于开发者而言,熟悉快捷键的使用,能够起到事半功倍的作用,提高工作效率。以下是我整理的一份VisualStudio常用快捷键清单,希望能够帮助到你。常用快捷方式快捷键功能Ctrl+K+C注释选定内容Ctrl+K+U取消注释选定内容Ctrl+K......
  • 探索sqlmap在WebSocket安全测试中的应用
    探索sqlmap在WebSocket安全测试中的应用WebSocket与HTTP的区别WebSocket,对于初次接触的人来说,往往会引发一个疑问:既然我们已经有了广泛使用的HTTP协议,为何还需要引入另一种协议?WebSocket又能为我们带来哪些实质性的好处呢?这背后的答案在于HTTP协议的一个关键限制——通信的发起......
  • Buuctf-Web(37-42)
    37[网鼎杯2020朱雀组]phpweb参考[网鼎杯2020朱雀组]phpweb1-CSDN博客[buuctf-网鼎杯2020朱雀组]phpweb(小宇特详解)_buuctf[网鼎杯2020朱雀组]phpweb-CSDN博客打开是这个界面,大概5秒刷新一次先来一遍扫目录,看源码,抓包一扫就409,应该做了限制,源码没发现什么,抓包看看......