Compartilhar via


Walkthrough: Manipulando eventos da biblioteca de documentos

Windows SharePoint Services fornece eventos biblioteca documento que os desenvolvedores habilitar compilar após a plataforma SharePoint. Os desenvolvedores podem criar conjuntos código gerenciado que definam manipuladores para esses eventos e, em seguida, BIND os manipuladores para bibliotecas documento. Manipuladores de evento podem chamar para o modelo de objeto SharePoint para acessar os configuração e de conteúdo bancos de dados diretamente, ou eles podem invocar externo serviços, usando Windows SharePoint Services como uma interface usuário para outros sistemas.

Observação

Esta explicação passo a passo descreve um procedimento que é mantido para compatibilidade com versões anteriores com Windows SharePoint Services 2,0 wssversion2short manipulação de eventos.

Pré-requisitos

A seguinte tabela descreve os eventos de documento bibliotecas que Windows SharePoint Services fornece.

Evento Descrição

Desfazer Check-out

As alterações feitas para um verificadas - out documento são desfeito.

Verificar em

Um documento é verificado em para a biblioteca.

Fazer check-out

Um documento está check-out da biblioteca.

Cópia

Um documento na biblioteca é copiado.

Excluir

Um documento é excluído da biblioteca.

Inserção

Um novo documento é salvo a biblioteca.

Mover ou renomear

Um documento é movido ou renomeado.

Atualização

Um documento existente ou o valor de um personalizado coluna na biblioteca é editada.

O contexto de Windows SharePoint Services, um manipulador de eventos é uma classe Microsoft.NET que implementa o IListEventSink interface, cujo método um, OnEvent, é usado dentro de manipulador. O objeto SPListEvent T:Microsoft.SharePoint.SPListEvent contém informações sobre um evento que ocorre, e você poderá retornar o tipo de evento através de Type P:Microsoft.SharePoint.SPListEvent.Type propriedade. Use o Site P:Microsoft.SharePoint.SPListEvent.Site para acessar o modelo objeto do espaço para nome do Microsoft.SharePoint dentro de manipulador.

Você deve instalar o gerenciado assembly que define um manipulador de eventos na cache global de assemblies. Na configuração farm servidor, você deve instalar esta gerenciado assembly na cache global de assemblies de cada servidor Web front-end.

Para implantar um manipulador de eventos em um servidor, manipulação de eventos deve ser habilitado na página Virtual Server General Settings em SharePoint Central Administration.

Somente os usuários com permissões totais para uma biblioteca documento podem adicionar evento manipuladores.

Configurações de evento

Os metadados lista para uma biblioteca documento vincula a classe de um manipulador de eventos a uma biblioteca by means of o seguinte propriedades. Os metadados podem ser definido na página para a biblioteca documento ou definições contidas no site front-end modelos através de codificar que implementa o EventSinkAssembly, EventSinkClass e propriedades EventSinkData P:Microsoft.SharePoint.Publishing.Internal.Administration.SPList.EventSinkData do SPList classe T:Microsoft.SharePoint.SPList, Document Library Advanced Settings. A seguinte tabela resume as configurações de evento.

Configuração Tipo Descrição

Assembly Name

String

O nome forte do arquivo assembly de manipulador de eventos que reside na cache global de assemblies.

Class Name

String

O totalmente qualificado, com diferenciação de maiúsculas e minúsculas Nome da classe dentro de assembly.

Properties

String

Um seqüência de caracteres arbitrário de personalizado propriedades para uso pela manipulador de eventos. O comprimento do seqüência de caracteres não pode exceder 255 caracteres.

Após instalar o assembly manipulador de eventos, na página de Document Library Advanced Settings de biblioteca de documento, especificar o nome forte do assembly na caixa Assembly Name. The strong name must be in the format Assembly_Name, Version=Version, Culture=Culture, PublicKeyToken=Public_Key_Token. Você pode obter esses valores navegando para %windir%\assembly em Windows Explorer. Como um exemplo, o nome forte para o Microsoft.SharePoint assembly Microsoft.SharePoint lembra Microsoft.SharePoint, Version=12.0.0.0, Culture=Neutral, PublicKeyToken=71e9bce111e9429c.

O valor que você especificar na caixa a Class Name deve ser o com diferenciação de maiúsculas e minúsculas completo, nome de uma classe definida no assembly especificado que implementa a interface IListEventSink T:Microsoft.SharePoint.IListEventSink. De exemplo, o nome completo da classe no seguinte exemplo seria myNamespace.myClass.

                    Namespace myNamespace

    Public Class myClass

        Inherits Microsoft.SharePoint.IListEventSink

        Public Sub OnEvent(evt As Microsoft.SharePoint.SPListEvent)

            'Add an announcement
            AddAnnouncement(evt)

        End Sub 'OnEvent

        Public Sub AddAnnouncement(evt As 
           Microsoft.SharePoint.SPListEvent)
        .
        .
        .
        End Sub 'AddAnnouncement

    End Class 'myClass

