Tutorial: Introdução ao Azure FunctionsTutorial: Getting started with Azure Functions

Neste laboratório, você aprenderá a começar a criar no Azure Functions usando o Visual Studio para Mac.In this lab, you'll learn how to get started building Azure Functions using Visual Studio for Mac. Você também fará a integração com as tabelas de armazenamento do Azure, que representam um dos muitos tipos de associações e gatilhos disponíveis para os desenvolvedores no Azure Functions.You'll also integrate with Azure storage tables, which represent one of the many kinds of bindings and triggers available to Azure Functions developers.

ObjetivosObjectives

  • Criar e depurar funções do Azure locaisCreate and debug local Azure Functions
  • Integrar com recursos de armazenamento do Azure e da WebIntegrate with web and Azure storage resources
  • Organizar um fluxo de trabalho envolvendo várias funções do AzureOrchestrate a workflow involving multiple Azure Functions

RequisitosRequirements

  • Visual Studio para Mac 7.5 ou posterior.Visual Studio for Mac 7.5 or higher.
  • Uma assinatura do Azure (disponível gratuitamente em https://azure.com/free).An Azure subscription (available free from https://azure.com/free).

Exercício 1: Criar um projeto do Azure FunctionsExercise 1: Creating an Azure Functions project

  1. Inicialize o Visual Studio para Mac.Launch Visual Studio for Mac.

  2. Selecione Arquivo > Nova Solução.Select File > New Solution.

  3. Na categoria Nuvem > Geral, selecione o modelo do Azure Functions.From the Cloud > General category, select the Azure Functions template. Você usará o C# para criar uma biblioteca de classes .NET que hospeda o Azure Functions.You will use C# to create a .NET class library that hosts Azure Functions. Clique em Avançar.Click Next.

    Seleção de modelo do Azure Functions

  4. Definir o Nome do Projeto como "AzureFunctionsLab" e clique em Criar.Set the Project Name to "AzureFunctionsLab" and click Create.

    Nomeando e criando seu projeto de função do Azure

  5. Expanda os nós no Painel de Soluções.Expand the nodes in Solution Pad. O modelo de projeto padrão inclui referências de NuGet a uma variedade de pacotes do Azure WebJobs, bem como ao pacote Newtonsoft.Json.The default project template includes NuGet references to a variety of Azure WebJobs packages, as well as the Newtonsoft.Json package.

    Também há três arquivos: - host.json para descrever as opções de configuração globais para o host - local.settings.json para definir as configurações de serviço.There are also three files: - host.json for describing the global configuration options for the host - local.settings.json for configuring service settings. - O modelo de projeto também cria um HttpTrigger padrão.- The project template also creates a default HttpTrigger. Para este laboratório, você deve excluir o arquivo HttpTrigger.cs do projeto.For the sake of this lab, you should delete the HttpTrigger.cs file from the project.

    Abra local.settings.json.Open local.settings.json. O padrão é ter duas configurações de cadeia de conexão vazias.It defaults to having two empty connection string settings.

    Painel de Soluções exibindo o arquivo local.settings.json

Exercício 2: Criar uma Conta de Armazenamento do AzureExercise 2: Creating an Azure storage account

  1. Faça logon na sua conta do Azure em https://portal.azure.com.Log on to your Azure account at https://portal.azure.com.

  2. Na seção Favoritos, localizada à esquerda na tela, selecione Contas de Armazenamento:Under the Favorites section, located on the left of the screen, select Storage Accounts:

    Seção Favoritos do portal do Azure mostrando o item de contas de armazenamento

  3. Selecione Adicionar para criar uma nova conta de armazenamento:Select Add to create a new storage account:

    Botão para adicionar nova conta de armazenamento

  4. Insira um nome global exclusivo em Nome e reutilize-o para o Grupo de recursos.Enter a globally unique name for the Name and reuse it for the Resource group. Você pode manter todos os outros itens com os valores padrão.You can keep all the other items as their default.

    Detalhes da nova conta de armazenamento

  5. Clique em Criar.Click Create. Pode levar alguns minutos para criar a conta de armazenamento.It might take a few minutes to create the storage account. Você receberá uma notificação quando ela tiver sido criada com êxito.You'll get a notification once it has been successfully created.

    Notificação de implantação bem-sucedida

  6. Selecione o botão Ir para o recurso na notificação.Select the Go to resource button from the notification.

  7. Selecione a guia Chaves de acesso.Select the Access keys tab.

    Configuração de chave de acesso

  8. Copie a primeira Cadeia de conexão.Copy the first Connection String. Essa cadeia de caracteres é usada para integrar o Armazenamento do Azure com o Azure Functions posteriormente.This string is used to integrate Azure storage with your Azure Functions later on.

    Informações sobre a chave 1

  9. Retorne ao Visual Studio para Mac e cole a cadeia de conexão completa como a configuração AzureWebJobsStorage em local.settings.json.Return to Visual Studio for Mac and paste the full connection string in as the AzureWebJobsStorage setting in local.settings.json. Agora, você pode referenciar o nome da configuração nos atributos para funções que precisam de acesso a seus recursos.Now you can reference the name of the setting in attributes for functions that need access to its resources.

    Arquivo de configurações local com a chave de conexão inserida

Exemplo 3: Criar e depurar uma função do AzureExample 3: Creating and debugging an Azure Function

  1. Agora, você está pronto para começar a adicionar algum código.You're now ready to start adding some code. Ao trabalhar com uma biblioteca de classes .NET, funções do Azure são adicionadas como métodos estáticos.When working with a .NET class library, Azure Functions are added as static methods. No Painel de Soluções, clique com o botão direito do mouse no nó do projeto do AzureFunctions e selecione Adicionar > Adicionar Função:From Solution Pad, right-click the AzureFunctions project node and select Add > Add Function:

    Opção Adicionar Função

  2. Na caixa de diálogo Novas Funções do Azure, selecione o modelo de webhook Genérico.In the New Azure Functions dialog, select the Generic webhook template. Definir o Nome a Adicionar e clique em OK para criar a função:Set the Name to Add and click Ok to create your function:

    Caixa de diálogo Novas Funções do Azure

  3. Na parte superior do novo arquivo, adicione as diretivas using abaixo:At the top of the new file, add the using directives below:

    using Microsoft.Azure.WebJobs.Extensions.Http;
    using System.Web;
    using Microsoft.WindowsAzure.Storage.Table;
    
  4. Remova o método Run existente e adicione o método a seguir à classe como sua função do Azure:Remove the existing Run method and add the method below to the class as your Azure Function:

    [FunctionName("Add")]
    public static int Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage req,
    TraceWriter log)
    {
        int x = 1;
        int y = 2;
    
        return x + y;
    }
    
  5. Vamos examinar a definição do método detalhadamente.Let's walk through the method definition piece by piece.

    A primeira coisa que você verá é o atributo FunctionName, que marca este método como uma função do Azure.The first thing you'll see is the FunctionName attribute that marks this method as an Azure Function. O atributo designa o nome público da função.The attribute designates the public name of the function. O nome do atributo não precisa corresponder ao nome real do método.The attribute name doesn't need to match the actual method name.

    Novo método de execução com o atributo FunctionName realçado

  6. Em seguida, o método é marcado como um método estático público, o que é obrigatório.Next, the method is marked as a public static method, which is required. Você também observará que o valor retornado é um int. A menos que seja especificado de outra forma usando atributos de método, qualquer valor retornado não nulo de uma função do Azure é retornado ao cliente como texto.You'll also notice that the return value is an int. Unless otherwise specified using method attributes, any non-void return value of an Azure Function is returned to the client as text. Por padrão, ele é retornado como XML, mas pode ser alterado para JSON, o que você fará mais tarde no laboratório.By default it's returned as XML, but can be changed to JSON, which you'll do later on in the lab.

    Novo método de execução com a inicialização do método realçada

  7. O primeiro parâmetro é marcado com o atributo HttpTrigger, que indica que esse método é invocado por uma solicitação HTTP.The first parameter is marked with the HttpTrigger attribute, which indicates that this method is invoked by an HTTP request. O atributo também especifica o nível de autorização do método, bem como os verbos a que ele dá suporte (apenas "GET" nesse caso).The attribute also specifies the authorization level of the method, as well as the verbs it supports (only "GET" in this case). Você também pode definir um Rota que substitui o caminho para o método e oferece uma forma de extrair automaticamente variáveis do caminho.You may also optionally define a Route that overrides the path to the method and offers a way to automatically extract variables from the path. Como o Rota é nula aqui, o caminho para este método terá o valor padrão /api/Add.Since the Route is null here, the path to this method will default to /api/Add.

    Novo método de execução com parâmetro realçado

  8. O parâmetro final do método é um TraceWriter, que pode ser usado para registrar mensagens para erros e diagnóstico.The final parameter to the method is a TraceWriter that can be used to log messages for diagnostics and errors.

    Novo método de execução com TraceWriter realçado

  9. Defina um ponto de interrupção na linha de retorno do método clicando na margem da linha:Set a breakpoint on the return line of the method by clicking in the margin of the line:

    Ponto de interrupção definido na linha de retorno

  10. Crie e execute o projeto em uma sessão de depuração pressionando F5 ou selecionando Depurar > Iniciar a Depuração.Build and run the project in a debug session by pressing F5 or selecting Run > Start Debugging. Também é possível clicar no botão Executar.You could alternatively click the Run button. Todas essas opções executam a mesma tarefa.These options all perform the same task. O restante deste laboratório faz referência a F5, mas você pode usar o método que considerar mais confortável.The rest of this lab references F5, but you can use the method you find most comfortable.

    Criar e executar o projeto

  11. Executar o projeto abrirá automaticamente o aplicativo de Terminal.Running the project will automatically open the Terminal application.

  12. O projeto passa por um processo de detecção de funções do Azure com base em atributos de método e em uma convenção de arquivo que será abordada posteriormente neste artigo.The project goes through a process of detecting Azure Functions based on method attributes and a file convention that is covered later in this article. Nesse caso, ele detecta uma única função do Azure e "gera" 1 função de trabalho.In this case, it detects a single Azure Function and "generates" 1 job function.

    Saída da função do Azure no Terminal

  13. Na parte inferior das mensagens de inicialização, o host do Azure Functions imprime as URLs de qualquer API de gatilho HTTP.At the bottom of the startup messages, the Azure Functions host prints the URLs of any HTTP trigger APIs. Deve haver apenas uma.There should only be one. Copie essa URL e cole-a em uma nova guia do navegador.Copy that URL and paste it in a new browser tab.

    URL de API de função do Azure

  14. O ponto de interrupção deve ser disparado imediatamente.The breakpoint should trigger immediately. A solicitação da Web foi encaminhada para a função e agora pode ser depurada.The web request has been routed to the function and can now be debugged. Passe o mouse sobre a variável x para ver seu valor.Mouse over the x variable to see its value.

    Ponto de interrupção disparado

  15. Remova o ponto de interrupção usando o mesmo método usado para adicioná-lo anteriormente (clique na margem ou selecione a linha e pressione F9).Remove the breakpoint using the same method used to add it earlier (click on the margin or select the line and press F9).

  16. Pressione F5 para continuar a execução.Press F5 to continue running.

  17. No navegador, será renderizado o resultado XML do método.In the browser, the XML result of the method will be rendered. Como esperado, a operação de adição codificada produz uma soma plausível.As expected, the hardcoded addition operation produces a plausible sum. Observe que, se você vir apenas "3" no Safari, vá até Safari > Preferências > Avançado, marque a caixa de seleção "Exibir menu Desenvolver na barra de menus" e recarregue a página.Note, if you only see "3" in Safari, go to Safari > Preferences > Advanced and tick the "Show Develop menu in menu bar" checkbox and reload the page.

  18. No Visual Studio para Mac, clique no botão Parar para encerrar a sessão de depuração.In Visual Studio for Mac, click the Stop button to end the debug session. Para garantir que as novas alterações entrem em vigor, não se esqueça de reiniciar (interromper e retomar) a sessão de depuração.To ensure that new changes are picked up, don't forget to restart (stop and then run) the debugging session.

    Opção Parar depuração

  19. No método Run, substitua as definições de x e y pelo código abaixo.In the Run method, replace the x and y definitions with the code below. Esse código extrai valores cadeia de consulta da URL para que a operação de adição possa ser realizada de forma dinâmica com base nos parâmetros fornecidos.This code extracts values from the URL's query string so that the addition operation can be performed dynamically based on the provided parameters.

    var query = HttpUtility.ParseQueryString(req.RequestUri.Query);
    
    int x = int.Parse(query["x"]);
    
    int y = int.Parse(query["y"]);
    
    return x + y;
    
  20. Execute o aplicativo.Run the application.

  21. Retorne à janela do navegador e acrescente a cadeia de caracteres /?x=2&y=3 à URL.Return to the browser window and append the string /?x=2&y=3 to the URL. A URL inteira agora deve ser http://localhost:7071/api/Add?x=2&y=3.The whole URL should now be http://localhost:7071/api/Add?x=2&y=3. Navegue até a nova URL.Navigate to the new URL.

  22. Dessa vez, o resultado deve refletir os novos parâmetros.This time the result should reflect the new parameters. Fique à vontade para executar o projeto com valores diferentes.Feel free to run the project with different values. Observe que não há nenhuma verificação de erros, de modo que parâmetros inválidos ou ausentes gerarão um erro.Note that there isn't any error checking, so invalid or missing parameters will throw an error.

  23. Interrompa a sessão de depuração.Stop the debugging session.

