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
O menu arquivos em Visual Studio 2005, apontar para nova e, em seguida, clique em Project .
Em caixa de diálogo o New Project, selecione Visual Basic projetos ou Visual C# projetos na caixa a Project Types.
Na caixa a **** modelos, selecione da biblioteca de classes .
Na caixa nome, tipo o nome do projeto, que essa tarefa é "DocLibHandler".
Na caixa a **** local, tipo de caminho para o projeto e, em seguida, clique OK .
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.
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.
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;
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 {
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(); }
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);
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.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")]
Clique em Solução de Compilação sobre o menu construir.
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.
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.
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.
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.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
.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.