【问题标题】:Dockerized API returns socket hang up via PostmanDockerized API 通过 Postman 返回套接字挂起
【发布时间】:2022-02-17 02:48:08
【问题描述】:

我在 .net core 5.0 中创建了简单的 RestAPI - 它只有一项工作,返回 StatusCode 200 或 500:

[ApiController]
[Route("api")]
public class HomeController : Controller
{
    [HttpGet]
    [Route("checktrue")]
    public IActionResult HealthCheckTrue()
    {
        return Ok();
    }

    [HttpGet]
    [Route("checkfalse")]
    public IActionResult HealthCheckFalse()
    {
        return StatusCode(500);
    }
}

当我在本地构建它时,一切正常,但是一旦我将它托管在 docker 容器中,我就无法通过 Postman 访问它。

Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS build
WORKDIR /src
COPY ["HealthCheck/HealthCheck.csproj", "HealthCheck/"]
RUN dotnet restore "HealthCheck/HealthCheck.csproj"
COPY . .
WORKDIR "/src/HealthCheck"
RUN dotnet build "HealthCheck.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HealthCheck.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "HealthCheck.dll"]

当我运行 docker 容器时,它会正常启动:

=info: Microsoft.Hosting.Lifetime[0]

Now listening on: http://0.0.0.0:80

info: Microsoft.Hosting.Lifetime[0]

Application started. Press Ctrl+C to shut down.

info: Microsoft.Hosting.Lifetime[0]

Hosting environment: Production

info: Microsoft.Hosting.Lifetime[0]

Content root path: /app

(端口映射到 5020) 我正在发送请求: http://localhost:5020/api/checktrue 我得到错误:socker hang up

当我在我的机器上执行相同的请求时,它工作正常。

你知道如何解决这个问题吗?

【问题讨论】:

    标签: .net docker postman


    【解决方案1】:

    我有类似的问题。尝试使用cURL 调用您的端点http://localhost:5020/api/checktrue

    cURL 工具给了我比邮递员更有说服力的答案。

    curl: (52) Empty reply from server
    

    如果要求cURL 在执行HTTPS 的服务器上执行普通HTTP,则可能会导致错误。

    容器中的 .NET API 可能正在侦听端口 80443。即使launchsettings.json 说的不同。此设置实际上不会更改 Docker container 的启动。

    我的解决方案是在 Program.cs 类中使用 Kestrel 配置设置默认 URL。

    .NET5 中会是这样的

    public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseUrls("http://localhost:80");
                });
    

    .NET6 中,UserUrls() 方法不再使用,如下所示。

    var builder = WebApplication.CreateBuilder(args);
    
    //...
    
    builder.WebHost.ConfigureKestrel(options =>
    {
        options.ListenAnyIP(80);
    });
    
    //...
    
    var app = builder.Build();
    

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2016-09-06
      相关资源
      最近更新 更多