Exercício 4: Trabalhar com function.jsonExercise 4: Working with function.json

  1. Em um exercício anterior, mencionamos que o Visual Studio para Mac “gera” uma função de trabalho para a função do Azure definida na biblioteca.In an earlier exercise, it was mentioned that Visual Studio for Mac "generated" a job function for the Azure Function defined in the library. Isso acontece porque o Azure Functions não usa de fato os atributos de método em tempo de execução, mas usa uma convenção de sistema de arquivos em tempo de compilação para configurar onde e como as funções do Azure são disponibilizadas.This is because Azure Functions doesn't actually use the method attributes at runtime, but rather uses a compile-time file system convention to configure where and how Azure Functions are made available. No Painel de Soluções, clique com o botão direito do mouse no nó do projeto e selecione Revelar no Localizador.From Solution Pad, right-click on your project node and select Reveal in Finder.

    Opção de menu Revelar no Localizador

  2. Navegue pelo sistema de arquivos até alcançar bin/Debug/netstandard2.0.Navigate down the file system until you reach bin/Debug/netstandard2.0. Deve haver uma pasta chamada Add.There should be a folder named Add. Essa pasta foi criada para corresponder ao atributo de nome de função no código C#.This folder was created to correspond with the function name attribute in the C# code. Expanda a pasta Adicionar para revelar um único arquivo function.json.Expand the Add folder to reveal a single function.json file. Esse arquivo é usado pelo tempo de execução para hospedar e gerenciar a função do Azure.This file is used by the runtime to host and manage the Azure Function. Para outros modelos de linguagem sem suporte para tempo de compilação (como script em C# ou JavaScript), essas pastas precisam ser criadas e mantidas manualmente.For other language models without compile-time support (such as C# script or JavaScript), these folders must be manually created and maintained. Para desenvolvedores de C#, elas são geradas automaticamente dos metadados de atributo no momento do build.For C# developers, they are automatically generated from attribute metadata upon build. Clique com o botão direito do mouse em function.json e selecione para abrir no Visual Studio.Right-click on function.json and select to open it in Visual Studio.

    function.json no diretório de arquivos

  3. Dadas as etapas anteriores deste tutorial, você deve ter uma compreensão básica dos atributos de C#.Given the previous steps of this tutorial, you should have a basic understanding of C# attributes. Levando isso em conta, este JSON deve ser familiar.Taking that into account, this JSON should look familiar. No entanto, há alguns itens que não foram abordados em exercícios anteriores.However, there are a few items that were not covered in earlier exercises. Por exemplo, cada binding precisa ter seu valor de direction definido.For example, each binding must have its direction set. Como você pode inferir, "in" significa que o parâmetro é uma entrada, enquanto "out" indica que o parâmetro é um valor retornado (via $return) ou um parâmetro out do método.As you might infer, "in" means that the parameter is input, whereas "out" indicates that the parameter is either a return value (via $return) or an out parameter to the method. Você também precisa especificar o scriptFile (relativo a este local final) e o método entryPoint (público e estático) dentro do assembly.You also need to specify the scriptFile (relative to this final location) and the entryPoint method (public and static) within the assembly. Nas próximas etapas, você adicionará um caminho de função personalizado usando este modelo, sendo assim, copie o conteúdo desse arquivo para a área de transferência.In the next few steps you'll add a custom function path using this model, so copy the contents of this file to the clipboard.

    Arquivo function.json aberto no Visual Studio para Mac

  4. No Painel de Soluções, clique com o botão direito do mouse no nó de projeto AzureFunctionsLab e selecione Adicionar > Nova Pasta.In Solution Pad, right-click the AzureFunctionsLab project node and select Add > New Folder. Nomeie a nova pasta como Adder.Name the new folder Adder. Segundo a convenção padrão, o nome desta pasta definirá o caminho para a API, como api/Adder.By default convention, the name of this folder will define the path to the API, such as api/Adder.

    Opção Nova Pasta

  5. Clique com o botão direito do mouse na pasta Adder e selecione Adicionar > Novo Arquivo.Right-click the Adder folder and select Add > New File.

    Opção Novo Arquivo

  6. Selecione a categoria Web e o modelo Arquivo JSON Vazio.Select the Web category and the Empty JSON File template. Defina o Nome como function e clique em Novo.Set the Name to function and click New.

    Opção Arquivo JSON Vazio

  7. Copie o conteúdo do outro function.json (da etapa 3) para substituir o conteúdo padrão do arquivo recém-criado.Paste the contents of the other function.json (from step 3) in to replace the default contents of the newly created file.

  8. Remova as seguintes linhas da parte superior do arquivo json:Remove the following lines from the top of the json file:

    "configurationSource":"attributes",
    "generatedBy":"Microsoft.NET.Sdk.Functions-1.0.13",
    
  9. No final da primeira associação (após a linha "name": "req"), adicione as propriedades abaixo.At the end of the first binding (after the "name": "req" line), add the properties below. Não deixe de incluir uma vírgula na linha anterior.Don't forget to include a comma on the previous line. Essa propriedade substitui a raiz padrão, de forma que agora os parâmetros int serão extraídos do caminho e colocados nos parâmetros de método chamados x e y.This property overrides the default root such that it will now extract int parameters from the path and place them into method parameters that are named x and y.

    "direction": "in",
    "route": "Adder/{x:int?}/{y:int?}"
    
  10. Adicione outra associação sob a primeira.Add another binding underneath the first. Essa associação lida com o valor retornado da função.This binding handles the return value of the function. Não deixe de incluir uma vírgula na linha anterior:Don't forget to include a comma on the previous line:

    {
    "name": "$return",
    "type": "http",
    "direction": "out"
    }
    
  11. Atualize também a propriedade entryPoint na parte inferior do arquivo para usar um método chamado "Add2", como mostrado abaixo.Also update the entryPoint property at the bottom of the file to use a method called "Add2", such as shown below. Isso ilustra que o caminho api/Adder... pode ser mapeado para um método apropriado com qualquer nome (Add2 aqui).This is to illustrate that the path api/Adder... could map to an appropriate method with any name (Add2 here).

    "entryPoint": "<project-name>.<function-class-name>.Add2"
    
  12. Seu arquivo function.json final deve ser semelhante ao json a seguir:Your final function.json file should look like the following json:

    {
    "bindings": [
        {
        "type": "httpTrigger",
        "methods": [
            "get"
        ],
        "authLevel": "function",
        "direction": "in",
        "name": "req",
        "route": "Adder/{x:int?}/{y:int?}"
        },
        {
        "name": "$return",
        "type": "http",
        "direction": "out"
        }
    ],
    "disabled": false,
    "scriptFile": "../bin/AzureFunctionsProject.dll",
    "entryPoint": "AzureFunctionsProject.Add.Add2"
    }
    
  13. A etapa final necessária para fazer tudo isso funcionar é instruir o Visual Studio para Mac a copiar esse arquivo para o mesmo caminho relativo no diretório de saída, sempre que ele for alterado.The one final step required to make this all work is to instruct Visual Studio for Mac to copy this file to the same relative path in the output directory every time it changes. Com o arquivo selecionado, escolha a guia de propriedades na barra direita e, para Copiar para diretório de saída selecione Copiar se mais recente:With the file selected, choose the properties tab from the right-hand bar, and for Copy to output directory select Copy if newer:

    Opções de propriedades para o arquivo json

  14. Em Add.cs, substitua o método Run (incluindo o atributo) pelo seguinte método para preencher a função esperada.In Add.cs, replace the Run method (including the attribute) with the following method to fulfill the expected function. Ele é muito semelhante ao método Run, mas não usa nenhum atributo e tem parâmetros explícitos para x e y.It's very similar to Run, except that it uses no attributes and has explicit parameters for x and y.

    public static int Add2(
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        return x + y;
    }
    
  15. Pressione F5 para criar e executar o projeto.Press F5 to build and run the project.

  16. Conforme o build é concluído e a plataforma o executa, será indicado que há uma segunda rota disponível para as solicitações, que é mapeada para o método recém-adicionado:As the build completes and platform spins up, it will now indicate that there is a second route available for requests that maps to the newly added method:

    URL para funções Http

  17. Retorne para a janela do navegador e navegue até http://localhost:7071/api/Adder/3/5.Return the browser window and navigate to http://localhost:7071/api/Adder/3/5.

  18. Dessa vez, o método funciona mais uma vez, obtendo os parâmetros do caminho e produzindo uma soma.This time the method works once again, pulling parameters from the path and producing a sum.

  19. Retorne ao Visual Studio para Mac e encerre a sessão de depuração.Return to Visual Studio for Mac and end the debugging session.

