SignalR Core 未在 Azure 应用服务中使用 Websocket

Posted

技术标签:

【中文标题】SignalR Core 未在 Azure 应用服务中使用 Websocket【英文标题】:SignalR Core not using Websockets in Azure App Service 【发布时间】:2018-04-13 14:52:37 【问题描述】:

我正在开发一个使用以下堆栈的 SignalR Core Web 应用程序:

ASP.NET Core 2.1 预览版 2 (2.1.0-preview2-final) SignalR Core 1.0 预览版 2 (1.0.0-preview2-final) Microsoft.AspNetCore.Cors (2.1.0-preview2-final) Microsoft.AspNetCore.WebSockets (2.1.0-preview2-final)

客户端正在使用 SignalR NPM 包 (@aspnet/signalr)。

应用配置如下:

public void ConfigureServices(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddPolicy(
            "CorsPolicy",
            builder => builder
                .AllowCredentials()
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
    );

    services.AddSignalR();


public void Configure(IApplicationBuilder app)

    app.UseCors("CorsPolicy");
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseWebSockets();
    app.UseSignalR(routes =>
    
        routes.MapHub<ClientHub>("/hubs/notifications");
    );

http://localhost本地运行时,客户端使用WS协议进行连接。但是在 Azure App Service 中部署时,它会回退到 SSE。

浏览器日志显示:

WebSocket connection to 'wss://xxxxxx.azurewebsites.net/hubs/notifications?id=ZRniWKpMLMPIyLhS5RSyAg' failed: Error during WebSocket handshake: Unexpected response code: 503
Information: SSE connected to https://xxxxxx.azurewebsites.net/hubs/notifications?id=ig47oOdQzbasdgrlr0cHaw

negotiate 方法似乎恢复了对 Websockets 的支持:

"connectionId":"ZRniWKpMLMPIyLhS5RSyAg",
 "availableTransports":[
  "transport":"WebSockets","transferFormats":["Text","Binary"],
  "transport":"ServerSentEvents","transferFormats":["Text"],
  "transport":"LongPolling","transferFormats":["Text","Binary"]]

我错过了什么吗?还是不支持 WSS?

【问题讨论】:

您是否在 Azure 应用服务实例上启用了 WS? /facepalm 我没看到有这样的设置 【参考方案1】:

回答我自己的问题,Websocket 连接失败不是 ASP.NET Core 或堆栈的问题,而是由于 Azure 应用服务需要在 应用程序设置:

【讨论】:

我在我的网络应用程序上看不到该设置,我只看到 Always On,还有其他设置可以启用吗? 他们仍然在那里,显然已经过去了一年多,因为这个答案和 UI 必然会改变。设置 > 配置,然后在常规设置选项卡中。这可能是您的应用服务定价层的限制? 您好,感谢您的重播并打算更新此内容。我做了一些研究,结果发现该功能目前不适用于 Linux 主机,但您可以启用 ARR Affinity with always on 以实现类似的行为。我确实同意原件是旧的,目的是试图找出我是否遗漏了一些东西。 嗨,有一个问题。使用套接字部署了 asp.net web api。它在天蓝色托管后在本地工作,但它不起作用。我们已经在 Azure App 服务中启用了 websocket。但没有得到连接。建立连接时应该出错。【参考方案2】:

2022相关答案。

要在现代控制台上启用 Web 套接字,请转到 Home -&gt; App Services -&gt; your_app_name -&gt; (Settings) Configuration -&gt; General Settings 并将 Web sockets 属性设置为 On

【讨论】:

以上是关于SignalR Core 未在 Azure 应用服务中使用 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

如何测试托管在Azure Appservice上的SignalR应用(负载+功能结合)?

如何在 Asp .Net Core SignalR Hub 中获取不记名令牌?

.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展

.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展

Azure WebJobs (3.x) 连续作业未在仪表板中显示函数

如何测试托管在 Azure Appservice 上的 SignalR 应用程序(负载 + 功能组合)