Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Visual Studio fornece uma maneira de desenvolver, testar e implantar funções de biblioteca de classes C# no Azure. Se essa experiência for a primeira com o Azure Functions, confira a visão geral do Azure Functions.
Para começar imediatamente, considere concluir o início rápido do Functions para o Visual Studio.
Este artigo fornece informações detalhadas sobre como usar o Visual Studio para desenvolver funções de biblioteca de classes em C# e publicá-las no Azure. Há dois modelos para desenvolver funções de biblioteca de classes em C#: o modelo de trabalho isolado e o modelo em processo.
Você está lendo a versão do artigo sobre o modelo de trabalhador isolado. Você pode selecionar seu modelo preferencial na parte superior do artigo.
Você está lendo a versão do modelo em desenvolvimento deste artigo. Você pode selecionar seu modelo preferencial na parte superior do artigo.
Importante
O suporte para o modelo em processo termina em 10 de novembro de 2026. Recomendamos que você migre seus aplicativos para o modelo de trabalho isolado.
Os procedimentos e exemplos mostrados são para o Visual Studio 2022, a não ser que haja alguma indicação contrária. Para obter mais informações sobre as versões do Visual Studio 2022, consulte as notas de versão ou as notas de versão prévia.
Pré-requisitos
Visual Studio 2022, incluindo a carga de trabalho de Desenvolvimento do Azure.
Outros recursos necessários, como uma conta de armazenamento do Azure, são criados em sua assinatura durante o processo de publicação.
-
Se você ainda não tiver uma conta do Azure, crie uma conta gratuita antes de começar.
Criar um projeto do Azure Functions
O modelo de projeto do Azure Functions no Visual Studio cria um projeto de biblioteca de classes C# que você pode publicar em um aplicativo de funções no Azure. Você pode usar um aplicativo de funções para agrupar funções como uma unidade lógica para facilitar o gerenciamento, a implantação, o dimensionamento e o compartilhamento de recursos.
No menu do Visual Studio, selecione Arquivo>Novo>Projeto.
Na caixa de diálogo Criar um novo projeto , insira funções na caixa de pesquisa, selecione o modelo do Azure Functions e selecione Avançar.
Na caixa de diálogo Configurar seu novo projeto , para o nome do Projeto, insira um nome para seu projeto e selecione Avançar. O nome do aplicativo de funções deve ser válido como um namespace do C# e, portanto, não use outros caracteres não alfanuméricos, hífens ou sublinhados.
Na caixa de diálogo de Informações adicionais execute as ações listadas na tabela a seguir.
Configuração Ação Descrição Função de trabalho do Functions Selecione .NET 8.0 isolado (suporte a longo prazo). O Visual Studio cria um projeto de função que é executado em um processo de trabalho isolado. O processo de trabalho isolado também dá suporte a outras versões do .NET e do .NET Framework que não oferecem LTS (suporte a longo prazo). Para obter mais informações, consulte Visão geral de versões do Azure Functions runtime. Função Selecione Http trigger. O Visual Studio cria uma função disparada por uma solicitação HTTP. Usar o Azurite para a conta de armazenamento de runtime (AzureWebJobsStorage) Selecione essa caixa de seleção. Como um aplicativo de funções no Azure requer uma conta de armazenamento, ela será atribuída ou criada quando você publicar seu projeto no Azure. Um disparador HTTP não usa uma cadeia de conexão da conta de armazenamento. Todos os outros tipos de gatilho exigem uma cadeia de conexão de conta de armazenamento válida. Nível de autorização Selecione Anônimo. Quando você usa essa configuração de autorização, qualquer cliente pode disparar a função criada sem fornecer uma chave. Essa configuração facilita o teste da nova função. Para obter mais informações, confira Nível de autorização. Configuração Ação Descrição Função de trabalho do Functions Selecione .NET 8.0 em processo (suporte a longo prazo). O Visual Studio cria um projeto de função que é executado em processo com a versão 4.x do runtime do Functions. Para obter mais informações, consulte Visão geral de versões do Azure Functions runtime. Função Selecione Http trigger. O Visual Studio cria uma função disparada por uma solicitação HTTP. Usar o Azurite para a conta de armazenamento de runtime (AzureWebJobsStorage) Selecione essa caixa de seleção. Como um aplicativo de funções no Azure requer uma conta de armazenamento, ela será atribuída ou criada quando você publicar seu projeto no Azure. Um disparador HTTP não usa uma cadeia de conexão da conta de armazenamento. Todos os outros tipos de gatilho exigem uma cadeia de conexão de conta de armazenamento válida. Nível de autorização Selecionar Anônimo Quando você usa essa configuração de autorização, qualquer cliente pode disparar a função criada sem fornecer uma chave. Essa configuração facilita o teste da nova função. Para obter mais informações, confira Nível de autorização. Verifique se você definiu o Nível de autorização como Anônimo. Se você selecionar o nível padrão da Função, será necessário apresentar a chave de função em solicitações para acessar o ponto de extremidade da função.
Selecione Criar para criar o projeto de função e a função de gatilho HTTP.
Depois de criar um projeto do Functions, o modelo de projeto cria um projeto em C#, instala os pacotes NuGet Microsoft.Azure.Functions.Worker e Microsoft.Azure.Functions.Worker.Sdk, e define o framework de destino.
Depois de criar um projeto do Functions, o modelo de projeto cria um projeto em C#, instala o Microsoft.NET.Sdk.Functions pacote NuGet e define a estrutura de destino.
O novo projeto contém os seguintes arquivos:
host.json: esse arquivo fornece uma maneira de configurar o host do Functions. Essas configurações se aplicam para execução local e no Azure. Para obter mais informações, consulte a referência para host.json.
local.settings.json: esse arquivo mantém as configurações que você usa ao executar funções localmente. Essas configurações não são usadas quando seu aplicativo é executado no Azure. Para obter mais informações, consulte Trabalhar com as configurações do aplicativo localmente.
Importante
Como o arquivo local.settings.json pode conter segredos, você deve excluí-lo do controle do código-fonte do projeto. Na caixa de diálogo Propriedades desse arquivo, verifique se a configuração Copiar para Diretório de Saída está definida como Copiar se for mais recente.
Para obter mais informações, consulte a estrutura do projeto no guia de trabalho isolado.
Para saber mais, confira Projeto de biblioteca de classe de funções.
Trabalhar com configurações de aplicativo localmente
Quando seu aplicativo de funções é executado no Azure, as configurações exigidas por suas funções são armazenadas criptografadas nas configurações do aplicativo. Durante o desenvolvimento local, essas configurações são adicionadas à Values coleção no arquivo local.settings.json. O arquivo local.settings.json também armazena as configurações usadas pelas ferramentas de desenvolvimento locais.
Os itens da coleção Values no arquivo local.settings.json do seu projeto destinam-se a espelhar itens nas configurações de aplicativo do seu aplicativo de funções no Azure.
O Visual Studio não carrega automaticamente as configurações em local.settings.json quando você publica o projeto. Para que essas configurações também existam em seu aplicativo de funções no Azure, carregue-as depois de publicar seu projeto. Para obter mais informações, confira Configurações do aplicativo de funções. Os valores em uma ConnectionStrings coleção não são publicados.
Seu código também pode ler os valores de configurações do aplicativo de funções como variáveis de ambiente. Para obter mais informações, confira Variáveis de ambiente.
Configurar seu projeto para desenvolvimento local
O runtime do Functions usa uma conta de Armazenamento internamente. Durante o desenvolvimento, você pode usar uma conta de Armazenamento válida para essa conta interna ou usar o emulador do Azurite.
Para todos os tipos de gatilho que não sejam HTTP e webhooks, você precisa definir o valor da Values.AzureWebJobsStorage chave no arquivo local.settings.json :
- Para uma conta de armazenamento, configure o valor para a string de conexão da sua conta de armazenamento.
- Para o emulador, defina o valor como
UseDevelopmentStorage=true.
Se você usar o emulador, altere essa configuração para uma cadeia de conexão de conta de armazenamento real antes da implantação. Para mais informações, confira Emulador de armazenamento local.
Para definir a cadeia de conexão da conta de armazenamento, execute as seguintes etapas:
Entre no portal do Azure e vá para sua conta de armazenamento.
Selecione Segurança + chaves de acesso de> rede. Na chave1, copie o valor da cadeia de conexão .
No projeto do Visual Studio, abra o arquivo local.settings.json . Defina o valor da
AzureWebJobsStoragechave para a cadeia de conexão copiada.Repita a etapa anterior para adicionar as chaves exclusivas para a matriz de
Valuespara todas as outras conexões necessárias para as suas funções.
Adicionar uma função ao projeto
Em funções de biblioteca de classes C#, as associações que as funções usam são definidas aplicando atributos no código. Quando você cria seus gatilhos de função com base nos modelos fornecidos, os atributos de gatilho são aplicados para você.
No Gerenciador de Soluções, clique com o botão direito do mouse no nó do seu projeto e selecione Adicionar>Novo Azure Function.
Na caixa de diálogo Adicionar Novo Item , selecione a Função do Azure e, em seguida, selecione Adicionar.
Selecione um gatilho e defina as propriedades de associação necessárias. Se você selecionar um gatilho de serviço de armazenamento e quiser configurar a conexão, marque a caixa de seleção para configuração da conexão do gatilho. O exemplo a seguir mostra as configurações para criar uma função de gatilho de Armazenamento em Fila.
Selecione Adicionar. Se você selecionar a caixa de seleção para configurar uma conexão de armazenamento na etapa anterior, a página Conectar à dependência será exibida. Selecione um emulador de armazenamento do Azurite ou o Armazenamento do Azure e selecione Avançar.
- Se você selecionar um emulador de armazenamento do Azurite, a página Conectar ao emulador do Azurite de Armazenamento será exibida. Execute as seguintes etapas:
- Selecione Próximo.
- Na página Resumo das alterações , selecione Concluir. O Visual Studio configura a dependência e cria a classe de gatilho.
- Se você selecionar o Armazenamento do Azure, a página Conectar ao Armazenamento do Azure será exibida. Execute as seguintes etapas:
- Selecione uma conta de armazenamento e selecione Avançar. O Visual Studio tenta se conectar à sua conta do Azure e recuperar um endpoint.
- Selecione Próximo.
- Na página Resumo das alterações , selecione Concluir. O Visual Studio configura a dependência e cria a classe de gatilho.
Esse exemplo de gatilho usa uma configuração de aplicativo para a conexão de armazenamento com uma chave chamada
QueueStorage. Essa chave, armazenada no arquivolocal.settings.json, faz referência ao emulador do Azurite ou a uma conta de Armazenamento.- Se você selecionar um emulador de armazenamento do Azurite, a página Conectar ao emulador do Azurite de Armazenamento será exibida. Execute as seguintes etapas:
Examine a classe recém-adicionada. Por exemplo, a seguinte classe C# representa uma função básica de gatilho do Armazenamento de Filas:
Um
Run()método é atribuído comFunction. Esse atributo indica que o método é o ponto de entrada para a função.using System; using Azure.Storage.Queues.Models; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace Company.Function; public class QueueTriggerCSharp { private readonly ILogger<QueueTriggerCSharp> _logger; public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger) { _logger = logger; } [Function(nameof(QueueTriggerCSharp))] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message) { _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText); } }Um método estático
Run()é atribuído comFunctionName. Esse atributo indica que o método é o ponto de entrada para a função.using System; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; namespace Company.Function { public class QueueTriggerCSharp { [FunctionName("QueueTriggerCSharp")] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log) { log.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); } } }
Um atributo específico de associação é aplicado a cada parâmetro de associação fornecido ao método do ponto de entrada. O atributo utiliza as informações de associação como parâmetros.
No código anterior, é aplicado um atributo QueueTrigger ao primeiro parâmetro, o que indica uma função de gatilho do Armazenamento de Filas. O nome da fila e o nome de configuração da cadeia de conexão são passadas como parâmetros ao atributo QueueTrigger. Na sua turma:
- O parâmetro de nome da fila deve corresponder ao nome da fila que você usa em uma etapa anterior para criar o gatilho, como
myqueue-items. - O nome da configuração da cadeia de conexão deve corresponder ao que você usa em uma etapa anterior para criar o gatilho, como
QueueStorage.
Para obter mais informações, confira Gatilho do Armazenamento de Filas do Azure para o Azure Functions.
Use o procedimento anterior para adicionar mais funções ao projeto do aplicativo de funções. Cada função no projeto pode ter um gatilho diferente, mas uma função deve ter apenas um gatilho. Para obter mais informações, consulte gatilhos e associações do Azure Functions.
Adicionar associações
Assim como acontece com gatilhos, as associações de entrada e saída são adicionadas à sua função como atributos de associação. Para adicionar associações a uma função, execute as seguintes etapas:
Verifique se você configurou o projeto de desenvolvimento local.
Adicione o pacote de extensão NuGet apropriado para cada associação específica. Para obter requisitos de pacote NuGet específicos da associação, confira o artigo de referência para a associação. Por exemplo, para obter requisitos de pacote para o gatilho dos Hubs de Eventos do Azure, confira Gatilhos e associações dos Hubs de Eventos do Azure para o Azure Functions.
Use o seguinte comando no Console do Gerenciador de Pacotes para instalar um pacote específico:
Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>Nesse código, substitua
<BINDING_TYPE>pelo nome específico da extensão de associação e substitua<TARGET_VERSION>por uma versão específica do pacote, como4.0.0. Versões válidas são listadas nas páginas de pacotes individuais em NuGet.org.Se houver configurações de aplicativo exigidas pela associação, adicione-as à coleção
Valuesno arquivo de configuração local.A função usa esses valores quando ele é executado localmente. Quando a função é executada no aplicativo de funções no Azure, ela usa configurações do aplicativo de funções. O Visual Studio facilita a publicação de configurações locais no Azure.
Adicione o atributo de associação apropriado para a assinatura do método. No código a seguir, uma mensagem de fila dispara a função
Run. Em seguida, a associação de saída cria uma nova mensagem de fila com o mesmo texto em uma fila diferente.public class QueueTrigger { private readonly ILogger _logger; public QueueTrigger(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<QueueTrigger>(); } [Function("CopyQueueMessage")] [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")] public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem) { _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); return myQueueItem; } }O atributo
QueueOutputdefine a associação no método. Para várias associações de saída, coloque esse atributo em uma propriedade de cadeia de caracteres do objeto retornado. Para obter mais informações, consulte Várias associações de saída.public static class SimpleExampleWithOutput { [FunctionName("CopyQueueMessage")] public static void Run( [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy, ILogger log) { log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}"); myQueueItemCopy = myQueueItem; } }O atributo
Queueno parâmetrooutdefine a associação de saída.A conexão com o Armazenamento de Filas é obtida a partir da configuração
QueueStorage. Para saber mais, confira o artigo de referência da associação específica.
Para ver uma lista completa das vinculações compatíveis com o Functions, confira Vinculações compatíveis. Para obter um exemplo mais completo desse cenário, consulte Conectar funções ao Armazenamento do Azure usando o Visual Studio.
Executar funções localmente
Você pode usar as Ferramentas Principais do Azure Functions para executar projetos do Functions em seu computador de desenvolvimento local. Quando você pressiona F5 para depurar um projeto do Functions, o host local do Functions (func.exe) começa a escutar em uma porta local (geralmente a 7071). Todos os pontos de extremidade de função que podem ser chamados são gravados na saída, e você pode usar esses pontos de extremidade para testar as funções. Para obter mais informações, consulte Desenvolver o Azure Functions localmente usando o Core Tools. É solicitado que você instale essas ferramentas na primeira vez em que inicia uma função no Visual Studio.
Importante
A partir da versão 4.0.6517 do Core Tools, os projetos de modelo em processo devem referenciar a versão 4.5.0 ou posterior de Microsoft.NET.Sdk.Functions. Se você usar uma versão anterior, o func start comando gerará um erro.
Para iniciar sua função no Visual Studio no modo de depuração, execute as seguintes etapas:
Selecione F5. Se solicitado, aceite a solicitação do Visual Studio para baixar e instalar o Azure Functions Core Tools. Talvez você também precise ativar uma exceção de firewall para que as ferramentas possam lidar com solicitações HTTP.
Quando o projeto for executado, teste seu código da mesma forma que você testa uma função implantada.
Quando você executa o Visual Studio em modo de depuração, os pontos de interrupção são atingidos conforme o esperado.
Para obter um cenário de teste mais detalhado que usa o Visual Studio, consulte funções de teste, mais adiante neste artigo.
Publicar no Azure
Quando você publica seu projeto do Functions no Azure, o Visual Studio usa a implantação zip para implantar os arquivos de projeto. Quando possível, você também deve selecionar Executar no arquivo de pacote para que o projeto seja executado no pacote de implantação (.zip). Para obter mais informações, consulte Executar suas funções de um arquivo de pacote no Azure.
Não implante no Azure Functions usando o Web Deploy (msdeploy).
Use as seguintes etapas para publicar seu projeto em um aplicativo de funções no Azure:
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Publicar.
Na página Publicar , faça as seguintes seleções:
- No Destino, selecione o Azure e, em seguida, selecione Avançar.
- No destino específico, selecione Aplicativo de Funções do Azure e selecione Avançar.
- Na instância do Functions, selecione Criar novo.
Crie uma nova instância usando os valores especificados na tabela a seguir:
Configuração Valor Descrição Nome Um nome globalmente exclusivo O nome deve identificar exclusivamente seu novo aplicativo de funções. Aceite o nome sugerido ou insira um novo nome. Os seguintes caracteres são válidos: a-z,0-9e-.Nome da assinatura O nome da sua assinatura O aplicativo de funções é criado em uma assinatura do Azure. Aceite a assinatura padrão ou selecione uma diferente na lista. Grupo de recursos O nome do grupo de recursos O aplicativo de funções é criado em um grupo de recursos. Selecione Novo para criar um novo grupo de recursos. Você também pode selecionar um grupo de recursos existente na lista. Tipo de plano Consumo flexível Quando você publica seu projeto em um aplicativo de funções executado em um plano de Consumo Flex, você pode pagar apenas pelas execuções do aplicativo de funções. Outros planos de hospedagem podem incorrer em custos mais altos. IMPORTANTE:
Ao criar um plano de Consumo Flex, primeiro você deve selecionar o Plano de Serviço de Aplicativos e, em seguida, reelecionar o Consumo Flex para resolver um problema com a caixa de diálogo.Sistema operacional Linux O plano de Consumo Flex atualmente requer Linux. Localidade O local do serviço de aplicativo Selecione um local em uma região do Azure compatível com o plano de Consumo Flex. Quando uma região não suportada é selecionada, o botão Criar fica desativado. Tamanho da memória da instância 2048 O tamanho da memória das instâncias da máquina virtual em que o aplicativo é executado é exclusivo do plano de Consumo Flex. Armazenamento do Azure Uma conta de armazenamento de uso geral O runtime do Functions requer uma conta de Armazenamento. Selecione Novo para configurar uma conta de armazenamento para uso geral. Você também pode usar uma conta existente que atenda aos requisitos da conta de armazenamento. Application Insights Uma instância do Application Insights Você deve ativar a integração do Application Insights para seu aplicativo de funções. Selecione Novo para criar uma nova instância, em um workspace novo ou em um workspace do Log Analytics existente. Você também pode usar uma instância existente.
Selecione Criar para criar um aplicativo de funções e recursos relacionados no Azure. O status da criação de recursos é mostrado no canto inferior esquerdo da janela.
Selecione Concluir. A janela Progresso da Criação do Perfil de Publicação é exibida. Quando o perfil for criado, selecione Fechar.
Na página publicar perfil, selecione Publicar para implantar o pacote que contém seus arquivos de projeto em seu novo aplicativo de funções no Azure.
Quando a implantação é concluída, a URL raiz do aplicativo de funções no Azure é mostrada na página de perfil de publicação.
Na página publicar perfil, vá para a seção Hospedagem . Selecione as reticências (...) e, em seguida, selecione Abrir no portal do Azure. O novo recurso de aplicativo de funções do Azure é aberto no portal do Azure.
Configurações do aplicativo de funções
O Visual Studio não carrega as configurações do aplicativo automaticamente quando você publica seu projeto. Se você adicionar configurações ao arquivo local.settings.json , também deverá adicioná-las ao aplicativo de funções no Azure.
A maneira mais fácil de carregar as configurações necessárias para seu aplicativo de funções no Azure é gerenciá-las no Visual Studio. Na página publicar perfil, vá para a seção Hospedagem . Selecione as reticências (...) e, em seguida, selecione Gerenciar as configurações do Serviço de Aplicativo do Azure.
Quando você faz a seleção, a caixa de diálogo Configurações do aplicativo é aberta para o aplicativo de funções. Você pode usar essa caixa de diálogo para adicionar configurações de aplicativo ou modificar as existentes.
Para cada configuração, o valor Local é o valor no arquivo local.settings.json e o valor remoto é o valor no aplicativo de funções no Azure.
- Para criar uma configuração de aplicativo, selecione Adicionar configuração.
- Para copiar um valor de configuração do campo Local para o campo Remoto , selecione Inserir valor de Local.
As alterações pendentes serão gravadas no arquivo de configurações local e no aplicativo de funções quando você selecionar OK.
Observação
Por padrão, o arquivo local.settings.json não é verificado no controle do código-fonte. Como resultado, se você clonar um projeto local do Functions do controle do código-fonte, o projeto não terá um arquivo local.settings.json . Você precisa criar manualmente o arquivo local.settings.json na raiz do projeto para que a caixa de diálogo configurações do aplicativo funcione conforme o esperado.
Você também pode gerenciar as configurações de aplicativo em um desses outros modos:
- Use o portal do Azure.
- Use a opção
--publish-local-settingsde publicação nas Ferramentas Principais do Azure Functions. - Utilize o CLI do Azure.
Depuração remota
Para depurar seu aplicativo de funções remotamente, você precisa publicar uma configuração de depuração do seu projeto. Você também precisa ativar a depuração remota em seu aplicativo de funções no Azure.
Esta seção pressupõe que uma configuração de depuração em seu aplicativo de funções seja publicada.
Considerações de depuração remota
- A depuração remota não é recomendada em um serviço de produção.
- Para usar a depuração remota, você deve hospedar seu aplicativo de funções em um plano premium ou do Serviço de Aplicativo.
- Atualmente, a depuração remota só é suportada quando seu aplicativo em C# é executado no Windows.
- Se você tiver o recurso Just My Code ativado no Visual Studio, desative-o. Para obter instruções, consulte Habilitar ou desabilitar Just My Code.
- Evite paradas longas em pontos de interrupção ao usar a depuração remota. Quando um processo é interrompido por mais de alguns minutos, o Azure o trata como um processo sem resposta e o desliga.
- Enquanto você está depurando, o servidor está enviando dados para o Visual Studio, o que pode afetar os encargos de largura de banda. Para obter informações sobre as taxas de largura de banda, consulte a calculadora de preços.
- A depuração remota é desativada automaticamente em seu aplicativo de funções após 48 horas. Depois desse ponto, você precisa habilitar a depuração remota novamente.
Anexar o depurador
Ao depurar um aplicativo de processo de trabalho isolado, você atualmente precisa anexar o depurador remoto a um processo .NET separado. Várias outras etapas de configuração também são necessárias.
Para anexar um depurador remoto a um aplicativo de funções em execução em um processo separado do host do Functions, execute as seguintes etapas:
Na página publicar perfil, vá para a seção Hospedagem . Selecione as reticências (...) e, em seguida, selecione Anexar depurador.
O Visual Studio se conecta ao seu aplicativo de funções e ativa a depuração remota, se ela ainda não estiver ativada.
Observação
Como o depurador remoto não pode se conectar ao processo de host, uma mensagem de erro pode aparecer. De qualquer forma, o depurador local não pode acessar seus pontos de interrupção ou fornecer uma maneira de inspecionar variáveis ou percorrer o código.
No menu Depurar do Visual Studio, selecione Anexar ao Processo.
Na caixa de diálogo Anexar ao Processo , execute as seguintes etapas:
- Ao lado do tipo de conexão, selecione Os Serviços de Aplicativo do Microsoft Azure.
- Ao lado do destino conexão, selecione Localizar.
Na caixa de diálogo Anexar ao Processo do Azure , pesquise e selecione seu aplicativo de funções e selecione OK.
Se solicitado, permita o acesso do Visual Studio por meio do firewall local.
Na caixa de diálogo Anexar ao Processo , selecione Mostrar processos para todos os usuários. Selecione dotnet.exee, em seguida, selecione Anexar.
Quando a operação for concluída, você estará conectado ao seu código da biblioteca de classes C# executado em um processo de trabalho isolado. Neste ponto, você pode depurar seu aplicativo de funções normalmente.
Para anexar um depurador remoto a um aplicativo de funções em execução no processo com o host do Functions, siga as seguintes etapas.
Na página publicar perfil, vá para a seção Hospedagem . Selecione as reticências (...) e, em seguida, selecione Anexar depurador.
O Visual Studio se conecta ao seu aplicativo de funções e ativa a depuração remota, se ela ainda não estiver ativada. Ele também localiza e anexa o depurador ao processo de host do aplicativo. Neste ponto, você pode depurar seu aplicativo de funções normalmente.
Ao concluir a depuração, desative a depuração remota.
Desativar a depuração remota
Depois de concluir a depuração remota do código, desative a depuração remota no portal do Azure. A depuração remota é desativada automaticamente após 48 horas, caso você esqueça.
Na página publicar perfil, vá para a seção Hospedagem . Selecione as reticências (...) e, em seguida, selecione Abrir no portal do Azure. O portal do Azure é aberto para o aplicativo de funções no qual seu projeto é implantado.
No aplicativo de funções, selecione Configurações> e vá para a guia Configurações gerais. Ao lado da depuração remota, selecione Desativar. Selecione Salvar e, em seguida, selecione Continuar.
Depois que o aplicativo de funções for reiniciado, você não poderá mais se conectar remotamente aos seus processos remotos. Você pode usar essa mesma guia no portal do Azure para ativar a depuração remota fora do Visual Studio.
Funções do monitor
A maneira recomendada de monitorar suas funções é integrando seu aplicativo de funções ao Application Insights. Você deve ativar essa integração ao criar seu aplicativo de funções durante a publicação do Visual Studio.
Se a integração não estiver configurada durante a publicação por algum motivo, você ainda deverá ativar a integração do Application Insights para seu aplicativo de funções no Azure.
Para obter mais informações sobre como usar o Application Insights para monitoramento, consulte Monitorar execuções no Azure Functions.
Funções de teste
Esta seção descreve como criar um projeto de modelo em processo em C# que você pode testar usando o xUnit, uma ferramenta de teste de unidade de software livre para .NET.
Etapa 1: Configuração
Siga estas etapas para configurar o ambiente, incluindo o projeto e as funções do aplicativo, necessários para dar suporte aos testes:
No Visual Studio, crie um projeto do Azure Functions chamado Functions.
Crie uma função HTTP com base no modelo:
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto do Functions e selecione Adicionar>Nova Função do Azure.
- Na caixa de diálogo Adicionar Novo Item , selecione a Função do Azure e, em seguida, selecione Adicionar.
- Selecione o gatilho Http e, em seguida, selecione Adicionar.
- Renomeie a nova classe MyHttpTrigger.
Crie uma função de temporizador com base no modelo:
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto do Functions e selecione Adicionar>Nova Função do Azure.
- Na caixa de diálogo Adicionar Novo Item , selecione a Função do Azure e, em seguida, selecione Adicionar.
- Selecione o gatilho do Temporizador e, em seguida, selecione Adicionar.
- Renomeie a nova classe MyTimerTrigger.
Crie um aplicativo de teste xUnit na solução:
- No Gerenciador de Soluções, clique com o botão direito do mouse na solução que contém seu projeto do Functions e selecione Adicionar>Novo Projeto.
- Selecione o modelo do Projeto de Teste xUnit e selecione Avançar.
- Nomeie o projeto Functions.Tests.
Remova os arquivos de teste padrão do projeto Functions.Tests .
Use o NuGet para adicionar uma referência do aplicativo de teste ao Microsoft.AspNetCore.Mvc. Você pode usar o Console do Gerenciador de Pacotes ou executar as seguintes etapas:
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto Functions.Tests e selecione Gerenciar Pacotes NuGet.
- Pesquise e instale o Microsoft.AspNetCore.Mvc.
No aplicativo Functions.Tests , adicione uma referência ao aplicativo Functions :
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto Functions.Tests e selecione Adicionar>Referência de Projeto.
- Selecione o projeto do Functions e selecione OK.
Etapa 2: Criar classes de teste
Nesta seção, você criará as classes usadas para executar os testes automatizados.
Cada função utiliza uma implementação de ILogger para lidar com o registro em log de mensagens. Em alguns testes, nenhuma mensagem é registrada ou não importa como o registro em log é implementado. Outros testes precisam avaliar mensagens registradas para determinar se um teste deve ser aprovado.
Crie uma classe em seu projeto Functions.Tests nomeado
NullScopee adicione o código a seguir. Essa classe fornece um escopo fictício. Em uma etapa posterior, você cria uma implementação deILoggerque usa esse escopo.using System; namespace Functions.Tests { public class NullScope : IDisposable { public static NullScope Instance { get; } = new NullScope(); private NullScope() { } public void Dispose() { } } }Crie uma classe em seu projeto Functions.Tests nomeado
ListLoggere adicione o código a seguir. Essa classe mantém uma lista interna de mensagens a serem avaliadas durante o teste. Para implementar a interface necessáriaILogger, a classe usa o escopo fictício daNullScopeclasse. Os casos de teste passam o escopo fictício para a classeListLogger.using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace Functions.Tests { public class ListLogger : ILogger { public IList<string> Logs; public IDisposable BeginScope<TState>(TState state) => NullScope.Instance; public bool IsEnabled(LogLevel logLevel) => false; public ListLogger() { this.Logs = new List<string>(); } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { string message = formatter(state, exception); this.Logs.Add(message); } } }A classe
ListLoggerimplementa os seguintes membros, conforme definido pela interfaceILogger.-
BeginScope: define o escopo de adicionar contexto do log. Nesse caso, o teste aponta para a instância estática naNullScopeclasse para permitir que o teste funcione. -
IsEnabled: É fornecido um valor padrão defalse. -
Log: esse método usa a função fornecidaformatterpara formatar a mensagem. Em seguida, o método adiciona o texto resultante àLogscoleção.
A coleção
Logsé uma instância deList<string>e é inicializada no construtor.-
Crie um arquivo de código no projeto Functions.Tests chamado LoggerTypes.cs e adicione o seguinte código:
namespace Functions.Tests { public enum LoggerTypes { Null, List } }Esta enumeração especifica o tipo de logger que os testes usam.
Crie uma classe no projeto Functions.Tests nomeado
TestFactorye adicione o seguinte código:using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Primitives; using System.Collections.Generic; namespace Functions.Tests { public class TestFactory { public static IEnumerable<object[]> Data() { return new List<object[]> { new object[] { "name", "Bernardo" }, new object[] { "name", "Ananya" }, new object[] { "name", "Vlad" } }; } private static Dictionary<string, StringValues> CreateDictionary(string key, string value) { var qs = new Dictionary<string, StringValues> { { key, value } }; return qs; } public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue) { var context = new DefaultHttpContext(); var request = context.Request; request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue)); return request; } public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null) { ILogger logger; if (type == LoggerTypes.List) { logger = new ListLogger(); } else { logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); } return logger; } } }A classe
TestFactoryimplementa os seguintes membros:-
Data: essa propriedade retorna uma coleção IEnumerable de dados de exemplo. Os pares chave-valor representam valores que são passados para uma string de consulta. -
CreateDictionary: este método aceita um par chave-valor como um argumento. Isso retorna uma nova instância deDictionaryque é usada para criar uma instância deQueryCollectionpara representar valores de cadeias de consulta. -
CreateHttpRequest: esse método cria uma solicitação HTTP inicializada com os parâmetros de cadeia de caracteres de consulta especificados. -
CreateLogger: Este método retorna uma implementação deILoggerque é usada para testes. AILoggerimplementação depende do tipo de registrador especificado. Se um tipo de lista for especificado, a instânciaListLoggeracompanha as mensagens registradas que estão disponíveis para avaliação em testes.
-
Crie uma classe no projeto Functions.Tests nomeado
FunctionsTestse adicione o seguinte código:using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Xunit; namespace Functions.Tests { public class FunctionsTests { private readonly ILogger logger = TestFactory.CreateLogger(); [Fact] public async void Http_trigger_should_return_known_string() { var request = TestFactory.CreateHttpRequest("name", "Bernardo"); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value); } [Theory] [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))] public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue) { var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value); } [Fact] public void Timer_should_log_message() { var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List); new MyTimerTrigger().Run(null, logger); var msg = logger.Logs[0]; Assert.Contains("C# Timer trigger function executed at", msg); } } }Essa classe implementa os seguintes membros:
-
Http_trigger_should_return_known_string: este teste usa o valorname=Bernardoda cadeia de caracteres de consulta para criar uma solicitação para uma função HTTP. Esse teste verifica se a resposta esperada é retornada. -
Http_trigger_should_return_string_from_member_data: este teste usa atributos xUnit para fornecer dados de exemplo para a função HTTP. -
Timer_should_log_message: este teste cria uma instânciaListLoggere a passa para uma função de temporizador. Depois que a função é executada, o log é verificado para verificar se a mensagem esperada está presente.
-
Para acessar as configurações do aplicativo em seus testes, você pode injetar uma
IConfigurationimplementação com valores de variável de ambiente simulados em sua função.
Etapa 3: Executar testes
Para executar os testes no Visual Studio, selecione Exibir Gerenciador> deTestes. No Gerenciador de Testes, selecione Executar>Todos os Testes na Exibição.
Etapa 4: depurar testes
Para depurar os testes, defina um ponto de interrupção em um teste. No Explorador de Testes, selecione Executar>Depurar Última Execução.