无法在Docker中运行的ASP.NET网站中调试启动代码

时间:2019-05-21 12:46:20

标签: c# asp.net docker docker-compose

我已经创建了一个针对.NET Framework的标准ASP.NET网站,并使用Docker-compose在Docker中运行它。

调试网站时,网站“启动”代码中的任何断点都不会被击中。

控制器中的断点达到预期。

在IISExpress中运行时,我立即在启动代码中遇到了断点。

在我看来,VS 2019似乎并没有及时附加到网站上,从而无法达到启动代码中的断点。

我已经在ASP.NET Core网站上尝试了同样的方法,并且Program.Main()方法中的断点立即被击中。

我尝试将Docker组成的“启动操作”设置为“什么都不做”,以避免在我提出请求之前网站无法启动,但是没有运气。

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调试器,以便我在启动代码中命中断点吗?

编辑:

如果在网站启动时发生异常,导致异常停机,则对Web服务器的下一个请求将“重新启动”该异常,并命中断点。但是为什么他们不第一次打呢?

1 个答案:

答案 0 :(得分:0)

您可以让您的应用程序等待调试器附加:

#if Debug_Break
while (!Debugger.IsAttached)
{
    Thread.Sleep(500);
}
Debugger.Break();
#endif

您可以添加Debug_Break配置,也可以仅删除#if。将此代码放在启动部分。

请注意,出于明显的原因,您不希望在发行版二进制文件中使用此代码。