Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Importante
Os suplementos do SharePoint atingiram o fim da vida útil no SharePoint Online em 2 de abril de 2026. Os suplementos hospedados no SharePoint e hospedados pelo provedor foram desativados e não funcionam mais no SharePoint Online, incluindo nuvens governamentais. As diretrizes de desenvolvimento, implantação e uso de suplementos são mantidas para referência histórica e para cenários aplicáveis do Servidor do SharePoint, não para novas soluções do SharePoint Online.
Os suplementos do Servidor do SharePoint implantados por meio de um catálogo de aplicativos local não são desativados por essa alteração. A aquisição de Suplementos do SharePoint do marketplace público terminou em 2 de abril de 2026 para o Servidor do SharePoint.
Essa desativação não desativa APIs REST do SharePoint, CSOM, JSOM ou SPFx (Estrutura do SharePoint). Para o SharePoint Online, use SPFx para extensões de interface do usuário e o Microsoft Entra ID para autenticação para aplicativos externos. Consulte o anúncio de desativação e as diretrizes de migração de suplemento.
Implemente operações assíncronas em Suplementos do SharePoint usando Trabalhos Web do Microsoft Azure.
Aplicável a: suplementos do SharePoint | SharePoint 2013 | SharePoint Online
O exemplo Core.QueueWebJobUsage mostra como criar e executar operações assíncronas usando suplementos hospedados pelo provedor e Trabalhos Web do Azure no Office 365.
Use esta solução para:
Melhore o desempenho de seus receptores de eventos remotos.
Migre para o SharePoint Online e implemente a mesma funcionalidade de trabalho de timer que você tinha em seu ambiente local do SharePoint.
Implemente operações de longa duração que você deseja executar em seu ambiente do SharePoint. Por exemplo:
Eventos AppInstalled executados por mais tempo do que o intervalo de tempo limite de 30 segundos. Há processos assíncronos nos manipuladores de eventos de suplemento. Para obter mais informações, consulte Manipular eventos em Suplementos do SharePoint e Criar um receptor de eventos de suplemento em Suplementos do SharePoint.
Provisionamento de conjunto de sites personalizado.
Operações que sincronizam dados entre o Office 365 e seus sistemas locais.
Operações que executam cálculos complexos.
O diagrama a seguir mostra uma arquitetura de alto nível dos componentes necessários e o fluxo de processamento entre esses componentes quando uma operação assíncrona é executada.
Para implementar operações assíncronas no suplemento hospedado pelo provedor usando Trabalhos Web do Azure:
Os usuários executam o suplemento implantado no SharePoint Online.
O suplemento hospedado pelo provedor fornece os parâmetros de entrada exigidos pelo Trabalho Web do Azure e adiciona uma nova mensagem à fila do Armazenamento do Azure.
A fila de Armazenamento do Azure dispara um evento em um WebJob do Azure em execução contínua para iniciar o processamento da nova mensagem.
O WebJob do Azure executa lógica de negócios personalizada em seu site do SharePoint Online.
Observação
Adicionar uma mensagem à fila de Armazenamento do Azure usa um processo diferente do processo que executa o Trabalho Web do Azure. Portanto, seu suplemento pode implementar operações assíncronas adicionando novas mensagens à fila usando um processo e, em seguida, usando o WebJob do Azure para lidar com essas mensagens em outro processo.
Antes de começar
Para começar, baixe o suplemento de exemplo Core.QueueWebJobUsage do projeto padrões e práticas do desenvolvedor do Office 365 no GitHub e, em seguida, crie uma conta do Azure, adicione detalhes a essa conta e verifique se o Azure WebJob está em execução.
Para criar uma conta de Armazenamento do Azure para acessar a fila de armazenamento do Azure:
Entre no seu portal do Azure.
Escolha Nova>Criação Rápidade Armazenamento de>Serviços de> Dados.
Em URL, insira seu nome de domínio. Por exemplo, insira contoso.
Em LOCALIZAÇÃO/GRUPO DE AFINIDADE, escolha uma localização apropriada.
Em REPLICATION, escolha Geo-Redundant.
Escolha CREATE STORAGE ACCOUNT (CRIAR CONTA DE ARMAZENAMENTO).
Para adicionar detalhes à sua conta de armazenamento recém-criada:
Quando a conta de Armazenamento do Azure for criada, escolha GERENCIAR CHAVES DE ACESSO.
Em Gerenciar Chaves de Acesso, copie o NOME DA CONTA DE ARMAZENAMENTO e a CHAVE DE ACESSO PRIMÁRIA.
Aplique a ID do cliente, o segredo do cliente e as informações da conta de Armazenamento do Azure a vários arquivos de configuração.
Em Helper Project\Core.QueueWebJobUsage.Console.SendMessage, abra Program.cs e insira a URL de seu site na caixa siteUrl .
Em Propriedades no Core.QueueWebJobUsage.Job, defina Copiar Local como True nas referências Microsoft.SharePoint.Client e Microsoft.SharePoint.Client.Runtime . Definir Copiar Local como Verdadeiro copia os assemblies referenciados para o Azure para que o Trabalho Web do Azure possa resolver as referências a esses assemblies.
Implante o Trabalho Web do Azure. Para obter mais informações, consulte Implantar um projeto de Trabalhos Web.
Para verificar se o trabalho Web do Azure está em execução:
Entre no seu portal do Azure.
Escolha aplicativos Web e, em seguida, escolha os Sites do Microsoft Azure que você inseriu.
Escolha WEBJOBS.
Verifique se o Trabalho Web do Azure aparece na lista e se AGENDAR está definido como Executado continuamente.
Escolha CONFIGURAR.
Nas configurações de suplemento, crie novas configurações de suplemento para ClientId e ClientSecret. Copie os pares de chave-valor ClientId e ClientSecret do arquivo Core.QueueWebJobUsage.Job\app.config.
Em cadeias de conexão, crie novas cadeias de conexão para AzureWebJobsDashboard e AzureWebJobsStorage. Copie os pares de chave e valor AzureWebJobsDashboard e AzureWebJobsStorage (nome) do arquivo Core.QueueWebJobUsage.Job\app.config e defina o tipo como Personalizado.
Escolha Salvar.
Aplicar definições de configuração
Use as informações na tabela a seguir para aplicar definições de configuração à solução Core.QueueWebJobUsage do Visual Studio.
| Local do arquivo | Chave a ser atualizada | Informações de valor a serem atualizadas |
|---|---|---|
| Auxiliar Project\Core.QueueWebJobUsage.Console.SendMessage\app.config | StorageConnectionString | Substitua [nome da sua conta] pelo nome da conta de armazenamento copiado do portal do Azure. |
| Substitua [Chave da Sua Conta] pela chave de acesso primária copiada do portal do Azure. | ||
| Core.QueueWebJobUsageWeb\web.config | StorageConnectionString | Substitua [YourAccountName] pelo nome da conta de armazenamento copiado do portal do Azure. |
| Substitua [YourAccountKey] pela chave de acesso primária copiada do portal do Azure. | ||
| Core.QueueWebJobUsage.Job\app.config | StorageConnectionString | Substitua [YourAccountName] pelo nome da conta de armazenamento copiado do portal do Azure. |
| Substitua [YourAccountKey] pela chave de acesso primária copiada do portal do Azure. | ||
| ClientId | Substitua [Sua ID do Suplemento] pela ID do cliente copiada do Core.QueueWebJobUsageWeb\web.config. | |
| ClientSecret | Substitua [Seu Segredo do Suplemento] pelo segredo do cliente copiado do Core.QueueWebJobUsageWeb\web.config. | |
| AzureWebJobsDashboard | Substitua [YourAccount] pelo nome da conta de armazenamento copiado do portal do Azure. | |
| Substitua [YourKey] pela chave de acesso primária copiada do portal do Azure. | ||
| AzureWebJobsStorage | Substitua [YourAccount] pelo nome da conta de armazenamento copiado do portal do Azure. | |
| Substitua [YourKey] pela chave de acesso primária copiada do portal do Azure. |
Observação
Se a ClientId e o ClientSecret em Core.QueueWebJobUsageWeb forem atualizados, por exemplo, quando você incrementar o número de versão no AppManifest.xml, certifique-se de atualizar a ClientId e o ClientSecret no Core.QueueWebJobUsage.Job\app.config.
Usando o suplemento Core.QueueWebJobUsage
A tabela a seguir descreve todos os projetos do Visual Studio na solução Core.QueueWebJobUsage.
| Projeto do Visual Studio | Descrição |
|---|---|
| Core.QueueWebJobUsage | Seu projeto de Suplemento do SharePoint. As seguintes permissões são necessárias:
|
| Core.QueueWebJobUsage.Common | Contém os objetos de negócios e o código de lógica de negócios, como os métodos para adicionar mensagens à fila de armazenamento, para essa solução. Este projeto está incluído para compartilhar objetos de negócios e lógica de negócios entre diferentes projetos. Talvez você não precise disso em sua implementação. |
| Core.QueueWebJobUsage.Job | O WebJob do Azure que é executado quando uma nova mensagem é adicionada à fila de Armazenamento do Azure. Este projeto contém seu código de lógica de negócios personalizado. |
| Core.QueueWebJobUsageWeb | O suplemento hospedado pelo provedor que contém a interface do usuário para o projeto Core.QueueWebJobUsage. |
| Helper Project\Core.QueueWebJobUsage.Console.SendMessage | Um projeto auxiliar que pode ser usado para validar as informações da conta de armazenamento e o processo de criação de filas, além de enviar mensagens para a fila para processamento sem configurar toda a solução descrita neste artigo. |
Quando você executa o exemplo de código Core.QueueWebJobUsage, o suplemento hospedado pelo provedor aparece e exibe dois botões: operação síncrona e operação assíncrona. Quando você escolhe Operação síncrona, btnSync_Click em Páginas\Default.aspx simula um processo síncrono de execução prolongada. Nesta amostra de código, btnSync_Click coloca o thread atual em suspensão por 10 segundos e, em seguida, cria uma biblioteca de documentos. Quando você escolhe Operação assíncrona, btnAsync_Click em Páginas\Default.aspx faz o seguinte:
Obtém o usuário atual.
Cria um objeto de negócios SiteModifyRequest que armazena os dados a serem incluídos na mensagem que está sendo enviada para a fila de Armazenamento do Azure. Nessa amostra de código, os dados que estão sendo enviados incluem o nome do usuário atual e a URL do site atual.
chama SiteManager(). AddAsyncOperationRequestToQueue para adicionar a mensagem à fila de Armazenamento do Azure.
Observação
The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.
protected void btnAsync_Click(object sender, EventArgs e)
{
var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
// Get the current user.
var currUser = clientContext.Web.CurrentUser;
clientContext.Load(currUser);
clientContext.ExecuteQuery();
// Create business object, and then add the request to the queue.
SiteModifyRequest request = new SiteModifyRequest() { RequestorName = currUser.Title, SiteUrl = Page.Request["SPHostUrl"] };
new SiteManager().AddAsyncOperationRequestToQueue(request,
ConfigurationManager.AppSettings["StorageConnectionString"]);
processViews.ActiveViewIndex = 1;
lblStatus.Text = "Asynchronous operation to create document library started.";
}
}
Em Core.QueueWebJobUsage.Common, em SiteManager.cs, AddAsyncOperationRequestToQueue faz o seguinte:
Cria um objeto CloudStorageAccount usando as informações de configuração AccountName e AccountKey no arquivo Core.QueueWebJobUsageWeb\web.config.
Cria um cliente de fila de Armazenamento do Azure usando CloudStorageAccount.CreateCloudQueueClient.
Usa CloudQueueClient.GetQueueReference para obter uma referência à fila de Armazenamento do Azure com um nome igual ao valor da constante SiteManager.StorageQueueName.
Usa CloudQueue.CreateIfNotExists para criar a fila de Armazenamento do Azure se ela não existir.
Usa CloudQueue.AddMessage para adicionar uma nova mensagem à fila do Armazenamento do Azure. O objeto de negócios modifyRequest é serializado em um objeto CloudQueueMessage, que é adicionado à fila de Armazenamento do Azure.
public void AddAsyncOperationRequestToQueue(SiteModifyRequest modifyRequest,
string storageConnectionString)
{
CloudStorageAccount storageAccount =
CloudStorageAccount.Parse(storageConnectionString);
// Get queue or create a new one if one does not exist.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference(SiteManager.StorageQueueName);
queue.CreateIfNotExists();
// Add a message to queue.
queue.AddMessage(new CloudQueueMessage(JsonConvert.SerializeObject(modifyRequest)));
}
Depois que a mensagem é adicionada à Fila de Armazenamento do Azure, um Trabalho Web do Azure em execução contínua aguarda e processa a nova mensagem. O WebJob do Azure é definido em Core.QueueWebJobUsage.Job. Quando o Azure WebJob é executado, Main em Core.QueueWebJobUsage.Job\Program.cs cria um novo JobHost e chama RunAndBlock. O JobHost coordena chamadas para métodos marcados com o atributo QueueTrigger e observa mensagens em uma fila específica. RunAndBlock garante que o Trabalho Web do Azure seja executado continuamente e chama ProcessQueueMessage, que é o método a ser disparado quando uma nova mensagem é adicionada à Fila de Armazenamento do Azure. O SDK de Trabalhos Web do Azure associa o thread principal a ProcessQueueMessage. Para obter mais informações, consulte Criar um WebJob .NET no Serviço de Suplemento do Azure.
static void Main()
{
var host = new JobHost();
// The following code ensures that the WebJob will run continuously.
host.RunAndBlock();
}
ProcessQueueMessage processa novas mensagens que são adicionadas à fila de Armazenamento do Azure por:
Usando o atributo QueueTrigger para especificar que ProcessQueueMessage deve ser acionado quando uma nova mensagem é gravada na fila com um nome igual ao valor de SiteManager.StorageQueueName.
Gravando no log para o WebJob do Azure usando a variável de log que foi passada como um parâmetro para ProcessQueueMessage.
Chamando SiteManager(). PerformSiteModification para executar um processo empresarial de longa duração no site. Nessa amostra de código, o thread é colocado em suspensão por 10 segundos e, em seguida, uma biblioteca de documentos é criada.
public static void ProcessQueueMessage(
[QueueTrigger(SiteManager.StorageQueueName)]
SiteModifyRequest modifyRequest, TextWriter log)
{
log.WriteLine(string.Format("{0} '{1}' {2} '{3}'.",
"Received new site modification request with URL",
modifyRequest.SiteUrl,
"from person named as ",
modifyRequest.RequestorName));
try
{
Uri targetSite = new Uri(modifyRequest.SiteUrl);
// Get the realm for the URL.
string realm = TokenHelper.GetRealmFromTargetUrl(targetSite);
// Get the access token for the URL.
// Requires this add-in to be registered with the tenant.
string accessToken = TokenHelper.GetAppOnlyAccessToken(
TokenHelper.SharePointPrincipal,
targetSite.Authority, realm).AccessToken;
// Get client context with access token.
using (var ctx =
TokenHelper.GetClientContextWithAccessToken(
targetSite.ToString(), accessToken))
{
// Call business logic code.
new SiteManager().PerformSiteModification(ctx, modifyRequest);
}
}
catch (Exception ex)
{
log.WriteLine(string.Format("Site modification to URL {0} failed with following details.", modifyRequest.SiteUrl));
log.WriteLine(ex.ToString());
throw;
}
}