Erreur d'inscription récepteur d'événements SharePoint WebDeleting dans certains environnements
-
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:
- Effacer le GAC de l'assemblage qui contient le code d'enregistrement et d'événements de classe clapoteuses.
- Faire une IISRESET.
- Désinstaller le WSP.
- Faire une IISRESET.
- Installer le WSP.
- 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).
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.