【问题标题】:SignalR hub returning Error during WebSocket handshake: Unexpected response code: 302 Net Core Angular and AzureSignalR 集线器在 WebSocket 握手期间返回错误:意外响应代码:302 Net Core Angular 和 Azure
【发布时间】:2021-09-25 15:26:00
【问题描述】:

我有一个 Angular 应用程序,它通过 SignalR 连接到 Net Core 以获取信息。本地运行完美,但是当应用程序执行来自 Azure 的请求时会抛出此错误

到 'wss://mysite.azurewebsites.net/notifications?id=someId&access_token=sometoken' 的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:302 错误:无法启动传输“WebSockets”:未定义

但仍在返回数据并进行连接并带来信息,只是控制台上出现烦人的错误

这是我对 signalR 的 Angular Side 调用

  private createConnection() {
this.hubConnection = new signalR.HubConnectionBuilder()
                            .withUrl(`${this.libraryConfig.api.notification.baseUrl}/notifications`, { accessTokenFactory: () => this.access_token })
                            .build(); 
  }

这是我在 Net Core 上启动的代码

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = "https://sts.windows.net/tenat/v2.0";
                options.Audience = Configuration.GetSection("AzureAd").GetSection("Audience").Value;
                options.TokenValidationParameters.ValidateLifetime = true;
              options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        // If the request is for our hub...
                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) &&
                                (path.StartsWithSegments("/notifications")))
                        {
                            // Read the token out of the query string
                            context.Token = accessToken;
                        }
                        return Task.CompletedTask;
                    }
                };

            });

我一直在尝试所有我能找到的解决方案,但没有任何效果。

注意:我使用 Azure Active Directory 登录客户端

【问题讨论】:

  • 您的中心网址可能不(完全)正确。也许最后缺少斜线?
  • 它在本地完美运行,它正在返回 Azure 上的所有内容,不确定是什么导致了这个错误,因为最后集线器的 url 是相同的
  • 在 Azure 中启用日志记录并打开日志流。 SignalR 使用多种传输协议,因此它可能使用套接字失败并改用长轮询:docs.microsoft.com/en-us/aspnet/core/signalr/…

标签: angular azure .net-core azure-active-directory signalr-hub


【解决方案1】:

您需要在 Azure 应用服务中启用 Websocket。它位于配置 -> 常规设置

【讨论】:

  • 对包含 Angular 的应用服务和包含 API 的应用服务启用,但仍然没有
  • 您的网站托管在 example.com 您的 SignalR 应用托管在 signalr.example.com CORS 应在 SignalR 应用中配置为仅允许来源 www.example.com。 cors设置怎么样:docs.microsoft.com/en-us/aspnet/core/signalr/…
  • 另外,请检查以确保在身份验证完成后发生角度侧的 createConnection()。我认为这更像是您收到 302 重定向的情况
  • 身份验证后发生连接。我在 Azure 上没有 SignalR 的资源,正在使用由 net core api 应用程序创建的资源。我应该使用一个吗?
  • 不,那很好。您不需要使用 Signal R 服务。您能否捕获网络流量(chrome 中的 devtool)以查看有关此 302 重定向的详细信息? mysite.azurewebsites.net/notifications 也是您的中心,您的 Angular 应用程序网址是什么样的?
猜你喜欢
  • 2018-01-21
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2019-09-06
  • 2019-01-19
相关资源
最近更新 更多