C# API没有';t工作,使用Docker和ASP.NET内核
我制作了一个ASP.NET核心web API,为它ping一个Mongodb和一个docker容器。web api调用在不使用docker时有效,但在我使用docker时返回not Found错误。我认为这与我运行的端口有关,但我不确定,因为这是我第一次使用docker 在命令提示下,我执行以下操作: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
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