C# API没有';t工作,使用Docker和ASP.NET内核

C# API没有';t工作,使用Docker和ASP.NET内核,c#,asp.net,docker,asp.net-core-webapi,C#,Asp.net,Docker,Asp.net Core Webapi,我制作了一个ASP.NET核心web API,为它ping一个Mongodb和一个docker容器。web api调用在不使用docker时有效,但在我使用docker时返回not Found错误。我认为这与我运行的端口有关,但我不确定,因为这是我第一次使用docker 在命令提示下,我执行以下操作: docker build-t projectname. 然后我用 docker run-p 8080:80项目名称 一旦跑步,如果我打电话给http://localhost:8080/api/cl

我制作了一个ASP.NET核心web API,为它ping一个Mongodb和一个docker容器。web api调用在不使用docker时有效,但在我使用docker时返回not Found错误。我认为这与我运行的端口有关,但我不确定,因为这是我第一次使用docker

在命令提示下,我执行以下操作:

docker build-t projectname.

然后我用

docker run-p 8080:80项目名称

一旦跑步,如果我打电话给http://localhost:8080/api/classname,我收到一个未找到的错误消息“这是我的无效消息”,因此看起来我的docker容器正在运行。当我打电话给http://localhost:8080/api/classname?id=1 (这是一个有效的id),我仍然得到一个找不到的错误,但没有得到“这是我的无效消息”文本

ClassNameController API获取:

[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
    }
  }
}

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

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

"ConnectionString":"mongodb://192.168.0.27:27017"
 "ConnectionString":"mongodb://mongo"
请注意,在docker文件中没有定义环境,在这种情况下,docker中的应用程序将使用生产
appsettings
,而不是
appsettings.Development

如果您希望在组合中同时使用这两个选项,则可以为所有服务定义一个网络,然后在连接字符串中仅使用服务的名称,如下所示:

"ConnectionString":"mongodb://192.168.0.27:27017"
 "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

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

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

"ConnectionString":"mongodb://192.168.0.27:27017"
 "ConnectionString":"mongodb://mongo"
请注意,在docker文件中没有定义环境,在这种情况下,docker中的应用程序将使用生产
appsettings
,而不是
appsettings.Development

如果您希望在组合中同时使用这两个选项,则可以为所有服务定义一个网络,然后在连接字符串中仅使用服务的名称,如下所示:

"ConnectionString":"mongodb://192.168.0.27:27017"
 "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

您试图调用的API的url是什么?我正在尝试调用
http://localhost8080/api/classname?id=1
您试图调用的API的url是什么?我正在尝试调用
http://localhost8080/api/classname?id=1