无法调试在 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 网站中的启动代码的主要内容,如果未能解决你的问题,请参考以下文章

vs2005不能调试ASP.NET程序

ASP.NET MVC5/IIS Express 无法调试 - 代码未运行

无法调试 ASP.NET 项目

ASP.NET 5 项目未正确定位 .NET 4.6.1 且无法调试

使用VS2008调试ASP.net网站项目 浏览器一直在连接中 无法打开

远程调试asp.net