繁体   English   中英

SignalR Core 适用于 localhost 但不适用于 Azure 应用服务

[英]SignalR Core works on localhost but not on Azure App Service

我有一个客户端程序(.Net 4.8 上的 WPF 应用程序)和一个 Web API(.Net Core 3.1)。 我试图让两者通过 SignalR Core 进行通信。 当两者都在我的 PC 上本地运行时(即在 localhost 上),它可以完美运行。 但是,一旦我将 API 发布到 Azure 应用服务(并将 WPF 应用指向新 URL),它就无法工作。 SignalR 建立连接,但是当 API 将数据发送到 WPF 应用程序时,应用程序永远不会收到它。

我不确定它是否与 CORS 相关。 Azure 应用服务上的 CORS 已禁用。 在我的 Web 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");
        });
    }

我想我曾经读过你不能在 SignalR 中使用 AllowAnyOrigin()。 您需要指定所需的原点。 但我不确定我的起源是什么,因为这是一个在不同用户计算机上运行的 WPF 应用程序,所有用户的计算机都具有不同的域/IP 地址。

就像我说的,当一切都在 loclahost 上时,它可以完美运行。 但是一旦 API 在 Azure 应用服务上,两者就设法建立 SignalR 连接,仅此而已。 WPF 应用程序不会从 API 接收任何数据。

有任何想法吗?

是的,您需要指定来源。 CORS方法的顺序也很重要。 并且您需要 CORS 来在您的 Framework 应用程序和 .NET Core 应用程序之间进行通信。 所以你可以试试这个:

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

您还可以在客户端查看连接到集线器时出现的错误。 例如,当客户端调用端点到您的集线器进行协商时,您可以:

CORS错误 - 尝试像下面那样添加它。

404 not found - 您指向错误的控制器/集线器。

405方法不允许 - 这是当用户无权调用集线器中的方法时。

此外,在您的启动(配置方法)上检查您是否正在添加 Web 套接字:

app.UseWebSockets();

编辑:您也可以尝试使用Azure SignalR这样您就无需担心此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM