Azure 网站上的 SignalR 和跨域
SignalR & Cross-Domain on AzureWebsite
我正在尝试在 AzureWebsites 应用程序上使用 SignalR,但遇到了跨域问题。
从本教程开始,在本地 运行 或在 azurewebsites 上 运行 时一切正常:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio
教程代码没有改动,一切照旧。
如果我将客户端移动到与 SignalR 服务器应用程序不同的域,它将不再有效。
我正在研究这个问题,但如有任何指点,我们将不胜感激。
您需要做的是首先像这样配置您的 SignalR 应用程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(cfg =>
{
cfg.AddDefaultPolicy(policy =>
{
policy.WithOrigins(Configuration.GetSection("AuthServer:DomainBaseUrl").Get<string[]>())
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((_) => true)
.SetIsOriginAllowedToAllowWildcardSubdomains();
});
});
services.AddSignalR(options =>
{
options.ClientTimeoutInterval = TimeSpan.FromHours(1);
options.EnableDetailedErrors = true;
options.HandshakeTimeout = TimeSpan.FromMinutes(10);
options.KeepAliveInterval = TimeSpan.FromMinutes(5);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Code removed for brevity
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
注意:
下面一行
policy.WithOrigins(Configuration.GetSection("AuthServer:DomainBaseUrl").Get())
用于从配置文件中获取允许 CORS 的域列表(域数组)。
并且在您的客户端应用程序中也这样做,希望您的客户端应用程序也是一个 ASP.NET 核心 MVC 应用程序。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(cfg =>
{
cfg.AddDefaultPolicy(policy => {
policy.AllowAnyHeader();
policy.AllowAnyMethod();
policy.AllowAnyOrigin();
policy.WithMethods();
});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Code removed for brevity
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
希望这对您的情况有所帮助。
我正在尝试在 AzureWebsites 应用程序上使用 SignalR,但遇到了跨域问题。
从本教程开始,在本地 运行 或在 azurewebsites 上 运行 时一切正常:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio
教程代码没有改动,一切照旧。
如果我将客户端移动到与 SignalR 服务器应用程序不同的域,它将不再有效。
我正在研究这个问题,但如有任何指点,我们将不胜感激。
您需要做的是首先像这样配置您的 SignalR 应用程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(cfg =>
{
cfg.AddDefaultPolicy(policy =>
{
policy.WithOrigins(Configuration.GetSection("AuthServer:DomainBaseUrl").Get<string[]>())
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((_) => true)
.SetIsOriginAllowedToAllowWildcardSubdomains();
});
});
services.AddSignalR(options =>
{
options.ClientTimeoutInterval = TimeSpan.FromHours(1);
options.EnableDetailedErrors = true;
options.HandshakeTimeout = TimeSpan.FromMinutes(10);
options.KeepAliveInterval = TimeSpan.FromMinutes(5);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Code removed for brevity
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
注意: 下面一行
policy.WithOrigins(Configuration.GetSection("AuthServer:DomainBaseUrl").Get
用于从配置文件中获取允许 CORS 的域列表(域数组)。
并且在您的客户端应用程序中也这样做,希望您的客户端应用程序也是一个 ASP.NET 核心 MVC 应用程序。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(cfg =>
{
cfg.AddDefaultPolicy(policy => {
policy.AllowAnyHeader();
policy.AllowAnyMethod();
policy.AllowAnyOrigin();
policy.WithMethods();
});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Code removed for brevity
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
希望这对您的情况有所帮助。