Как включить Cors в службе Signalr Azure - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь использовать службу Azure SignalR в веб-приложении, содержащем только класс концентратора.Когда я пытаюсь получить доступ из другого домена к концентратору, я получаю следующую ошибку

"Доступ к XMLHttpRequest в" https://*/genericSocketHub/negotiate' из источника "https://localhost:44303' заблокирован политикой CORS: Ответ на предпечатную проверкузапрос не проходит проверку контроля доступа: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». ".

В классе startup.cs моего проекта:

`открытый класс Startup {public IConfiguration Configuration {get;}

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }


    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver())
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddCors(o => o.AddPolicy("Policy", builder =>
        {
            builder.AllowAnyOrigin()
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials();
        }));
        services.AddSignalR().AddAzureSignalR(Configuration.GetConnectionString("AzureSignalRConnectionString")).AddJsonProtocol(options => options.PayloadSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = new DefaultContractResolver()});
        services.AddSingleton(Configuration);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseCors("Policy");
        app.UseAzureSignalR(routes =>
        {
            routes.MapHub<GenericSocketHub>("/genericSocketHub");
        });
        app.UseMvc();

    }
}`

Без использования службы Azure SignalR у меня не было проблем с CORS

1 Ответ

0 голосов
/ 02 января 2019

Попробуйте добавить .WithOrigins("[THE_DOMAIN_TO_UNBLOCK]"); к вашей политике:

services.AddCors(o => o.AddPolicy("Policy", builder =>
    {
        builder.AllowAnyOrigin()
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
            .WithOrigins("[THE_DOMAIN_TO_UNBLOCK]");
    }));

Также убедитесь, что на сервере установлена ​​последняя версия Microsoft.Asure.SignalR вместе с последней @aspnet/signalr установлено на клиенте.

ПРИМЕЧАНИЕ Пакет signalr npm не совместим с Azure SignalR.Я научился этому нелегко.

Следующее сработало для моей установки, а именно Angular7, .NET CORE 2.1 и Azure SignalR.Моя установка выглядит следующим образом:

ConfigureServices

// Add CORS
  services.AddCors(options =>
  {
    options.AddPolicy("AllowAllOrigins",
              builder =>
              {
                builder
                  .AllowAnyOrigin()
                  .AllowAnyHeader()
                  .AllowCredentials()
                  .AllowAnyMethod()
                  .WithOrigins("http://localhost:4200");
              });
  });

  // Add Azure SignalR
  services.AddSignalR().AddAzureSignalR();

Настройка

app.UseCors("AllowAllOrigins");

app.UseAzureSignalR(routes =>
{
  routes.MapHub<NextMatchHub>("/nextmatch");
});

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

ПРИМЕЧАНИЕ Убедитесь, что различные реализации добавлены в том же порядке, что и мой пример, показанный выше.Я не могу объяснить, почему он так чувствителен к порядку, но с моей стороны это тоже было проблемой.

...