如何从单独的Docker容器中调用ASP.NET Core Web API端点

约书亚·雅培

我有两个项目:

  1. UI(.NET Core 3.1 MVC字体结尾)
  2. API(.NET Core 3.1 Web API)

每个都在两个单独的容器中运行。他们共享一个docker-compose文件来构建它们。从UI项目中,我希望能够进行AJAX调用以击中API项目中的端点。到达终点的URL是什么?

我试过的

  1. 如果我单独使用IIS运行API项目,则可以通过导航到来成功命中端点https://localhost:49239/weatherforecast但是,再次,我想通过从UI项目中的客户端调用该端点来实现此端点。
  2. 如果我使用docker-compose启动两个容器,则从UI项目中单击将我的AJAX调用执行到端点的按钮,该按钮将https://localhost:49239/weatherforecast不起作用。我尝试对URL的宿主部分进行多种变体以实现此目的。

根据撰写中的网络

Compose为您的应用设置一个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被它们发现。

这样,我还尝试了主机URL的多种变体,例如https://api:49243/weatherforecast其中“ api”是我的docker映像的名称,“ 49243”是由列出的端口docker ps我也尝试过:

  • https://api:80/weatherforecast
  • https://api:433/weatherforecast
  • https://api:PORT_NUM/weatherforecast 其中“ PORT_NUM”是使用以下命令查看时为容器列出的任何端口号 docker ps

那么我该如何达到这个目标呢???

注意:

  • 我已经运行,docker inspect CONTAINER_NAME并且我知道两个容器都在同一网络上。

档案:

  1. UI> Index.cshtml:
@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    <button type="button" class="btn btn-primary" onclick="callAPI()">Call API</button>
</div>

@section scripts {
    <script>
        function callAPI() {
            console.log("calling API...");

            $.ajax({
                url: `https://api:49221/weatherforast/get`,
                method: 'GET',
                success: function (data) {
                    console.log(data);
                },
                error: function (error) {
                    console.log(error);
                }
            });
        }
    </script>
}
  1. UI> Dockerfile:
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 ["UI/UI.csproj", "UI/"]
RUN dotnet restore "UI/UI.csproj"
COPY . .
WORKDIR "/src/UI"
RUN dotnet build "UI.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "UI.dll"]
  1. API> WeatherForecastController.cs:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace API.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
  1. API> Dockerfile:
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 ["API/API.csproj", "API/"]
RUN dotnet restore "API/API.csproj"
COPY . .
WORKDIR "/src/API"
RUN dotnet build "API.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API.dll"]
  1. 码头工人组成:
version: '3.4'

services:
  ui:
    image: ${DOCKER_REGISTRY-}ui
    build:
      context: .
      dockerfile: UI/Dockerfile

  api:
    image: ${DOCKER_REGISTRY-}api
    build:
      context: .
      dockerfile: API/Dockerfile
  1. 为了更好地理解解决方案的结构,这是我的解决方案资源管理器的屏幕截图
杰里米·鲁佛(Jeremy Ruffell)

据我了解,您有2个您希望彼此通信的ASP.NET项目。这样做很简单,您就可以走上正轨。在docker compose上,您要为2个容器创建一个网络。如果要同时打开API和UI(端口:80)这两个端口,则可以将它们映射,或者如果您只想访问UI而不关心从其他任何东西访问API,则只需打开UI将端口80连接到您的主机网络(或您选择的任何其他端口)。继续并创建一个实验网络。docker network create MyNetwork完成编辑后docker-compose.yml(请注意,您可以在docker compose中创建网络,我只是以此方式进行描述,以便您了解幕后最终发生的事情)

version: '3.4'

services:
  ui:
    # Always a good practice to set container names.
    container_name: asp_net_ui
    image: ${DOCKER_REGISTRY-}ui
    build:
      context: .
      dockerfile: UI/Dockerfile
    ports:
      - "80:80"

  api:
    container_name: asp_net_api
    image: ${DOCKER_REGISTRY-}api
    build:
      context: .
      dockerfile: API/Dockerfile
      
# As I said before this is refrenceing a pre excisting network but you could
# Create a new network here aswell. I tend to use ths approach as I have multiple
# Diffrent stacks running in a network, e.g. Caddy, Jenkins, Dev Staging Env.
networks:
  default:
    external:
      name: MyNetwork

在回答完这个问题后,您将回答有关将到达我的端点的URL是什么的问题
您可以使用DNS解析。只需提供容器名称。

对于容器到容器通信:
要使用您的API: http://asp_net_api/{controller}
要使用您的UI: http://asp_net_ui/{view}

要从浏览器访问用户界面,请执行以下操作:http://localhost/{view}

