Как настроить ядро ​​CORS ASP.NET SignalR - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь использовать SignalR из клиента Javascript для основного приложения ASP.NET с помощью пакета nuget Microsoft.AspNetCore.SignalR.1.1.0

Первый 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

РЕШЕНИЕ (по крайней мере, работает, когда клиент и сервер находятся на моей локальной машине) Затем я попробовал следующий способ, как некоторые опубликовали, хотя я не люблю указывать источник таким образом или в качестве настройки приложения. Чтобы проверить, как это будет вести себя при развертывании на сервере или при запуске в контейнере Kubernetes в Linux

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 голосов
/ 15 мая 2019

Что делать с buildUrl в этом случае?

Думаю, ваш код должен быть таким, и проблема может быть в buildUrl

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