Клиент SignalR не подключается к серверу по протоколу http - PullRequest
0 голосов
/ 09 июля 2020

Я сделал. NET Основной API с signalR, когда я загружаю приложение с протоколом https, я могу подключиться к клиенту signalR javascript, но когда я загружаю приложение с протоколом http - signalR js client может ' t подключиться к хабу. CORS работает нормально.

Мой код: Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.WithOrigins("http://localhost:3000")
                .AllowAnyMethod()
                .AllowCredentials()
                .AllowAnyHeader());
    });
    services.AddSignalR(options =>
    {
        options.EnableDetailedErrors = true;
    });
    services.AddControllers(options =>
    {
        options.EnableEndpointRouting = true;
    });
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
{
    logger.LogInformation($"Started Configure with is Production mode:{env.IsProduction()}");
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseCors("CorsPolicy");
    app.UseAuthorization();
    app.UseAuthentication();
    app.UseEndpoints(route =>
    {
        route.MapHub<ConnectionHub>("/chat");
        route.MapControllers();
    });
}

В моем приложении JS:

var connection = new signalR.HubConnectionBuilder()
          .withUrl("http://localhost:5066/chat") // WHEN I'M CHANGING TO HTTPS host - everything works fine
          .build();

// Create a function that the hub can call to broadcast messages.
connection.on("broadcastMessage", function (name, message) { });

connection.start()
    .then(function () {       
       connection.invoke("Send", name, messageInput.value); 
    })
    .catch((error) => {
       console.error(error.message);
    });

1 Ответ

0 голосов
/ 09 июля 2020

Что ж, я решил эту проблему, добавив объект параметров в клиент signalR (добавьте skipNegotiations: true). Честно говоря, пока не знаю, что это значит (завтра прочту смысл и напишу описание этого свойства).

// Start the connection.
        var connection = new signalR.HubConnectionBuilder()
          .withUrl("http://localhost:5066/chat", {
            skipNegotiation: false,
            transport: signalR.HttpTransportType.WebSockets| 
                       signalR.HttpTransportType.LongPolling |
                       signalR.HttpTransportType.serverSentEvents,
          })
          .build();

UPD: Ну, стало работать благодаря добавлению объекта options после строки url. Об этом объекте. Сначала signalR выполняет согласование (это похоже на какое-то рукопожатие между задней и передней панелями), и если тип транспорта - только веб-сокеты - вы должны его пропустить.

...