希望这对您有帮助,如果您还有其他问题,请随时提出或参考此处的官方网络文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确处理 ASP.Net Core 3 Web API 中的多个端点

来自分类Dev

ASP.NET Web API(.NET Core 3.1)中的端点路由问题

来自分类Dev

如何从Web API调用ASP.NET Core Web MVC

来自分类Dev

如何从Web API调用ASP.NET Core Web MVC

来自分类Dev

.NET Core 3.0 Web API无法在Docker容器中启动

来自分类Dev

Asp.Net Core Web Api中的端点之间的内存缓存似乎有所不同

来自分类Dev

通过传递Azure B2C JWT承载令牌从Angular调用.NET CORE Web API安全端点

来自分类Dev

ASP .Net Core Web 应用程序调用 Web API

来自分类Dev

用于查询 MongoDB 集合的 ASP.NET Web API 端点

来自分类Dev

如何在新的ASP.NET Core中调用Web API非默认构造函数

来自分类Dev

如何在新的ASP.NET Core中调用Web API非默认构造函数

来自分类Dev

调试asp.net core web API

来自分类Dev

.Net Core Web API发布路由端点未受到攻击

来自分类Dev

保护 ASP.NET Web API 服务的外部 API 端点 (ASP.NET 4.6)

来自分类Dev

dot net core中基于web api调用的派生配置

来自分类Dev

将自定义api端点添加到ASP:Net Core模板

来自分类Dev

Asp.net Core 2.2 API错误,请求匹配多个端点

来自分类Dev

AWS API Gateway to .NET Core Web Api 在 ECS 中运行

来自分类Dev

使用Web API的ASP.Net Core路由

来自分类Dev

ASP.NET Core 1.0 Web API不返回XML

来自分类Dev

在Asp.net Core中将字典发布到Web API

来自分类常见问题

使用VSTS的ASP.NET Core Web API的CI / CD

来自分类Dev

ASP.NET Core Web Api自动帮助页面

来自分类Dev

ASP.NET Core 1.0 Web API使用camelcase

来自分类Dev

Odata ASP.NET Core 2.2 Web API分页

来自分类Dev

ASP.NET Core Web API和角色授权

来自分类Dev

从ASP .NET Core Web API方法返回完整的XML响应

来自分类Dev

ASP.NET Core Web API InvalidOperationException:无法解析服务

来自分类Dev

asp.net core 2 Web API超时问题

Related 相关文章

  1. 1

    如何正确处理 ASP.Net Core 3 Web API 中的多个端点

  2. 2

    ASP.NET Web API(.NET Core 3.1)中的端点路由问题

  3. 3

    如何从Web API调用ASP.NET Core Web MVC

  4. 4

    如何从Web API调用ASP.NET Core Web MVC

  5. 5

    .NET Core 3.0 Web API无法在Docker容器中启动

  6. 6

    Asp.Net Core Web Api中的端点之间的内存缓存似乎有所不同

  7. 7

    通过传递Azure B2C JWT承载令牌从Angular调用.NET CORE Web API安全端点

  8. 8

    ASP .Net Core Web 应用程序调用 Web API

  9. 9

    用于查询 MongoDB 集合的 ASP.NET Web API 端点

  10. 10

    如何在新的ASP.NET Core中调用Web API非默认构造函数

  11. 11

    如何在新的ASP.NET Core中调用Web API非默认构造函数

  12. 12

    调试asp.net core web API

  13. 13

    .Net Core Web API发布路由端点未受到攻击

  14. 14

    保护 ASP.NET Web API 服务的外部 API 端点 (ASP.NET 4.6)

  15. 15

    dot net core中基于web api调用的派生配置

  16. 16

    将自定义api端点添加到ASP:Net Core模板

  17. 17

    Asp.net Core 2.2 API错误,请求匹配多个端点

  18. 18

    AWS API Gateway to .NET Core Web Api 在 ECS 中运行

  19. 19

    使用Web API的ASP.Net Core路由

  20. 20

    ASP.NET Core 1.0 Web API不返回XML

  21. 21

    在Asp.net Core中将字典发布到Web API

  22. 22

    使用VSTS的ASP.NET Core Web API的CI / CD

  23. 23

    ASP.NET Core Web Api自动帮助页面

  24. 24

    ASP.NET Core 1.0 Web API使用camelcase

  25. 25

    Odata ASP.NET Core 2.2 Web API分页

  26. 26

    ASP.NET Core Web API和角色授权

  27. 27

    从ASP .NET Core Web API方法返回完整的XML响应

  28. 28

    ASP.NET Core Web API InvalidOperationException:无法解析服务

  29. 29

    asp.net core 2 Web API超时问题

热门标签

归档