SignalR .NetCore Api не работает при запуске с docker -compose - PullRequest
1 голос
/ 29 марта 2020

У меня есть .NetCore API с концентратором signalR. Мое приложение развернуто в DigitalOcean, в Ubuntu 18.04.3 (LTS) x64.

  • При запуске do tnet, запуске в cmd, программа запускается и доступен через IP-адрес. Как конечные точки API, так и концентратор signalR отвечают, как ожидается. (это происходит по HTTP) Однако я получаю это в консоли: enter image description here

  • При работе

    docker-compose build docker-compose up

приложение запускается (на HTTPS ), слова API, как и ожидалось, но SignalR выдает следующую ошибку: enter image description here

Я также получаю это в консоли enter image description here


это мой docker -компонентный файл:

#docker-compose

version: '2'

services:
  app:
    build:
      context:  ./
      dockerfile: Dockerfile
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    links:
      - app
    restart: always
    environment:
      DOMAINS: 'ns2.we*******.*** -> http://app:80'
      STAGE: 'production'

это мой Docker файл

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 ["iCoose.API/iChoose.API.csproj", "iCoose.API/"]
COPY ["iChoose.Business.Entities/iChoose.Business.Entities.csproj", "iChoose.Business.Entities/"]
COPY ["iChoose.Business.Services/iChoose.Business.Services.csproj", "iChoose.Business.Services/"]
COPY ["iChoose.Common.Core/iChoose.Common.Core.csproj", "iChoose.Common.Core/"]
COPY ["iChoose.DataAccess.Data/iChoose.DataAccess.Data.csproj", "iChoose.DataAccess.Data/"]
RUN dotnet restore "iCoose.API/iChoose.API.csproj"
COPY . .
WORKDIR "/src/iCoose.API"
RUN dotnet build "iChoose.API.csproj" -c Release -o /app/build

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

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

мой Program.cs

public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.UseUrls("http://*:80");
            });
}

Это мой стартап:

 public class Startup
{
    const string CorsAllowAnyOriginPolicyName = "AllowAnyOrigin";

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }


    public void ConfigureServices(IServiceCollection services)
    {
        ConfigureCORS(services);
        services.AddControllers(config => 
          {}).SetCompatibilityVersion(CompatibilityVersion.Latest);

        services.AddEntityFrameworkNpgsql().AddDbContext<AppDbContext>(opt =>
        {
            opt.UseNpgsql(Configuration["ConnectionStrings:AppEntities"]);
        });

        services.AddRazorPages();
        services.AddSignalR();
        services.AddHttpClient();

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<VotingHub>();

        #region JWT authentication
        ....
        #endregion
    }


    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();
        app.UseCors(CorsAllowAnyOriginPolicyName);

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllers();
            endpoints.MapHub<VotingHub>("/voteHub");
        });
    }


    private void ConfigureCORS(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(CorsAllowAnyOriginPolicyName, policy =>
            {
                policy.AllowAnyOrigin();
                policy.AllowAnyMethod();
                policy.AllowAnyHeader();
            });
        });

    }
 }
...