【问题标题】:SignalR Core works on localhost but not on Azure App ServiceSignalR Core 适用于 localhost 但不适用于 Azure 应用服务
【发布时间】:2020-05-13 04:50:59
【问题描述】:

我有一个客户端程序(.Net 4.8 上的 WPF 应用程序)和一个 Web API(.Net Core 3.1)。 我试图让两者通过 SignalR Core 进行通信。 当两者都在我的 PC 上本地运行时(即在本地主机上),它可以完美运行。 但是,一旦我将我的 API 发布到 Azure App Service(并将 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 地址。

就像我说的,当一切都在 locahost 上时,它可以完美运行。但是只要 API 在 Azure App Service 上,两者就会设法建立 SignalR 连接,仅此而已。 WPF 应用未从 API 接收任何数据。

有什么想法吗?

【问题讨论】:

    标签: wpf signalr webapi .net-core-3.1


    【解决方案1】:

    是的,您需要指定来源。 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 未找到 - 您指向错误的控制器/集线器。

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

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

    app.UseWebSockets();
    

    编辑:您也可以尝试使用Azure SignalR,这样您就不必担心此类问题了。

    【讨论】:

    • 感谢 Kiril512 的回复。我会在我回家的时候尝试一下。快速提问,当您说我必须将 Origin 指定为“yourFrameworkApp.azurewebsites.com”时,这是托管 API 的 URL 吗?或者这是 WPF 应用程序的 URL?因为 WPF 应用程序没有 URL - 它是在不同用户计算机上运行的 Windows 应用程序...
    • 另外,有趣的是,当 WPF 应用程序连接到 SignalR 集线器时,我没有收到错误消息。连接实际上是成功的。但是,当 API 尝试将 SignalR 数据发送到 WPF 应用程序时,WPF 应用程序不会接收到数据。 (除非 API 也在 localhost 上运行,然后 WPF 应用程序接收数据)
    • @FabricioRodriguez "yourFrameworkApp.azurewebsites.com" 是托管应用程序的位置,而不是客户端 WPF 应用程序。
    • 好的,那么 API 托管在哪里?抱歉,试图理解..
    • 感谢 Kiril512。我不知道为什么,但使用 .SetIsOriginAllowed((host) => true));做到了!有一次我有类似的东西: .SetIsOriginAllowed(_ => true));从来没有工作过......
    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 2012-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2017-02-03
    • 2014-04-19
    • 2019-09-09
    相关资源
    最近更新 更多