End Namespace 'myNamespace
                    namespace myNamespace
{
    public class myClass : Microsoft.SharePoint.IListEventSink
    {
        public void OnEvent(Microsoft.SharePoint.SPListEvent evt)
        {
            //Add an announcement
            AddAnnouncement(evt);
        }

        public void AddAnnouncement
           (Microsoft.SharePoint.SPListEvent evt)
        {
            .
            .
            .
        }
    }
}

Digitar um valor na caixa Propriedades é opcional. Este valor pode conter até 255 caracteres para uso pela manipulador de eventos.

Eventos em Relation para outros eventos

Um manipulador de eventos execução no contexto de Windows SharePoint Services não é possível gerar outros eventos. Para programa efeitos colaterais para um evento, você deve fornecer a codificar dentro de manipulador de eventos. O manipulador de eventos é chamado de forma assíncrona a partir de real solicitação.

Uma nova instância de uma classe manipulador de eventos é criada para cada evento. Conseqüentemente, não é possível armazenar estado na sua classe manipulador de eventos e esperam que ele persistir através de múltiplo eventos. No entanto, você pode criar um classe base para um manipulador de eventos ou múltiplo manipuladores evento que caches estado para que o mesmo objeto coletor pode ser usado para todos os eventos em uma biblioteca documento.

Armazenamento em cache as credenciais

Manipuladores de Eventos executar no contexto de Application Pool Identity de Serviços de Informações da Internet (IIS), uma conta que geralmente não tem permissões em Windows SharePoint Services. Se o manipulador precisa interagir com Windows SharePoint Services pelo modelo de objeto, você deve estabelecer e credenciais armazenar em cache a representação de um usuário. Acessando o modelo de objeto em um manipulador de eventos sem representação não é com suporte. Para informações, consulte Impersonating and Reverting na .NET Framework Developer's Guide em MSDN.

O contexto de segurança

Executa a segmento manipulador de eventos dentro a mesma conta pool de aplicativos como a aplicativo da Web SharePoint. Se, no entanto, o manipulador de eventos precisa executar em uma conta diferente para manipular Windows SharePoint Services ou um externo serviço, o desenvolvedor deve manter seu ou seu próprio usuário credenciais e gerenciar sua própria próprio contexto de segurança.

Erros e exceções

Exceções para manipuladores evento usados em Windows SharePoint Services são geradas nas seguinte condições, para que uma entrada log de eventos Microsoft Windows NT é criada:

  • O assembly para o manipulador não pode ser carregado.

  • A classe definindo o manipulador não foi encontrado.

  • A classe não implementar a interface IlistEventSink T:Microsoft.SharePoint.IlistEventSink.

  • O OnEvent M:Microsoft.SharePoint.IListEventSink.OnEvent(Microsoft.SharePoint.SPListEvent) método gera uma exceção.

Observação

Quando você reiniciar IIS, cada processo de trabalho IIS termina apenas após todos os seu enfileirado itens trabalho, incluindo solicitações HTTP e documento biblioteca eventos, completo suas tarefas.

Definições e modelos

Os desenvolvedores podem definir conjuntos de módulos (assemblies) manipulador de eventos dentro lista definições, que fornece um meio útil para implantação de soluções such as fluxo de trabalho-habilitado bibliotecas documento no qual os eventos são já ligado para o apropriado manipuladores. Um manipulador de eventos pode ser ligado a uma biblioteca documento por meio de EventSinkAssembly, EventSinkClass e EventSinkData EventSinkData atributos do elemento b2b26fee-eb45-48ac-99f1-65f725da293f lista no arquivo Schema.xml SCHEMA.XML para o tipo lista. Quando um usuário final cria uma biblioteca a interface de usuário (interface do usuário) de uma definição lista que especifica um manipulador de eventos, configurações evento lista são definidos automaticamente para os valores especificados na definição. Quando um usuário final salva uma biblioteca documento como um modelo lista, configurações evento especificadas por meio de interface do usuário são preservadas no modelo.

Para obter informações sobre definições e modelos de listas ou sites, consulte Trabalhando com Modelos de sites e definições.

Exemplo manipulador de eventos

A seguinte tarefa programação cria um manipulador de eventos que exclui a versão mais antiga de um arquivo em uma biblioteca documento quando o número de versões para o arquivo atinge um número especificado. Para estabelecer credenciais para o manipulador, um método retorna um token para o manipulador de eventos para representação de um usuário.

Procedimento

