Errore durante la registrazione di SharePoint WebDeleting un ricevitore di eventi in alcuni ambienti

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

  •  19-09-2019
  •  | 
  •  

Domanda

Sto cercando di registrare un WebDeleting ricevitore di eventi all'interno di SharePoint.Questo funziona bene nel mio ambiente di sviluppo, ma non in diversi ambienti di staging.L'errore che tornare indietro è "Valore non compreso nell'intervallo previsto.".Ecco il codice che 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...
            }
        }
    }
});

Mi rendo conto che posso farlo attraverso un elemento di file (sto cercando l'approccio ora), ma preferisce utilizzare l'approccio sopra descritto.

Gli errori che ho di ottenere costantemente nei registri ULS sono:

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   

Tutte le idee?


AGGIORNAMENTO - Alcune cose interessanti che ho imparato...

Ho modificato il mio codice per effettuare le seguenti operazioni:

  • Io chiamo EventReceivers.Add() senza il GUID poiché la maggior parte degli esempi vedo non farlo
  • Dato l'evento ricevitore un Nome e un numero di Sequenza dal momento che la maggior parte degli esempi vedo che fare

Ho implementato questo cambiamento, insieme con alcuni extra traccia di dichiarazioni che vanno ai registri ULS e dopo aver fatto abbastanza iisresets e di compensazione, il GAC di mia assemblea, ho iniziato a vedere la mia nuova traccia dichiarazioni nei registri ULS e Non ho più avuto il problema!

Così, ho iniziato ad andare indietro verso il mio codice originale per vedere cosa cambia esattamente aiutato.Ho finalmente finito con la versione originale nel controllo del codice sorgente e ancora lavorato :-S.

Quindi la risposta è chiaramente che si tratta di un problema di cache.Tuttavia, quando mi è stato originariamente cercando di farlo funzionare ho provato IISRESETs, il riavvio di alcuni SharePoint services OWSTimer (questo, credo che gestisce l'evento curva, ma probabilmente non è coinvolta nel caso di registrazione in cui ricevo l'errore), e anche riavviare il computer per assicurarsi che non si assembly cache stava succedendo e che non ha aiutato prima.

L'unica cosa che devo andare su è forse seguente procedura:

  1. Chiaro global assembly cache di assembly che contiene il codice di registrazione di evento e di mancino classe.
  2. Fare un IISRESET.
  3. Disinstallare il WSP.
  4. Fare un IISRESET.
  5. Installare il WSP.
  6. Fare un IISRESET.

Per farlo funzionare non ho mai fatto un riavvio o riavviato SharePoint services, ma avevo fatto quelli prima di ottenere lavoro (prima di cambiare il mio codice).

Suppongo che avrei potuto scavare di più con Riflettore a vedere cosa riesco a trovare, ma credo che si arriva ad un punto morto (il codice non gestito) è abbastanza veloce.Mi chiedo che cosa potrebbe essere tenendo la vecchia DLL?Non riesco a immaginare che SQL Server potrebbe essere in qualche modo.Anche così, un reboot sarebbe risolto (l'intera fattoria, tra cui SQL Server sono sulla stessa macchina, in questo ambiente).

È stato utile?

Soluzione

Così, sembra che tutto il problema è stato la creazione di un ricevitore di eventi, fornendo il GUID.

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

Ora sto facendo:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

Purtroppo questo significa che quando voglio scoprire se l'evento è già registrato, devo fare qualcosa come il codice riportato di seguito invece di una singola nave.

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

Non è ancora chiaro il motivo per cui le cose sembrava indugiare e richiedono un po ' di pulizia (iisreset, riavvii, ecc.) quindi, se qualcuno altro ha questo problema da tenere a mente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top