СигналР без транспорта

При попытке запустить концентратор signal-r выдает сообщение "Ошибка: доступные транспорты не найдены".

Однако диагностический захват показывает, что согласование возвращает три доступных транспорта.

{
    "connectionId": "IsHpe_1ETRLz-flnJ3uKPg",
    "availableTransports": [
        {
            "transport": "WebSockets",
            "transferFormats": [
                "Text",
                "Binary"
            ]
        },
        {
            "transport": "ServerSentEvents",
            "transferFormats": [
                "Text"
            ]
        },
        {
            "transport": "LongPolling",
            "transferFormats": [
                "Text",
                "Binary"
            ]
        }
    ]
}

Это делается с помощью aspnetcore 2.1 preview2, и запуск выглядит так

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options => options.AddPolicy("AllowAny", x =>
          x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
        services.AddSignalR();
        services.AddOptions();
        services.Configure<AppSettings>(Configuration);
        var connectionStrings = Configuration.GetSection("ConnectionStrings");
        var defaultConnectionString = connectionStrings[Configuration["DefaultConnectionString"]];
        services.AddDbContext<au1.Model.ProwlerDbContext>(options => 
          options.UseSqlServer(defaultConnectionString));
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors("AllowAny");
        app.UseSignalR(routes =>
        {
            routes.MapHub<MessageHub>("/message");
        });
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }

Очевидно, что маршрут работает, иначе переговоры не появятся в сетевом трафике. При вызове http://local:5000/message с помощью браузера создается сообщение Connection ID required как и ожидалось.

Я оставил шаг?

На стороне клиента, вот как я пытался подключиться.

    this.signalr = new SignalR.HubConnection("http://localhost:5000/message");
    this.signalr.on("stateChange", (data: string) => {
        console.log(`SignalR: ${data}`);
        that.selection = data;
    });
    this.signalr.start().then(result=>{
        console.log("hub started");
    }).catch(err=>{
        console.log("hub failed to start");
    });

package.json говорит "_id": "@aspnet/signalr@1.0.0-preview1-update1",

.Csproj говорит <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.0.0-preview2-final" />

Это не одно и то же. Совместимы ли они, я не могу сказать.

Я не знаю, как они вышли из синхронизации, так как я опустил версию, чтобы получить последнюю версию каждого. Обновление npm привело клиента к preview2, и теперь я проведу повторное тестирование.

1 ответ

Решение

Версии сервера и клиента должны совпадать. Вам необходимо убедиться, что обе версии клиента совпадают, перейдя в файл.csproj (для версии сервера и / или версии клиента C#) и в package.json для версии клиента JavaScript/TypeScript если вы установили его с помощью npm.

Обратите внимание, что между предварительными просмотрами происходят серьезные изменения, поэтому вы не можете использовать -previewX клиент с previewY сервер.

Другие вопросы по тегам