如何设置CORS ASP.NET核心SignalR

时间:2019-05-14 20:29:52

标签: asp.net-core signalr

我正在尝试使用nuget软件包Microsoft.AspNetCore.SignalR.1.1.0从Javascript客户端到ASP.NET核心应用使用SignalR

第一 services.AddSignalR(c => c.EnableDetailedErrors = true);

然后,我按如下所示配置了CORS。我们使用HttpSys。我怀疑这里是问题async,因为这可能意味着CORS没有在UseSignalR之前设置,所以我尝试使用命名策略并且有效。

 app.Use (async (context, next) => {
    var url = GetOriginUrl (context.Request);
    context.Response.Headers.Add ("Access-Control-Allow-Origin", url);
    context.Response.Headers.Add ("Access-Control-Allow-Credentials", "true");

    if (context.Request.Method == "OPTIONS") {
        context.Response.Headers.Add ("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        context.Response.Headers.Add ("Access-Control-Allow-Headers", "Content-Type, Accept, User, x-requested-with");
    }

#if RUN_ON_WINDOWS`

    if (context.Request.Method != "OPTIONS" && !context.Request.HttpContext.User.Identity.IsAuthenticated) {
        context.Response.StatusCode = 401;
        return; //Stop pipeline and return immediately.
    }

#endif`

    await next ();
});

...之后...

    app.UseStaticFiles ()
    .UseSignalR (routes => {
        routes.MapHub<LiveMarginSource> ("/api/liveMarginHub");
    })
    .UseStatusCodePages ()
    .UseMvc ()
    .UseSwagger ()
    .UseSwaggerUI (c => { c.SwaggerEndpoint ("/swagger/v1/swagger.json", "Collateral Management API"); });

然后在客户端中... @aspnet/signalr@^1.1.4

connectLiveMargin = () => {
const liveMarginHub = new SignalR.HubConnectionBuilder()
    .withUrl('http://localhost:5000/api/liveMarginHub')
    .configureLogging(SignalR.LogLevel.Debug)
    .build();

liveMarginHub.on('ReceiveMessage', data => {
    console.log(data);
    // find the data row and update
});

liveMarginHub.start()
    .catch(err => console.log(err));
}

但是我无法建立连接

enter image description here

SignalR本身似乎在以这种方式启动Chrome浏览器时工作"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/Chrome dev session" --disable-web-security

解决方案(至少在客户端和服务器都在我的本地计算机中时有效) 然后,我尝试了一些已发布的尝试以下方式,尽管我不喜欢以这种方式或作为应用程序设置来指定来源。要测试在部署到服务器或在Linux的Kubernetes容器中运行时的行为

services.AddCors(options => {
                options.AddPolicy("SignalRPolicy",
                builder => {
                    builder.WithOrigins(new string[] { "http://localhost:3000" })
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials();
                });
            });

之后...

app.UseCors("SignalRPolicy")
        .UseStaticFiles()
        .UseStatusCodePages()
        .UseMvc()
        .UseSignalR(routes => {
                routes.MapHub<LiveMarginSource>("/api/liveMarginHub");
            })
        .UseSwagger()
        .UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Collateral Management API"); });

1 个答案:

答案 0 :(得分:0)

在这种情况下,buildUrl怎么办?

以为您的代码应该是这样,而问题可能来自buildUrl

 const connection = new signalR.HubConnectionBuilder()
        .withUrl("/liveMarginHub")
        .configureLogging(signalR.LogLevel.Information)
        .build();