Exercício 5: Trabalhar com tabelas de armazenamento do AzureExercise 5: Working with Azure storage tables

Frequentemente, o serviço criado pode ser muito mais complexo do que o que criamos até o momento, e pode demandar tempo e/ou estrutura significativa para ser executado.Often, the service you build might be much more complex than what we have built so far and require a significant amount of time and/or infrastructure to execute. Nesse caso, você pode achar eficiente aceitar solicitações enfileiradas para processamento quando os recursos ficarem disponíveis, e o Azure Functions dá suporte a isso.In that case, you might find it effective to accept requests that are queued for processing when the resources become available, which Azure Functions provides support for. Em outros casos, você vai preferir armazenar dados centralmente.In other cases, you’ll want to store data centrally. As tabelas de Armazenamento do Azure permitem fazer isso facilmente.Azure Storage tables let you do that quickly.

  1. Adicione a classe abaixo a Add.cs.Add the class below to Add.cs. Ela deve ficar dentro do namespace, mas fora da classe atual.It should go inside the namespace, but outside the existing class.

    public class TableRow : TableEntity
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Sum { get; set; }
    }
    
  2. Dentro da classe Add, adicione o código abaixo para introduzir outra função.Within the Add class, add the code below to introduce another function. Observe que esta é única até o momento, pois não envolve uma resposta HTTP.Note that this one is unique so far in that it doesn't involve an HTTP response. A linha final retorna uma nova TableRow preenchida com informações de chave que facilitarão a recuperação posteriormente (PartitionKey e RowKey), bem como seus parâmetros e uma soma.The final line returns a new TableRow populated with some key information that will make it easy to retrieve later on (PartitionKey and RowKey), as well as its parameters and sum. O código dentro do método também usa o TraceWriter para ficar mais fácil saber quando a função é executada.The code within the method also uses the TraceWriter to make it easier to know when the function runs.

    [FunctionName("Process")]
    [return: Table("Results")]
    public static TableRow Process(
        [HttpTrigger(AuthorizationLevel.Function, "get",
            Route = "Process/{x:int}/{y:int}")]
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        log.Info($"Processing {x} + {y}");
    
        return new TableRow()
        {
            PartitionKey = "sums",
            RowKey = $"{x}_{y}",
            X = x,
            Y = y,
            Sum = x + y
        };
    }
    
  3. Pressione F5 para criar e executar o projeto.Press F5 to build and run the project.

  4. Na guia do navegador, navegue até http://localhost:7071/api/Process/4/6.In the browser tab, navigate to http://localhost:7071/api/Process/4/6. Isso colocará outra mensagem na fila, o que deve fazer com que outra linha seja adicionada à tabela.This will put another message into the queue, which should eventually result in another row being added to the table.

  5. Retorne ao Terminal e observe a solicitação de entrada de 4 + 6.Return to Terminal and watch for the incoming request for 4 + 6.

    Saída do Terminal mostrando solicitação de adição

  6. Retorne ao navegador para atualizar a solicitação para a mesma URL.Return to the browser to refresh the request to the same URL. Dessa vez, você verá um erro após o método Process.This time you'll see an error after the Process method. Isso ocorre porque o método está tentando adicionar uma linha à tabela do Armazenamento de Tabelas do Azure usando uma combinação de partição e chave de linha que já existe.This is because the code is attempting to add a row to the Azure Table Storage table using a partition and row key combination that already exists.

    System.Private.CoreLib: Exception while executing function: Process. Microsoft.Azure.WebJobs.Host: Error while handling parameter $return after function returned:. Microsoft.Azure.WebJobs.Host: The specified entity already exists.
    
  7. Encerre a sessão de depuração.End the debugging session.

  8. Para mitigar o erro, adicione o seguinte parâmetro à definição de método imediatamente antes do parâmetro TraceWriter.To mitigate the error, add the following parameter to the method definition immediately before the TraceWriter parameter. Esse parâmetro instrui a plataforma do Azure Functions a tentar recuperar uma TableRow da tabela de Results na PartitionKey que usamos para armazenar resultados.This parameter instructs the Azure Functions platform to attempt to retrieve a TableRow from the Results table on the PartitionKey we've been using to store results. No entanto, a magia real acontece quando você percebe que RowKey está sendo gerada de forma dinâmica com base nos outros parâmetros x e y do mesmo método.However, some of the real magic comes into play when you notice that the RowKey is being dynamically generated based on the other x and y parameters for the very same method. Se essa linha já existir, tableRow a terá quando o método começar sem trabalho extra necessário por parte do desenvolvedor.If that row already exists, then tableRow will have it when the method begins with no extra work required by the developer. Se essa linha não existir, o valor será nulo.If the row doesn't exist, then it'll just be null. Esse tipo de eficiência permite que os desenvolvedores se concentrem na lógica de negócios importante, e não na infraestrutura.This sort of efficiency enables developers to focus on the important business logic and not the infrastructure.

    [Table("Results", "sums", "{x}_{y}")]
    TableRow tableRow,
    
  9. Adicione o código abaixo ao início do método.Add the code below to the beginning of the method. Se tableRow não for nulo, já teremos o resultado da operação solicitada e poderemos retorná-lo imediatamente.If tableRow isn't null, then we already have the results for the operation being requested and can return it immediately. Caso contrário, a função continua como antes.Otherwise, the function continues as before. Embora essa possa não ser a forma mais robusta de retornar dados, ela ilustra o fato de que é possível orquestrar operações extremamente sofisticadas em várias camadas escalonáveis com pouquíssimo código.While this may not be the most robust way to return the data, it illustrates the point that you can orchestrate incredibly sophisticated operations across multiple scalable tiers with very little code.

    if (tableRow != null)
    {
        log.Info($"{x} + {y} already exists");
        return null;
    }
    
  10. Pressione F5 para criar e executar o projeto.Press F5 to build and run the project.

  11. Na guia do navegador, atualize a URL em http://localhost:7071/api/Process/4/6.In the browser tab, refresh the URL at http://localhost:7071/api/Process/4/6. Como a linha da tabela para este registro existe, ela deve ser retornada imediatamente em erros.Since the table row for this record exists, it should return immediately and without error. Como não há uma saída HTTP, você pode ver a saída no Terminal.Since there is no HTTP output, you can see the output in Terminal.

    Saída do Terminal mostrando que a linha da tabela já existe

  12. Atualize a URL para refletir uma combinação que ainda não foi testada, como http://localhost:7071/api/Process/5/7.Update the URL to reflect a combination not yet tested, such as http://localhost:7071/api/Process/5/7. Observe a mensagem no Terminal, que indica que a linha da tabela não foi encontrada (conforme esperado).Note the message in Terminal, which indicates that the table row was not found (as expected).

    Saída do Terminal mostrando novo processo

  13. Retorne ao Visual Studio para Mac e encerre a sessão de depuração.Return to Visual Studio for Mac and end the debugging session.

ResumoSummary

Neste laboratório, você aprendeu a criar no Azure Functions com o Visual Studio para Mac.In this lab, you've learned how to get started building Azure Functions with Visual Studio for Mac.