【问题标题】:API doesn't work, using Docker and ASP.NET COREAPI 不起作用,使用 Docker 和 ASP.NET CORE
【发布时间】:2021-01-09 01:13:38
【问题描述】:

我创建了一个 ASP.NET Core Web API,它可以 ping 一个 Mongodb 和一个 docker 容器。 Web api 调用在不使用 docker 时工作,但在我使用它时返回 Not Found 错误。我认为这与我正在运行的端口有关,但我不确定因为这是我第一次使用 docker。

在命令提示符下我这样做:

docker build -t projectname .

然后我运行图像

docker run -p 8080:80 projectname

运行后,如果我调用 http://localhost:8080/api/classname,我会收到 Not Found 错误消息“这是我的无效消息”,所以看起来我的 docker 容器正在运行。当我调用 http://localhost:8080/api/classname?id=1(这是一个有效的 id)时,我仍然收到 Not Found 错误,但没有收到“这是我的无效消息”文本.

类名控制器 API GET:

[Route("api/[controller]")]
    [ApiController]
    public class ClassNameController : Controller
    {
        [HttpGet]
        public IActionResult GetDescendents(int id)
        {
            var mongoDbService = new MongoDbService();

      
            try
            {
                var node = mongoDbService.GetTreeNodeById(id);

                if (node == null)
                {
                    return NotFound("this is my invalid message");
                }
                else
                {
                    //stuff happens
                }
            }
            catch (Exception e)
            {
                return BadRequest(e);
            }

            return Ok();
        }

Dockerfile:

See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["ProjectName/ProjectName.csproj", "ProjectName/"]
RUN dotnet restore "ProjectName/ProjectName.csproj"
COPY . .
WORKDIR "/src/ProjectName"
RUN dotnet build "ProjectName.csproj" -c Release -o /app/build

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

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

launchSetting.json:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:8080",
      "sslPort": 8080
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "DockerAPI": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/",
      "publishAllPorts": true,
      "useSSL": true
    }
  }
}

【问题讨论】:

标签: c# asp.net docker asp.net-core-webapi


【解决方案1】:

考虑到您尚未定义它,当您在 docker 容器中使用 Web API 和 mongo 服务时,它可能位于不同的网络上。

解决此问题的一种快速方法是在 appsettings 中从您的 IP 号中更改您的 mongo 连接字符串中的 localhost,如下所示:

"ConnectionString":"mongodb://192.168.0.27:27017"

注意,在您的 Dockerfile 中您没有定义环境,在这种情况下,您在 docker 中的应用程序将使用生产环境 appsettings 而不是您的 appsettings.Development

如果您更喜欢在 compose 中同时使用两者,您可以为所有服务定义一个网络,然后在连接字符串上只使用服务的名称,如下所示:

 "ConnectionString":"mongodb://mongo"

例如docker-compose.yml:

version: "3.7"

services:
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    networks:
      - mynetwork  

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
    networks:
      - mynetwork

  webapi:
    container_name: webapi
    build:
      context: .
      dockerfile: ./YourProject/Dockerfile
    ports:
      - 8080:80
    depends_on:
      - mongo
    links:
      - mongo
    networks:
      - mynetwork

networks:
  mynetwork:
    driver: bridge

然后:

docker-compose up

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2021-05-09
    • 2019-04-30
    • 1970-01-01
    • 2017-05-15
    • 2020-03-30
    • 2021-11-07
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多