PROJECT SERVER 2013. MANEJADORES DE EVENTOS REMOTOS Y GRANDES CANTIDADES DE DATOS.

Buenas,

Este post que publicó Brian Smith en el blog de soporte de Project, sobre un problema al trabajar con manejadores de eventos, y grandes cantidades de datos en Project Server 2013, nos ha parecido lo suficientemente interesante como para traducirlo al castellano. El post original se puede encontrar en el siguiente enlace:

https://blogs.technet.microsoft.com/projectsupport/2017/04/20/project-server-remote-event-receivers-and-large-payloads/

“Esta publicación nace de un incidente de soporte reciente, donde un cliente había configurado un manejador de eventos, en el evento en concreto llamado “Statusing Approvals Updating”, y tenía configurado un receptor remoto de eventos. Este tipo de manejador de eventos usa un “endpoint”, localizado en el mismo servidor de Project Server, o en otro, o incluso en la nube; a diferencia del más comúnmente usado (por lo menos a nivel de instalación on-premises) que están basados en ensamblados instalados localmente.

El problema en sí estribaba cuando teníamos un número elevado de aprobaciones en el Centro de Aprobaciones (un número alrededor de 40 o más debiera ser suficiente para reproducir el problema), de tal manera que cuando se aprobaba uno o más registros, se enviaba al conjunto completo de datos a través del receptor remoto de eventos. El código remoto hace su trabajo y luego devuelve el resultado (pudiendo ser una solicitud de cancelación, o simplemente una modificación de los datos, dependiendo de la lógica de negocio). Es éste precisamente donde el proceso estaba fallando, recibiendo en este caso el error “Ha ocurrido un error al procesar uno o más registros”. Realmente depende del evento en cuestión el error preciso que nos podamos encontrar al sufrir este problema, pero el concepto principal está relacionado con tener una cantidad relevante de datos, lo cual podemos traducir como “un montón de algo yendo y viniendo al receptor remoto de eventos.”

Los errores que podemos encontrar en los logs de SharePoint son:

<<<<<<<<<<<<

04/20/2017 11:00:58.00    Microsoft.Office.Project.Server (0x8148)    0x9AC4    Project Server    Server-Side Events    ac35f    Medium    SEP: Calling endpointUrl https://localhost:34282/StatusEvents.svc failed. Error ‘Exception has been thrown by the target of an invocation.’ StackTrace ‘   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)     at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)     at System.Delegate.DynamicInvokeImpl(Object[] args)     at Microsoft.Office.Project.Server.Events.ServerEventProxy.CallRemoteEventReceiver(DelegateInfo del, PSContextInfo contextInfo, String name, IPreEventArgs args)     at Microsoft.Office.Project.Server.Events.ServerEventProxy.FirePreDelegate(PSContextInfo contextInfo, String name, IPreEventArgs args)’

04/20/2017 11:00:58.00    Microsoft.Office.Project.Server (0x8148)    0x9AC4    Project Server    Server-Side Events    7941    Information    Operation canceled by event handler: assembly: https://localhost:34282/StatusEvents.svc class: Statusing event: StatusingApprovalsUpdating handler: Microsoft.Office.Project.Server.Events.StatusingApprovalsUpdatingHandler, method: OnApprovalsUpdating
04/20/2017 11:00:58.03    w3wp.exe (0x6358)    0x6F0C    Project Server    Server-Side Events    aisz6    Warning    Standard Information:PSI Entry Point:   Project User: i:0#.w|domain\user Correlation Id: b296e649-f325-e711-810d-001dd8b73698  PWA Site URL: https://<myserver>/Event  SA Name: Project Server Service Application  PSError: GeneralActionCanceledByEventHandler (22000) Action canceled by event handler. Reason: (null).    30ebe99d-aae4-e0fd-0000-09216c843577

>>>>>>>>>>>>>>>>

El problema en sí estriba en que el proxy esperando la respuesta del receptor remoto de eventos estaba usando el enlace predeterminado http, y el valor por defecto de maxReceivedMessageSize es 65536. Si tenemos más de 20 aprobaciones, el tamaño de este mensaje puede ser excedido. La verdad es que no debe haber demasiados eventos en Project que tengan mensajes que puedan exceder esto, pero seguro actualización de aprobaciones no es el único que pueda exceder este límite.

La manera de solventar esto es sencilla, y puede ser implementada en el servidor, editando el fichero de configuración del servicio Microsoft Project Server Events. Éste fichero en cuestión se llama Microsoft.Office.Project.Server.Eventing.exe.config y puede ser localizado (en una instalación por defecto) en C:\Program Files\Microsoft Office Servers\15.0\Bin. Es recomendable realizar una copia antes de editarlo, y debemos añadir luego el siguiente  código XML una línea antes del final, entre los tags </runtime> y </configuration>:

<system.serviceModel>
< bindings>
< basicHttpBinding>
< binding name=”RemoteEventService” closeTimeout=”00:05:00″
openTimeout=”00:05:00″ receiveTimeout=”00:05:00″ sendTimeout=”00:05:00″
maxBufferPoolSize=”524288″ maxBufferSize=”2147483647″ maxReceivedMessageSize=”2147483647″>
< readerQuotas maxDepth=”32″ maxStringContentLength=”2147483647″
maxArrayLength=”2147483646″ maxBytesPerRead=”2147483647″ maxNameTableCharCount=”2147483647″ />
< /binding>
< /basicHttpBinding>
< /bindings>
< /system.serviceModel>

 

Una vez que hayamos editado el fichero (en todos los servidores) necesitaremos reiniciar el servicio Microsoft Project Server Events Service 2013 en todos los servidores donde esté activo, y ejecutar un IISRESET para asegurarnos que el nuevo valor se está usando.

Con esta modificación ahora podemos aprobar cientos de aprobaciones pendientes, las cuales son capaces, de esta manera, de pasar a través de mi receptor de eventos remotos y vuelta perfectamente.

No tiene mucha pinta, la verdad, que hagamos ningún tipo de modificación de este fichero a través de un fix, pero independientemente si así fuera, cada cual tendría que rehacer la corrección.”

 

Esperamos os resulte de interés, un saludo.

 

Jorge Puig