无法在 C# / Docker 中绑定到 0.0.0.0(无 ASP!)

问题描述 投票:0回答:1

我尝试从在 Docker 容器中运行的 C# 控制台应用程序打开一个端口。我认为根本问题是我无法绑定到 0.0.0.0:1234。为了演示这个问题,我将分享一个简单的 Web 服务器。我收到错误消息

System.Net.HttpListenerException:“不支持该请求。”

运行以下代码时:

using System.Net;
using System.Text;

string html = "<html><body><h1>Hello World</h1></body></html>";

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://0.0.0.0:1234/");
//listener.Prefixes.Add("http://localhost:1234/");

listener.Start();

while (true)
{
    HttpListenerContext context = listener.GetContext();
    HttpListenerResponse response = context.Response;

    byte[] buffer = Encoding.UTF8.GetBytes(html);
    response.ContentLength64 = buffer.Length;

    Stream output = response.OutputStream;
    output.Write(buffer, 0, buffer.Length);

    output.Close();
}

我使用 VS 2022 集成 docker 设施运行代码。我的 Dockerfile 如下所示:

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
EXPOSE 1234
USER app
WORKDIR /app

[...]

还有我的 docker-compose.yml:

services:
  demo:
    image: ${DOCKER_REGISTRY-}demo
    build:
      context: .
      dockerfile: demo/Dockerfile
    ports:
      - "1234:1234"

如何从浏览器 http://localhost:1234 访问我的容器?

我尝试过的事情:

我在主机上执行了代码(不涉及 docker),并且在绑定到 localhost:1234 时它起作用了。

在 docker 容器中托管时,我尝试绑定到 localhost:1234。没有发生错误,但浏览器告诉我服务器似乎没有启动。

我检查了绑定到 localhost:1234 时映射是否有效(这让我得出结论,我应该绑定到 0.0.0.0:1234)。

docker port demo_1
1234/tcp -> 0.0.0.0:1234

我尝试了几个端口(80、8080,最后是 1234),以免与图像中的某些预定义配置发生冲突。

我尝试查找一些有关潜在环境变量的文档,但您发现的所有文档似乎都与 ASP 相关。

c# .net docker
1个回答
0
投票

Docker 容器有自己的虚拟网络配置。尝试将侦听器更改为以下内容,以便它将绑定到任何 IP 地址并允许所有 HTTP 方法:

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://+:1234/");

然后您应该能够通过以下方式访问主机上的容器:

http://localhost:1234

© www.soinside.com 2019 - 2024. All rights reserved.