Error al registrar el receptor de eventos SharePoint WebDeleting en algunos entornos

StackOverflow https://stackoverflow.com/questions/2429159

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy intentando registrar un receptor de eventos WebDeleting dentro de SharePoint.Esto funciona bien en mi entorno de desarrollo, pero no en varios entornos de prueba.El error que recibo es "El valor no se encuentra dentro del rango esperado".Aquí está el código que uso:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite elevatedSite = new SPSite(web.Site.ID))
    {
        using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
        {
            try
            {
                elevatedWeb.AllowUnsafeUpdates = true;
                SPEventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
                eventReceiver.Type = SPEventReceiverType.WebDeleting;
                Type eventReceiverType = typeof(MyEventHandler);
                eventReceiver.Assembly = eventReceiverType.Assembly.FullName;
                eventReceiver.Class = eventReceiverType.FullName;
                eventReceiver.Update();
                elevatedWeb.AllowUnsafeUpdates = false;
            }
            catch (Exception ex)
            {
                // Do stuff...
            }
        }
    }
});

Me doy cuenta de que puedo hacer esto a través de un archivo de elementos de características (estoy probando ese enfoque ahora), pero preferiría usar el enfoque anterior.

Los errores que recibo constantemente en los registros de ULS son:

03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     Database                        6f8g    Unexpected  Unexpected query execution failure, error code 3621. Additional error information from SQL Server is included below. "The statement has been terminated." Query text (if available): "{?=call proc_InsertEventReceiver(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"  
03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     General                         8e2s    Medium      Unknown SPRequest error occurred. More information: 0x80070057   

¿Algunas ideas?


ACTUALIZACIÓN - Algunas cosas interesantes que he aprendido...

Modifiqué mi código para hacer lo siguiente:

  • Llamo a EventReceivers.Add() sin el GUID ya que la mayoría de los ejemplos que veo no hacen eso
  • Le di al receptor del evento un nombre y un número de secuencia, ya que la mayoría de los ejemplos que veo hacen eso

Implementé este cambio junto con algunas declaraciones de seguimiento adicionales que van a los registros de ULS y después de hacer suficientes iisresets y borrar el GAC de mi ensamblaje, comencé a ver mis nuevas declaraciones de seguimiento en los registros de ULS. y ¡Ya no me sale el error!

Entonces, comencé a regresar a mi código original para ver qué cambio ayudó exactamente.Finalmente terminé con la versión original en el control de fuente y todavía funcionó :-S.

Entonces, la respuesta es claramente que se trata de algún problema de almacenamiento en caché.Sin embargo, cuando originalmente estaba tratando de hacerlo funcionar, probé IISRESET, reiniciando algunos servicios de SharePoint OWSTimer (esto, creo, ejecuta el controlador de eventos, pero probablemente no esté involucrado en el registro del evento donde obtengo el error), y incluso un reinicio para asegurarse de que no se estuviera realizando ningún almacenamiento en caché del ensamblado, y eso no ayudó antes.

Lo único que tengo que seguir es tal vez seguir pasos como:

  1. Borre el GAC del ensamblado que contiene el código de registro y la clase de controlador de eventos.
  2. Haga un IISRESET.
  3. Desinstale el WSP.
  4. Haga un IISRESET.
  5. Instale el WSP.
  6. Haga un IISRESET.

Para que funcionara, nunca reinicié ni reinicié los servicios de SharePoint, pero lo hice antes de que funcionara (antes de cambiar mi código).

Supongo que podría investigar más con Reflector para ver qué puedo encontrar, pero creo que se llega a un callejón sin salida (código no administrado) bastante rápido.Me pregunto qué podría estar reteniendo la antigua DLL.No puedo imaginar que SQL Server lo sea de alguna manera.Aun así, un reinicio lo habría solucionado (toda la granja, incluido SQL Server, está en la misma máquina en este entorno).

¿Fue útil?

Solución

Por lo tanto, parece que todo el problema estaba creando el receptor de eventos, proporcionando el GUID.

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));

Ahora que estoy haciendo:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

Desafortunadamente esto significa cuando quiero averiguar si el evento ya se ha registrado, debo hacer algo como el código de abajo en lugar de uno solo revestimiento.

// Had to use the below instead of: web.EventReceivers[new Guid(MyEventReceiverId)]
private SPEventReceiverDefinition GetWebDeletingEventReceiver(SPWeb web)
{
    Type eventReceiverType = typeof(MyEventHandler);
    string eventReceiverAssembly = eventReceiverType.Assembly.FullName;
    string eventReceiverClass = eventReceiverType.FullName;

    SPEventReceiverDefinition eventReceiver = null;

    foreach (SPEventReceiverDefinition eventReceiverIter in web.EventReceivers)
    {
        if (eventReceiverIter.Type == SPEventReceiverType.WebDeleting)
        {
            if (eventReceiverIter.Assembly == eventReceiverAssembly && eventReceiverIter.Class == eventReceiverClass)
            {
                eventReceiver = eventReceiverIter;
                break;
            }
        }
    }

    return eventReceiver;
}

Aún no está claro por qué las cosas parecían persistir y requieren algo de limpieza (iisreset, se reinicia, etc.) así que si alguien más tiene este problema tener eso en cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top