SignalR 核心和跨域请求的问题

Posted

技术标签:

【中文标题】SignalR 核心和跨域请求的问题【英文标题】:Issue with SignalR core and cross domain requests 【发布时间】:2018-07-31 09:02:35 【问题描述】:

我们将 SignalR 核心与 CORS 跨域请求一起使用。客户端无法连接到服务器。 401 Unauthorized No Access-Control-Allow-Origin' 标头出现在请求的资源上。错误:无法启动连接。请注意,我们使用的是最新的信号器核心(asp.net core 2.0 的 alpha 版本)。

请注意,在同一个客户端应用程序中,我可以访问 CORS Web API 方法。它与 SignalR 集线器/客户端隔离。

我们在 IIS 中使用 Windows 身份验证。匿名似乎正在工作。

服务器启动.cs:

ConfigureServices() 方法

services.AddCors();
services.AddSignalR();

配置方法

app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
app.UseSignalR(routes =>
            
                routes.MapHub<TestHub>("test");
            );
app.UseMvc();

javascript 客户端:

let connection = new signalR.HubConnection(CORS_WEB_API_URL + '/test');
    connection.on('send', data => 
        console.log(data);
    );
connection.start();

请指教。

【问题讨论】:

请注意,在同一个客户端应用程序中,我可以访问 CORS Web API 方法。它与 SignalR 集线器/客户端隔离。 检查以确保您没有收到另一个错误。很多时候,错误响应(例如,如果是 401)将无法通过 CORS 检查,但根本原因不是 CORS 【参考方案1】:

只需将 .AllowAnyOrigin() 替换为 .WithOrigins("*")

配置服务:

services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>

     builder
        .AllowAnyMethod()
        .AllowAnyHeader()
        .WithOrigins("*")
        .AllowCredentials();
));

配置

app.UseCors("CorsPolicy");

经过测试

<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.0.2" />

【讨论】:

【参考方案2】:

我知道这是一篇旧帖子,但是,答案是使用 SignalR,您不能在 CORS 允许来源中使用通配符。

需要具体。对于开发,我使用这个:

        services.AddCors(options => options.AddPolicy("CorsDev", builder =>
        
            builder
            .AllowAnyMethod()
            .AllowAnyHeader()
            .WithOrigins(AppSettings.SPAHost, "http://localhost:8099")
            .AllowCredentials();
        ));

然后在startup.cs中的Configure中

app.UseCors("CorsDev");

希望这对某人有所帮助。

【讨论】:

以上是关于SignalR 核心和跨域请求的问题的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 和跨域 POST 请求

Laravel解决预请求和跨域的问题

浅谈jquery中的ajax请求和跨域请求

AngularJS和跨域请求被阻止[关闭]

获取 API、自定义请求标头、CORS 和跨域重定向

一篇搞定vue请求和跨域