У меня есть .NetCore API с концентратором signalR. Мое приложение развернуто в DigitalOcean, в Ubuntu 18.04.3 (LTS) x64.
При запуске do tnet, запуске в cmd, программа запускается и доступен через IP-адрес. Как конечные точки API, так и концентратор signalR отвечают, как ожидается. (это происходит по HTTP) Однако я получаю это в консоли:
При работе
docker-compose build
docker-compose up
приложение запускается (на HTTPS ), слова API, как и ожидалось, но SignalR выдает следующую ошибку:
Я также получаю это в консоли
это мой 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();
});
});
}
}