SignalR Core 适用于本地主机,但不适用于 Azure App Service
SignalR Core works on localhost but not on Azure App Service
我有一个客户端程序(.Net 4.8 上的 WPF 应用程序)和一个 Web API(.Net Core 3.1)。
我试图让两者通过 SignalR Core 进行通信。
当两者都在我的 PC 本地(即在本地主机上)运行 时,它工作得很好。
但是,一旦我将 API 发布到 Azure 应用服务(并将 WPF 应用程序指向新的 URL),它就不起作用了。 SignalR 建立连接,但是当 API 向 WPF 应用程序发送数据时,该应用程序从未接收到它。
我不确定它是否与 CORS 有关。 Azure 应用服务上的 CORS 已禁用。在我的网站 API 上,我这个 Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
);
});
string connectionString = Configuration.GetConnectionString("eBallDatabase");
services.AddDbContext<EBallContext>(options =>
options.UseSqlServer(connectionString));
var config = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.AddProfile(new AutoMapperProfileConfiguration());
});
var mapper = config.CreateMapper();
services.AddSingleton(mapper);
services.AddSignalR(options =>
{
options.EnableDetailedErrors = true;
});
services.AddApplicationInsightsTelemetry();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("corsPolicy");
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chatHub");
});
}
我想我曾经读过,您不能将 AllowAnyOrigin() 与 SignalR 一起使用。您需要指定所需的来源。但我不确定我的来源是什么,因为这是一个 WPF 应用程序 运行 在不同用户的计算机上,所有计算机都有不同的 domains/IP 地址。
就像我说的,当一切都在 loclahost 上时,它工作得很好。但是一旦 API 在 Azure App Service 上,两者就设法建立了 SignalR 连接,仅此而已。 WPF 应用程序未从 API.
接收到任何数据
有什么想法吗?
是的,您需要指定来源。 CORS
方法的顺序也很重要。并且您需要 CORS 在您的框架应用程序和 .NET Core 应用程序之间进行通信。所以你可以试试这个:
services.AddCors(options =>
{
options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://yourFrameworkApp.azurewebsites.com")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((host) => true));
});
您还可以在客户端看到连接到集线器时出现的错误。例如,当客户端调用端点到您的集线器进行协商时,您可以:
CORS
错误 - 尝试像下面那样添加它。
404
未找到 - 您指向错误 controller/hub。
405
方法不允许 - 这是当用户无权调用您的集线器中的方法时。
此外,在启动时(配置方法)检查您是否正在添加 Web 套接字:
app.UseWebSockets();
编辑:你也可以尝试使用Azure SignalR
这样你就不用担心这类问题了。
我有一个客户端程序(.Net 4.8 上的 WPF 应用程序)和一个 Web API(.Net Core 3.1)。 我试图让两者通过 SignalR Core 进行通信。 当两者都在我的 PC 本地(即在本地主机上)运行 时,它工作得很好。 但是,一旦我将 API 发布到 Azure 应用服务(并将 WPF 应用程序指向新的 URL),它就不起作用了。 SignalR 建立连接,但是当 API 向 WPF 应用程序发送数据时,该应用程序从未接收到它。
我不确定它是否与 CORS 有关。 Azure 应用服务上的 CORS 已禁用。在我的网站 API 上,我这个 Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
);
});
string connectionString = Configuration.GetConnectionString("eBallDatabase");
services.AddDbContext<EBallContext>(options =>
options.UseSqlServer(connectionString));
var config = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.AddProfile(new AutoMapperProfileConfiguration());
});
var mapper = config.CreateMapper();
services.AddSingleton(mapper);
services.AddSignalR(options =>
{
options.EnableDetailedErrors = true;
});
services.AddApplicationInsightsTelemetry();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("corsPolicy");
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chatHub");
});
}
我想我曾经读过,您不能将 AllowAnyOrigin() 与 SignalR 一起使用。您需要指定所需的来源。但我不确定我的来源是什么,因为这是一个 WPF 应用程序 运行 在不同用户的计算机上,所有计算机都有不同的 domains/IP 地址。
就像我说的,当一切都在 loclahost 上时,它工作得很好。但是一旦 API 在 Azure App Service 上,两者就设法建立了 SignalR 连接,仅此而已。 WPF 应用程序未从 API.
接收到任何数据有什么想法吗?
是的,您需要指定来源。 CORS
方法的顺序也很重要。并且您需要 CORS 在您的框架应用程序和 .NET Core 应用程序之间进行通信。所以你可以试试这个:
services.AddCors(options =>
{
options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://yourFrameworkApp.azurewebsites.com")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((host) => true));
});
您还可以在客户端看到连接到集线器时出现的错误。例如,当客户端调用端点到您的集线器进行协商时,您可以:
CORS
错误 - 尝试像下面那样添加它。
404
未找到 - 您指向错误 controller/hub。
405
方法不允许 - 这是当用户无权调用您的集线器中的方法时。
此外,在启动时(配置方法)检查您是否正在添加 Web 套接字:
app.UseWebSockets();
编辑:你也可以尝试使用Azure SignalR
这样你就不用担心这类问题了。