SignalR Core работает на локальном хосте, но не на Azure Сервисе приложений - PullRequest
3 голосов
/ 27 января 2020

У меня есть клиентская программа (приложение WPF на. Net 4.8) и веб-API (. Net Core 3.1). Я пытаюсь заставить их общаться через SignalR Core. Он отлично работает, когда оба работают локально на моем P C (то есть на локальном хосте). Но как только я публикую sh мой API в Azure Службе приложений (и указываю приложению WPF на новый URL), он не работает. SignalR устанавливает соединение, но когда API отправляет данные в приложение WPF, приложение никогда не получает их.

Я не уверен, связано ли это с CORS. CORS на Azure Служба приложений отключена. В моем веб-API я вот этот Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddCors(options =>
        {
            options.AddPolicy(MyAllowSpecificOrigins,
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()                    
                );
        });

        string connectionString = Configuration.GetConnectionString("eBallDatabase");
        services.AddDbContext<EBallContext>(options =>
                options.UseSqlServer(connectionString));

        var config = new AutoMapper.MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new AutoMapperProfileConfiguration());
        });
        var mapper = config.CreateMapper();
        services.AddSingleton(mapper);

        services.AddSignalR(options =>
        {
            options.EnableDetailedErrors = true;
        });

        services.AddApplicationInsightsTelemetry();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseCors("corsPolicy");
        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }

Я думаю, что однажды прочитал, что у вас не может быть AllowAnyOrigin () с SignalR. Вам необходимо указать желаемое происхождение. Но я не уверен, каким будет мое происхождение, так как это приложение WPF, работающее на компьютерах разных пользователей, все с разными доменами / IP-адресами.

Как я уже сказал, оно отлично работает, когда все находится на loclahost. Но как только API включается в Azure Службу приложений, им удается установить sh соединение SignalR, но это все. Приложение WPF не получает данных от API.

Есть идеи?

1 Ответ

3 голосов
/ 28 января 2020

Да, вам нужно указать происхождение. И порядок CORS методов также имеет значение. И вам нужен CORS для связи между вашим приложением Framework и основным приложением. NET. Таким образом, вы можете попробовать это:

services.AddCors(options =>
{
    options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://yourFrameworkApp.azurewebsites.com")
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials()
        .SetIsOriginAllowed((host) => true));
});

Также вы можете увидеть на стороне клиента, какая ошибка возникает при подключении к концентратору. Например, когда клиентская сторона вызывает конечную точку вашего концентратора для согласования, вы можете получить ошибку:

CORS - попробуйте добавить ее, как показано ниже.

404 не найдено - вы указание на неверный контроллер / концентратор.

405 метод не разрешен - это когда пользователь не авторизован для вызова методов в вашем концентраторе.

Кроме того, при запуске (метод Configure ) проверьте, добавляете ли вы веб-сокеты:

app.UseWebSockets();

Редактировать : вы также можете попробовать использовать Azure SignalR, чтобы вам не приходилось беспокоиться о проблемах такого типа.

...