无法调试在 Docker 中运行的 ASP.NET 网站中的启动代码
Posted
技术标签:
【中文标题】无法调试在 Docker 中运行的 ASP.NET 网站中的启动代码【英文标题】:Unable to debug startup code in ASP.NET website running in Docker 【发布时间】:2019-10-07 20:51:17 【问题描述】:我创建了一个针对 .NET Framework 的标准 ASP.NET 网站,并使用 Docker-compose 在 Docker 中运行它。
在调试网站时,网站的“启动”代码中没有一个断点被命中。
控制器中的断点按预期命中。
在 IISExpress 中运行时,我立即在启动代码中命中断点。
在我看来,VS 2019 似乎没有及时附加到网站,以使其在启动代码中遇到断点。
我在 ASP.NET Core 网站上尝试过同样的事情,并且 Program.Main() 方法中的断点立即被命中。
我尝试将 Docker-compose “启动操作”设置为“什么都不做”,以避免网站在我向它发出请求之前启动,但没有成功。
Dockerfile:
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-1803
ARG source
WORKDIR /inetpub/wwwroot
COPY $source:-obj/Docker/publish .
Docker-compose.yml:
version: '3.4'
services:
mydockerizedwebapp:
image: $DOCKER_REGISTRY-mydockerizedwebapp
container_name: mydockerizedwebapp
build:
context: .\MyDockerizedWebApp
dockerfile: Dockerfile
Docker-compose.override.yml:
version: '3.4'
services:
mydockerizedwebapp:
ports:
- "80"
networks:
default:
external:
name: nat
有谁知道如何及时附加 Visual Studio 调试器以便我在启动代码中遇到断点?
编辑:
如果网站启动时出现异常,导致它宕机,那么下一次对网络服务器的请求将“重新启动”它,并命中断点。但是他们为什么不第一次打呢?
【问题讨论】:
【参考方案1】:您可以让您的应用程序等待调试器附加:
#if Debug_Break
while (!Debugger.IsAttached)
Thread.Sleep(500);
Debugger.Break();
#endif
您可以添加 Debug_Break 配置,也可以删除 #if。将此代码放在启动部分。
请注意,出于显而易见的原因,您不希望在发布二进制文件中包含此代码。
【讨论】:
这不起作用。当我添加 while 循环时,Visual Studio 调试器根本无法连接。 VS 只是挂了一会儿,然后我收到错误消息:“无法在 Web 服务器上开始调试。操作已超时”。 在控制台应用程序中试试?另见this 我不明白您所说的“在控制台应用程序中尝试?”是什么意思。我确信它可以在控制台应用程序中工作,但我需要它在 Docker 中运行的 ASP.NET 网站中工作。以上是关于无法调试在 Docker 中运行的 ASP.NET 网站中的启动代码的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC5/IIS Express 无法调试 - 代码未运行
ASP.NET 5 项目未正确定位 .NET 4.6.1 且无法调试