es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función de Azure para SignalR (sin servidor) a la aplicación web

Así que estoy bastante atascado en esto. Hemos estado usando “Default” SignalR con nuestras aplicaciones web durante mucho tiempo y todo está bien.

Ahora queremos agregar una Azure Function que requiere que SignalR sea sin servidor. Puedo hacer que SignalR y la función de Azure funcionen fácilmente juntas.

Sin embargo, no puedo hacer que la aplicación web hable con SignalR, ya que dice:

“Crítico: El servicio devolvió un error de handshake: El servicio Azure SignalR está en modo sin servidor, no se permite la conexión del servidor.. Id: fe6a4f57-6293-4b6f-bdec-9040ff60aef5”

Entonces, mirando otros tutoriales como:

https://learn.microsoft.com/en-us/azure/azure-signalr/signalr-quickstart-dotnet-core
https://softchris.github.io/pages/dotnet-signalr.html#configure-signalr

Puedes hacerlo en JavaScript

const connection = new signalR.HubConnectionBuilder()
                .withUrl('https://*****-sb-staging-signalr.service.signalr.net/statushub')
                .build();
            bindConnectionMessage(connection);

Sin embargo, esto me da problemas de CORS, aunque SignalR acepta todo y tengo en mi Startup.cs

services.AddCors(options =>
            {
                options.AddDefaultPolicy(builder =>
                {
                    builder.WithOrigins("https://******-sb-staging-admin.azurewebsites.net/")
                        .AllowCredentials();
                });
            });

y

services.AddSignalR(srConfig => srConfig.EnableDetailedErrors = true).AddAzureSignalR();
services.AddCors();

¿Cómo demonios hago que una aplicación web hable con SignalR sin servidor?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando se debe al hecho de que Azure SignalR Service está en modo sin servidor, lo que no permite conexiones de servidor. Para resolver este problema, puedes utilizar la API REST de Azure SignalR Service para establecer una conexión entre tu aplicación web y el servicio SignalR.

    Aquí están los pasos que puedes seguir:

    1. Obtén la cadena de conexión de Azure SignalR Service desde el portal de Azure y añádela a la configuración de tu aplicación.
    2. En tu aplicación web, utiliza la API REST de Azure SignalR Service para negociar una conexión con el servicio SignalR. Aquí tienes un ejemplo en C#:

    var httpClient = new HttpClient();
    var negotiateUrl = $"https://{signalrServiceName}.service.signalr.net/api/v1/negotiate";
    httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {signalrServiceKey}");
    var response = await httpClient.GetAsync(negotiateUrl);
    var responseBody = await response.Content.ReadAsStringAsync();
    var negotiateResponse = JsonConvert.DeserializeObject<negotiationresponse>(responseBody);
    
    1. Una vez que la negociación sea exitosa, utiliza la respuesta de la negociación para establecer una conexión de SignalR en tu aplicación web. Aquí tienes un ejemplo en JavaScript:
    const connection = new signalR.HubConnectionBuilder()
        .withUrl(negotiateResponse.url, { accessTokenFactory: () => negotiateResponse.accessToken })
        .build();
    

    Con este enfoque, deberías poder establecer una conexión entre tu aplicación web y Azure SignalR Service incluso en modo sin servidor, sin enfrentar problemas de CORS.

    Nota: Asegúrate de reemplazar signalrServiceName y signalrServiceKey con los valores de tu cadena de conexión de Azure SignalR Service.

Comments are closed.