与docker compose一起运行时,SignalR.NetCore Api不工作
我有一个带信号集线器的.NetCore API。 我的应用程序部署在DigitalOcean上,Ubuntu 18.04.3(LTS)x64上与docker compose一起运行时,SignalR.NetCore Api不工作,docker,.net-core,signalr,Docker,.net Core,Signalr,我有一个带信号集线器的.NetCore API。 我的应用程序部署在DigitalOcean上,Ubuntu 18.04.3(LTS)x64上 在cmd中运行dotnet run时,程序启动并可通过IP地址访问。API端点和信号集线器都按预期响应(这种情况发生在HTTP上) 但是,我确实在控制台中看到了这一点: 跑步时 docker编写构建 docker编写程序 应用程序启动(在HTTPS上),API字与预期一致,但信号器给出以下错误: 我也在控制台中得到了这个 这是我的docker
- 在cmd中运行dotnet run时,程序启动并可通过IP地址访问。API端点和信号集线器都按预期响应(这种情况发生在HTTP上) 但是,我确实在控制台中看到了这一点:
- 跑步时
docker编写构建 docker编写程序
这是我的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"]
我的程序.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");
});
}
publicstaticvoidmain(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
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();
});
});
}
}
公共类启动
{
常量字符串CorsAllowAnyOriginPolicyName=“AllowAnyOrigin”;
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
配置公司(服务);
services.AddControllers(配置=>
{}.SetCompatibilityVersion(CompatibilityVersion.Latest);
services.AddEntityFrameworkNpgsql().AddDbContext(opt=>
{
opt.UseNpgsql(配置[“连接字符串:外观]);
});
services.AddRazorPages();
services.AddSignalR();
services.AddHttpClient();
services.AddSingleton();
services.AddSingleton();
#区域JWT认证
....
#端区
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
应用程序UseCors(CorsAllowAnyOriginPolicyName);
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapHub(“/voteHub”);
});
}
专用void配置公司(iSeries收集服务)
{
services.AddCors(选项=>
{
options.AddPolicy(CorsAllowAnyOriginPolicyName,policy=>
{
policy.AllowAnyOrigin();
policy.AllowAnyMethod();
policy.AllowAnyHeader();
});
});
}
}