Erreur d'inscription récepteur d'événements SharePoint WebDeleting dans certains environnements

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

  •  19-09-2019
  •  | 
  •  

Question

Je suis en train d'enregistrer un récepteur d'événements WebDeleting dans SharePoint. Cela fonctionne très bien dans mon environnement de développement, mais pas dans plusieurs environnements de mise en scène. L'erreur que je reviens est « La valeur ne tombe pas dans la plage attendue. ». Voici le code que j'utilise:

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...
            }
        }
    }
});

Je me rends compte que je peux le faire à travers un fichier élément caractéristique (je suis en train cette approche maintenant), mais préfère utiliser l'approche ci-dessus.

Les erreurs que je reçois régulièrement dans les journaux ULS sont:

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   

Toutes les idées?


Mise à jour - Certaines choses intéressantes que j'ai appris ...

Je modifié mon code pour faire ce qui suit:

  • J'appelle EventReceivers.Add () sans le GUID puisque la plupart des exemples que je vois ne le font pas
  • Gave le récepteur d'événements un Nom et numéro de séquence puisque la plupart des exemples que je vois faire que

Je déployé ce changement ainsi que quelques instructions de suivi supplémentaires qui vont aux journaux ULS et après assez faire iisresets et de compensation du GAC de mon assemblée, j'ai commencé à voir mes nouvelles déclarations de traces dans les journaux ULS et Je ne suis l'erreur!

Alors, j'ai commencé à revenir vers mon code d'origine pour voir ce changement exactement aidé. J'ai finalement retrouvé avec la version originale dans le contrôle de la source et encore travaillé. -S

La réponse est clairement qu'il est une question de mise en cache. Cependant, quand je l'origine essayé de le faire au travail, j'ai essayé IISRESETs, redémarrer certains services SharePoint OWSTIMER (cela, je crois que court le virage de l'événement, mais ne participe pas probablement dans l'enregistrement des événements où je reçois l'erreur), et même un redémarrage pour vous assurer qu'aucune mise en cache de montage se passait -. et cela n'a pas aidé avant

La seule chose que je dois aller est peut-être suivant les étapes telles que:

  1. Effacer le GAC de l'assemblage qui contient le code d'enregistrement et d'événements de classe clapoteuses.
  2. Faire une IISRESET.
  3. Désinstaller le WSP.
  4. Faire une IISRESET.
  5. Installer le WSP.
  6. Faire une IISRESET.

Pour le faire fonctionner, je ne ai jamais fait un redémarrage ou de services SharePoint redémarrés, mais je l'avais fait avant les faire marcher (avant de changer mon code).

Je suppose que je pourrais creuser plus avec réflecteur pour voir ce que je peux trouver, mais je crois que vous arrivez à une impasse (code non géré) assez rapide. Je me demande ce qui pourrait être tenue à l'ancienne DLL? Je ne peux pas imaginer que SQL Server serait en quelque sorte. Même si, un redémarrage aurait fixe (la ferme entière, y compris SQL Server sont sur la même machine dans cet environnement).

Était-ce utile?

La solution

Alors, il semble que le problème a été crée le récepteur d'événements en fournissant le GUID.

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

Maintenant que je fais:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

Malheureusement, cela signifie quand je veux savoir si l'événement est déjà enregistré, je dois faire quelque chose comme le code ci-dessous au lieu d'un seul paquebot.

// 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;
}

Il est toujours pas clair pourquoi les choses semblaient s'attarder et nécessitent un nettoyage (iisreset, redémarrage, etc.) donc si quelqu'un a ce problème garder cela à l'esprit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top