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();
           });
}

希望这对您的情况有所帮助。