Para criar um manipulador de eventos biblioteca documento

  1. O menu arquivos em Visual Studio 2005, apontar para nova e, em seguida, clique em Project .

  2. Em caixa de diálogo o New Project, selecione Visual Basic projetos ou Visual C# projetos na caixa a Project Types.

  3. Na caixa a **** modelos, selecione da biblioteca de classes .

  4. Na caixa nome, tipo o nome do projeto, que essa tarefa é "DocLibHandler".

  5. Na caixa a **** local, tipo de caminho para o projeto e, em seguida, clique OK .

  6. Em Gerenciador de Soluções, clique com o botão direito do mouse o nó referências e clique Adicionar Referência no menu de atalho.

  7. On the .NET tab of the Add Reference dialog box, select Windows SharePoint Services in the list of components, click Select, and then click OK.

  8. Adicione o seguinte diretivas para o arquivo Class1.cs ou Class1.vb do projeto DocLibHandler depois que a diretiva System do sistema que está incluído Por padrão.

                              Imports System.Security.Principal
    Imports System.Runtime.InteropServices
    Imports Microsoft.SharePoint
    
                              using System.Security.Principal;
    using System.Runtime.InteropServices;
    using Microsoft.SharePoint;
    
  9. Altere o Espaço para Nome e Nome classe no arquivo Class1.cs ou Class1.vb ser DocLibEventHandler e DocVersionHandler, as follows.

                              Namespace DocLibEventHandler
    
       Public Class DocVersionHandler
          Implements IlistEventSink
    
                              namespace DocLibEventHandler
    {
        public class DocVersionHandler : IListEventSink
        {
    
  10. Add the OnEvent method of the IListEventSink interface to the DocVersionHandler class, as follows.

                              Private maxVersions As Integer = 5
    
    Sub IListEventSink.OnEvent(listEvent 
        As Microsoft.SharePoint.SPListEvent)
    
        ' TODO: ***** PROVIDE YOUR IMPLEMENTATION HERE ****
        ' Get the credentials (User_Alias, Domain, Password) that this 
        ' event sink instance should run as and initialize the wic 
        ' object by calling the CreateIdentity method
    
        Dim wic As WindowsImpersonationContext 
            = CreateIdentity(User_Alias, Domain, Password).Impersonate()
    
        If listEvent.Type = SPListEventType.Update OrElse listEvent.Type 
            = SPListEventType.CheckIn Then
    
            Dim site As SPWeb = listEvent.Site.OpenWeb()
            Dim file As SPFile = site.GetFile(listEvent.UrlAfter)
            Dim nDocVersions As Integer = file.Versions.Count
    
            While maxVersions > 0 AndAlso nDocVersions > maxVersions - 1
    
                file.Versions.Delete(0)
                nDocVersions = file.Versions.Count
    
            End While
    
        End If
    
        wic.Undo()
    
    End Sub 'IListEventSink.OnEvent
    
                              private int maxVersions = 5;
    
    void IListEventSink.OnEvent
        (Microsoft.SharePoint.SPListEvent listEvent)
    {
        /* TODO: ***** PROVIDE YOUR IMPLEMENTATION HERE ****
        Get the credentials (User_Alias, Domain, Password) that this 
        event sink instance should run as and initialize the wic object 
        by calling the CreateIdentity method*/
    
        WindowsImpersonationContext wic 
           = CreateIdentity(User_Alias, Domain, Password).Impersonate();
    
        if ((listEvent.Type == SPListEventType.Update) ||
            (listEvent.Type == SPListEventType.CheckIn))
        {
            SPWeb site = listEvent.Site.OpenWeb();
            SPFile file = site.GetFile(listEvent.UrlAfter);
            int nDocVersions = file.Versions.Count;
    
            while ((maxVersions > 0) && (nDocVersions 
                > (maxVersions - 1)))
            {
                file.Versions.Delete(0);
                nDocVersions = file.Versions.Count;
            }
        }
    
        wic.Undo();
    }
    
  11. O OnEvent M:Microsoft.SharePoint.IListEventSink.OnEvent(Microsoft.SharePoint.SPListEvent) método chama o seguinte método para representar uma conta com administrativo permissões.

    Importante

    Fazer não transmitir credenciais em Clear-Text, porque isso apresenta um risco de segurança.Para representar um usuário mais segura, você poderá retornar as informações programaticamente com funções fornecidas pelo sistema operacional para secreto obtendo dados a partir de usuário, such as o CryptProtectData e CryptUnprotectData CryptUnprotectData funções da Data Protection API (DPAPI).

    Incluir o seguinte método dentro de DocVersionHandler DocVersionHandler classe.

                              Protected Shared Function CreateIdentity(User As String, Domain 
        As String, Password As String) As WindowsIdentity
    
        ' The Windows NT user token.
        Dim tokenHandle As New IntPtr(0)
    
        Const LOGON32_PROVIDER_DEFAULT As Integer = 0
        Const LOGON32_LOGON_NETWORK As Integer = 3
    
        tokenHandle = IntPtr.Zero
    
        ' Call LogonUser to obtain a handle to an access token.
        Dim returnValue As Boolean = LogonUser(User, Domain, Password, 
           LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, tokenHandle)
    
        If False = returnValue Then
    
            Dim ret As Integer = Marshal.GetLastWin32Error()
            Throw New Exception("LogonUser failed with 
                error code: " + ret)
    
        End If
    
        System.Diagnostics.Debug.WriteLine(("Created user token: 
            " + tokenHandle))
    
        'The WindowsIdentity class makes a new copy of the token.
        'It also handles calling CloseHandle for the copy.
        Dim id As New WindowsIdentity(tokenHandle)
        CloseHandle(tokenHandle)
        Return id
    
    End Function 'CreateIdentity
    <DllImport("advapi32.dll", SetLastError := True)>  _
        Private Shared Function LogonUser(lpszUsername As String, 
                lpszDomain As String, _
            lpszPassword As String, dwLogonType As Integer, 
                dwLogonProvider As Integer, _
            ByRef phToken As IntPtr) As Boolean
    
    <DllImport("kernel32.dll", CharSet := CharSet.Auto)>  _
        Private Shared Declare Auto Function CloseHandle Lib 
            "kernel32.dll" (handle As IntPtr) As Boolean
    
                              protected static WindowsIdentity CreateIdentity(string User, 
        string Domain, string Password)
    {
        // The Windows NT user token.
        IntPtr tokenHandle = new IntPtr(0);
    
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_NETWORK = 3;
    
        tokenHandle = IntPtr.Zero;
    
        // Call LogonUser to obtain a handle to an access token.
        bool returnValue = LogonUser(User, Domain, Password, 
        LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
        ref tokenHandle);
    
        if (false == returnValue)
        {
            int ret = Marshal.GetLastWin32Error();
            throw new Exception("LogonUser failed with 
                error code: " +  ret);
        }
    
        System.Diagnostics.Debug.WriteLine("Created user token: 
            " + tokenHandle);
    
        //The WindowsIdentity class makes a new copy of the token.
        //It also handles calling CloseHandle for the copy.
        WindowsIdentity id = new WindowsIdentity(tokenHandle);
        CloseHandle(tokenHandle);
        return id;
    }
    
    [DllImport("advapi32.dll", SetLastError=true)]
    private static extern bool LogonUser(String lpszUsername, 
        String lpszDomain, String lpszPassword,
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    
    [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    private extern static bool CloseHandle(IntPtr handle);
    
  12. Para criar um nome forte para o assembly, vá para o Local_Drive : \Arquivos de Programas\Microsoft Visual Studio.NET 2003\SDK\v1.1\Bin Diretório ( Local_Drive : \Arquivos de Programas\Microsoft Visual Studio .NET\FrameworkSDK\Bin no Visual Studio.NET versão 7) através de uma prompt de comando e tipo sn -k Local_Drive :\DocLibHandler.snk, que cria uma chave arquivo para o assembly.

  13. Adicione o seguinte atributos para o arquivo assembly versão e chave para o arquivo AssemblyInfo do projeto, substituindo os atributos que são fornecidos Por padrão.

                              [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyKeyFile("Local_Drive:\\DocLibHandler.snk")]
    
  14. Clique em Solução de Compilação sobre o menu construir.

  15. Para instalar sua solução no cache global de assemblies, arrastar a dynamic-link library (DLL) do seu assembly para o Local_Drive : Diretório \WINDOWS\assembly em Windows Explorer.

  16. Na página a Virtual Server General Settings em SharePoint Central Administration, selecione em na seção de Event Handlers para habilitar uso de manipuladores evento sobre o servidor virtual.

  17. De uma exibição de biblioteca de documento para que você desejar para anexar o assembly manipulador de eventos, clique Modificar Definições e Colunas e em seguida, clique avançado alterar configurações sobre a página para personalizar a biblioteca documento.

  18. Na página de Document Library Advanced Settings, tipo de nome forte para o assembly na caixa Assembly Name. (Para exemplo, DocLibHandler, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=0fafac2a0cc92888.) Você pode get os valores usados no nome forte, clicando com o botão direito do mouse o DLL do seu assembly no Local_Drive : Diretório \WINDOWS\assembly e, em seguida, clicando em propriedades no menu de atalho.

  19. Digite o totalmente qualificado, com diferenciação de maiúsculas e minúsculas Nome da classe na caixa a Class Name, que esse exemplo é DocLibEventHandler.DocVersionHandler.

  20. Redefinir IIS digitando iisreset em um prompt de comando.

Próxima etapas

Para implementar o manipulador em uma biblioteca documento, versionamento deve ser habilitado na página a Document Library Settings para a biblioteca.