Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 12 de marzo de 2013
SignalRCuando desde un cliente javascript consumimos los servicios suministrados por un Hub de SignalR, lo habitual es usemos los proxies generados automáticamente, para lo que solemos incluir en nuestra página una referencia al script “/Signalr/Hubs” según la ruta por defecto.

Sin embargo, puede haber casos en los que no nos interesa este comportamiento y preferimos generarlo de forma manual para, por ejemplo, incluirlo en un bundle o distribuir el archivo a través de una CDN. Veamos cómo conseguirlo.

Los desarrolladores de SignalR han creado una herramienta de línea de comandos que, entre otras cosas, nos facilitará mucho esta tarea, por lo que lo primero que tenemos que hacer es descargarla e instalarla a través de Nuget:
PM> Install-Package microsoft.aspnet.signalr.utils 
[...]
Successfully installed 'Microsoft.AspNet.SignalR.Utils 1.0.1'.

Por supuesto, este primer paso podrías hacerlo también usando el interfaz gráfico, pero mejor que lo hagas ya desde la consola Nuget porque de todas formas nos va a hacer falta en el siguiente paso.

A continuación hay que ejecutar en la consola el siguiente comando:
PM> signalr.exe ghp /o:MyProject\scripts\hubs.js
SignalR Utility Version: 1.0.0.0
Creating temp directory 
  C:\Users\JmAguilar\AppData\Local\Temp\532fbeb3-55c9-44cb-ac94-3f831318ce89
Incluir script en el proyectoComo seguro podéis intuir, el parámetro /o permite indicar la ruta hacia el archivo que será generado. Es relativa a la solución, por esta razón hay que comenzarla desde la carpeta donde se encuentra el proyecto.

El parámetro "ghp" simplemente viene de "Generate Hub Proxies".

Al finalizar el proceso tendremos en la carpeta indicada el archivo, cuyo contenido será idéntico al obtenido al descargar desde la vista el script generado en /Signalr/Hubs. Eso sí, no aparecerá en Visual Studio hasta que lo incorporemos explícitamente al proyecto.

Hecho esto, ya podemos referenciarlo desde nuestras páginas:
<script src="Scripts/hubs.js"></script>
Podemos también introducir la generación de proxies en el proceso de build, asegurando así que el script siempre estará sincronizado con el resto de componentes. La única precaución a tener en cuenta es que la ruta del archivo generado, indicada en el parámetro /o, debe ser absoluta.

Por último, comentar que también es posible desactivar del servidor SignalR la generación de proxies, lo cual puede ser interesante si nuestros clientes estamos seguros de que no van a necesitarlo (por ejemplo, si tenemos sólo clientes .NET, o si hemos pregenerado los archivos de script), para evitar que usuarios del lado oscuro puedan obtener demasiada información sobre los Hubs y operaciones disponibles en servidor. En este caso, basta con indicar esta configuración en el momento de mapear los hubs, justo al arrancar la aplicación:
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableJavaScriptProxies = false;
RouteTable.Routes.MapHubs(hubConfiguration);
A partir de este momento, el script descargado a través de la dirección Signalr/hubs simplemente lanzará una excepción indicando que esta característica ha sido deshabilitada.

Publicado en Variable not found.

2 Comentarios:

Unknown dijo...

Bueno hice tal cual publicastes, todo bien, hasta cuando lo ejecuto y me sale el error de que la variable client no esta definida,
me supongo que eso no debia pasar si el js hub lo tengo referenciado despues de tenerlo en mi carpeta de scripts ya dentro del proyecto

josé M. Aguilar dijo...

Hola!

Efectivamente, no debía pasar. Una vez has generado el archivo .js, simplemente debes referenciarlo desde la página (eso sí, después de las bibliotecas jQuery y Signalr) y debe salir andando :)

Saludos.