Erro ao registrar o receptor de eventos SharePoint WebDeleting em alguns ambientes

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando registrar um receptor de eventos WebDeleting dentro do SharePoint. Esta multa trabalha em meu ambiente de desenvolvimento, mas não em vários ambientes de teste. O erro que eu voltar é "O valor não recai no intervalo esperado.". Aqui é o uso de código I:

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

Eu percebo que eu posso fazer isso por meio de um arquivo de elemento de recurso (Eu estou tentando essa abordagem agora), mas preferiria usar a abordagem acima.

Os erros que eu consistentemente obter nos logs ULS são:

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   

Todas as idéias?


Atualização - Algumas coisas interessantes que eu aprendi ...

Eu modifiquei meu código para fazer o seguinte:

  • Eu chamo EventReceivers.Add () sem a GUID desde a maioria dos exemplos que eu vejo não faça isso
  • deram ao evento receptor um número Nome e Sequence pois a maioria dos exemplos que vejo fazer isso

Eu implantado esta mudança, juntamente com algumas instruções de rastreamento extras que vão para os logs ULS e depois de fazer iisresets suficientes e limpar o GAC da minha montagem, eu comecei a ver os meus novos instruções de rastreamento nos logs ULS e eu já não tenho o erro!

Então, comecei a voltar para o meu código original para ver o que mudam exatamente ajudou. Eu finalmente acabou com a versão original no controle de origem e ainda trabalhou:. -S

Portanto, a resposta é claramente que é algum problema de cache. No entanto, quando eu estava originalmente tentando fazê-lo funcionar eu tentei IISRESETs, reiniciar alguns serviços do SharePoint OWSTimer (isso, eu acredito que corre o hander evento, mas provavelmente não está envolvida no registro de eventos onde eu estou recebendo o erro), e mesmo uma reinicialização para garantir que nenhum assembly cache estava acontecendo -. e que não ajuda antes

A única coisa que eu tenho que seguir em frente é talvez seguindo os passos, tais como:

  1. Desmarque a GAC ??do assembly que contém a classe de código de registro e hander evento.
  2. Faça um IISRESET.
  3. Desinstalar o WSP.
  4. Faça um IISRESET.
  5. Instale o WSP.
  6. Faça um IISRESET.

Para fazê-lo funcionar eu nunca fiz um reboot ou serviços do SharePoint reiniciado, mas eu tinha feito aqueles antes de fazê-lo funcionar (antes de mudar meu código).

Acho que eu poderia cavar mais com refletor para ver o que posso encontrar, mas acredito que você chegar a um beco sem saída (código não gerenciado) muito rápido. Eu me pergunto o que poderia ser segurando a velha DLL? Eu não posso imaginar que o SQL Server seria de alguma forma. Mesmo assim, uma reinicialização teria fixo que (todo o farm, incluindo o SQL Server estão na mesma máquina neste ambiente).

Foi útil?

Solução

Assim, parece que todo o problema estava criando o receptor de eventos, fornecendo a GUID.

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

Agora que eu estou fazendo:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

Infelizmente Isto significa que quando eu quero saber se o evento já está registrado, devo fazer algo como o código abaixo, em vez de um único liner um.

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

É ainda não está claro por que as coisas pareciam a relaxar e necessitam de alguma limpeza (iisreset, reboots, etc.) por isso, se alguém tem este problema manter isso em mente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top