Skapa och köra .NET Framework-kod från Standard-arbetsflöden i Azure Logic Apps

Gäller för: Azure Logic Apps (Standard)

För integreringslösningar där du måste skapa och köra .NET Framework-kod från ditt standardarbetsflöde för logikappar kan du använda Visual Studio Code med Tillägget Azure Logic Apps (Standard). Det här tillägget innehåller följande funktioner och fördelar:

  • Skriv din egen kod genom att skapa funktioner som har flexibilitet och kontroll för att lösa dina mest utmanande integreringsproblem.
  • Felsöka kod lokalt i Visual Studio Code. Gå igenom din kod och dina arbetsflöden i samma felsökningssession.
  • Distribuera kod tillsammans med dina arbetsflöden. Inga andra tjänstplaner krävs.
  • Stöd för BizTalk Server-migreringsscenarier så att du kan lyfta och flytta anpassade .NET Framework-investeringar lokalt till molnet.

Med möjligheten att skriva din egen kod kan du utföra scenarier som följande:

  • Anpassad implementering av affärslogik
  • Anpassad parsning för att extrahera information från ett inkommande meddelande
  • Dataverifiering och enkla transformeringar
  • Meddelandeformning för utgående meddelanden till ett annat system, till exempel ett API
  • Beräkningar

Den här funktionen är inte lämplig för scenarier som följande:

  • Processer som tar mer än 10 minuter att köra
  • Stora meddelande- och datatransformeringar
  • Komplexa scenarier för batchbearbetning och diskussion
  • BizTalk Server-pipelinekomponenter som implementerar direktuppspelning

Mer information om begränsningar i Azure Logic Apps finns i Gränser och konfiguration – Azure Logic Apps.

Förutsättningar

Begränsningar

Redigering av anpassade funktioner är för närvarande inte tillgängligt i Azure-portalen. Men när du har distribuerat dina funktioner från Visual Studio Code till Azure följer du stegen i Anropa koden från ett arbetsflöde för Azure-portalen. Du kan använda den inbyggda åtgärden Anropa en lokal funktion i den här logikappen för att välja bland dina distribuerade anpassade funktioner och köra koden. Efterföljande åtgärder i arbetsflödet kan referera till utdata från dessa funktioner, som i andra arbetsflöden. Du kan visa den inbyggda åtgärdens körningshistorik, indata och utdata.

Skapa ett kodprojekt

Det senaste Azure Logic Apps-tillägget (Standard) för Visual Studio Code innehåller en kodprojektmall som ger en smidig upplevelse för att skriva, felsöka och distribuera din egen kod med dina arbetsflöden. Den här projektmallen skapar en arbetsytefil och två exempelprojekt: ett projekt för att skriva koden, det andra projektet för att skapa dina arbetsflöden.

Kommentar

Du kan inte använda samma projektmapp för både din kod och dina arbetsflöden.

  1. Öppna Visual Studio Code. I aktivitetsfältet väljer du Azure-ikonen. (Tangentbord: Skift+Alt+A)

  2. I azure-fönstret som öppnas går du till verktygsfältet Arbetsyta i Azure Logic Apps-menyn och väljer Skapa ny arbetsyta för logikappar.

    Screenshot shows Visual Studio Code, Azure window, Workspace section toolbar, and selected option for Create new logic app workspace.

  3. I rutan Välj mapp bläddrar du till och väljer den lokala mapp som du skapade för projektet.

  4. När promptrutan Skapa ny logikappsarbetsyta visas anger du ett namn på din arbetsyta:

    Screenshot shows Visual Studio Code with prompt to enter workspace name.

    Det här exemplet fortsätter med MyLogicAppWorkspace.

  5. När rutan Välj en projektmall för arbetsytans logikapp visas väljer du Logikapp med anpassat kodprojekt.

    Screenshot shows Visual Studio Code with prompt to select project template for logic app workspace.

  6. Följ de efterföljande anvisningarna för att ange följande exempelvärden:

    Objekt Exempelvärde
    Funktionsnamn för funktionsprojekt WeatherForecast
    Namnområdesnamn för funktionsprojekt Contoso.Enterprise
    Arbetsflödesmall:
    - Tillståndskänsligt arbetsflöde
    - Tillståndslöst arbetsflöde
    Tillståndskänsligt arbetsflöde
    Arbetsflödesnamn MyWorkflow
  7. Välj Öppna i aktuellt fönster.

    När du har slutfört det här steget skapar Visual Studio Code din arbetsyta, som innehåller ett funktionsprojekt och ett logikappsprojekt, som standard, till exempel:

    Screenshot shows Visual Studio Code with created workspace.

    Nod Description
    <arbetsytans namn> Innehåller både ditt funktionsprojekt och logikappens arbetsflödesprojekt.
    Funktioner Innehåller artefakterna för funktionsprojektet. Till exempel <är filen function-name.cs> den kodfil där du kan skapa koden.
    LogicApp Innehåller artefakterna för ditt logikappsprojekt, inklusive ett tomt arbetsflöde.

Skriv din kod

  1. På arbetsytan expanderar du noden Functions, om den inte redan har expanderats.

  2. Öppna filen function-name.cs>, som heter WeatherForecast.cs i det här exemplet.<

    Som standard innehåller den här filen exempelkod som har följande kodelement tillsammans med tidigare angivna exempelvärden där det är lämpligt:

    • Namn på namnområde
    • Klassnamn
    • Funktionsnamn
    • Funktionsparametrar
    • Returnerad typ
    • Komplex typ

    I följande exempel visas den fullständiga exempelkoden:

    //------------------------------------------------------------
    // Copyright (c) Microsoft Corporation. All rights reserved.
    //------------------------------------------------------------
    
    namespace Contoso.Enterprise
    {
        using System;
        using System.Collections.Generic;
        using System.Threading.Tasks;
        using Microsoft.Azure.Functions.Extensions.Workflows;
        using Microsoft.Azure.WebJobs;
        using Microsoft.Extensions.Logging;
    
        /// <summary>
        /// Represents the WeatherForecast flow invoked function.
        /// </summary>
        public class WeatherForecast
        {
    
            private readonly ILogger<WeatherForecast> logger;
    
            public WeatherForecast(ILoggerFactory loggerFactory)
            {
                logger = loggerFactory.CreateLogger<WeatherForecast>();
            }
    
            /// <summary>
            /// Executes the logic app workflow.
            /// </summary>
            /// <param name="zipCode">The zip code.</param>
            /// <param name="temperatureScale">The temperature scale (e.g., Celsius or Fahrenheit).</param>
            [FunctionName("WeatherForecast")]
            public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
            {
    
                this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
                // Generate random temperature within a range based on the temperature scale
                Random rnd = new Random();
                var currentTemp = temperatureScale == "Celsius" ? rnd.Next(1, 30) : rnd.Next(40, 90);
                var lowTemp = currentTemp - 10;
                var highTemp = currentTemp + 10;
    
                // Create a Weather object with the temperature information
                var weather = new Weather()
                {
                    ZipCode = zipCode,
                    CurrentWeather = $"The current weather is {currentTemp} {temperatureScale}",
                    DayLow = $"The low for the day is {lowTemp} {temperatureScale}",
                    DayHigh = $"The high for the day is {highTemp} {temperatureScale}"
                };
    
                return Task.FromResult(weather);
            }
    
            /// <summary>
            /// Represents the weather information for WeatherForecast.
            /// </summary>
            public class Weather
            {
                /// <summary>
                /// Gets or sets the zip code.
                /// </summary>
                public int ZipCode { get; set; }
    
                /// <summary>
                /// Gets or sets the current weather.
                /// </summary>
                public string CurrentWeather { get; set; }
    
                /// <summary>
                /// Gets or sets the low temperature for the day.
                /// </summary>
                public string DayLow { get; set; }
    
                /// <summary>
                /// Gets or sets the high temperature for the day.
                /// </summary>
                public string DayHigh { get; set; }
            }
        }
    }
    

    Funktionsdefinitionen innehåller en standardmetod Run som du kan använda för att komma igång. Den här exempelmetoden Run visar några av de funktioner som är tillgängliga med funktionen anpassade funktioner, till exempel att skicka olika indata och utdata, inklusive komplexa .NET-typer.

    Filen <function-name.cs> innehåller ILogger även gränssnittet, som ger stöd för loggningshändelser till en Application Insights-resurs. Du kan skicka spårningsinformation till Application Insights och lagra den informationen tillsammans med spårningsinformationen från dina arbetsflöden, till exempel:

    private readonly ILogger<WeatherForecast> logger;
    
    public WeatherForecast(ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.CreateLogger<WeatherForecast>();
    }
    
    [FunctionName("WeatherForecast")]
    public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
    {
    
        this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
        <...>
    
    }
    
  3. Ersätt exempelfunktionskoden med din egen och redigera standardmetoden Run för dina egna scenarier. Eller så kan du kopiera funktionen, inklusive deklarationen [FunctionName("<*function-name*>")] , och sedan byta namn på funktionen med ett unikt namn. Du kan sedan redigera den omdöpta funktionen för att uppfylla dina behov.

Det här exemplet fortsätter med exempelkoden utan ändringar.

Kompilera och skapa din kod

När du har skrivit koden kompilerar du för att se till att det inte finns några byggfel. Funktionsprojektet innehåller automatiskt bygguppgifter som kompilerar och sedan lägger till koden i mappen lib\custom i logikappsprojektet där arbetsflöden letar efter anpassade funktioner som ska köras. De här uppgifterna placerar sammansättningarna i mappen lib\custom\net472 .

  1. I Visual Studio Code går du till terminalmenyn och väljer Ny terminal.

  2. I arbetskataloglistan som visas väljer du Functions som din aktuella arbetskatalog för den nya terminalen.

    Screenshot shows Visual Studio Code, prompt for current working directory, and selected Functions directory.

    Visual Studio Code öppnar ett terminalfönster med en kommandotolk.

  3. I terminalfönstretgår du till kommandotolken och anger dotnet-återställning.

    Visual Studio Code analyserar dina projekt och avgör om de är uppdaterade.

    Screenshot shows Visual Studio Code, Terminal window, and completed dotnet restore command.

  4. När kommandotolken visas igen anger du dotnet build. Eller så väljer du Kör aktivitetterminalmenyn. I uppgiftslistan väljer du build (Functions).

    Om bygget lyckas rapporterar terminalfönstret att bygget lyckades.

  5. Bekräfta att följande objekt finns i logikappprojektet:

    • På din arbetsyta expanderar du följande mappar: LogicApp>lib\custom>net472. Bekräfta att undermappen med namnet net472 innehåller de flera sammansättningsfiler (DLL) som krävs för att köra koden, inklusive en fil med namnet< function-name.dll.>

    • På arbetsytan expanderar du följande mappar: LogicApp>lib\custom<>function-name.> Bekräfta att undermappen med namnet <function-name> innehåller en function.json-fil, som innehåller metadata om funktionskoden som du skrev. Arbetsflödesdesignern använder den här filen för att fastställa nödvändiga indata och utdata när du anropar koden.

    I följande exempel visas exempelgenererade sammansättningar och andra filer i logikappprojektet:

    Screenshot shows Visual Studio Code and logic app workspace with function project and logic app project, now with the generated assemblies and other required files.

Anropa koden från ett arbetsflöde

När du har bekräftat att koden kompileras och att logikappsprojektet innehåller de filer som krävs för att koden ska kunna köras öppnar du standardarbetsflödet som ingår i logikappsprojektet.

  1. På arbetsytan under LogicApp expanderar du< noden workflow-name>, öppnar snabbmenyn för workflow.json och väljer Öppna designer.

    I arbetsflödesdesignern som öppnas visas standardarbetsflödet, som ingår i ditt logikappsprojekt, med följande utlösare och åtgärder:

  2. Välj åtgärden Anropa en lokal funktion i den här logikappen.

    Åtgärdens informationsfönster öppnas till höger.

    Screenshot shows Visual Studio Code, workflow designer, and default workflow with trigger and actions.

  3. Granska och bekräfta att parametervärdet funktionsnamn är inställt på den funktion som du vill köra. Granska eller ändra andra parametervärden som din funktion använder.

Felsöka din kod och ditt arbetsflöde

  1. Upprepa följande steg för att starta Azurite Storage-emulatorn tre gånger: en gång var för följande Azure Storage-tjänster:

    • Azure Blob Service
    • Azure Kötjänst
    • Azure Table Service
    1. Välj Kommandopalett på menyn i Visual Studio Code-vyn.

    2. I kommandotolken som visas letar du upp och väljer Azurite: Starta Blob Service.

    3. I arbetskataloglistan som visas väljer du LogicApp.

    4. Upprepa de här stegen för Azurite: Start Queue Service och Azurite: Start Table Service.

    Du lyckas när Aktivitetsfältet i Visual Studio Code längst ned på skärmen visar de tre lagringstjänster som körs, till exempel:

    Screenshot shows Visual Studio Code taskbar with Azure Blob Service, Azure Queue Service, and Azure Table Service running.

  2. I aktivitetsfältet i Visual Studio Code väljer du Kör och Felsöka. (Tangentbord: Ctrl+Skift+D)

    Screenshot shows Visual Studio Code Activity Bar with Run and Debug selected.

  3. I listan Kör och felsök väljer du Anslut till logikappen (LogicApp), om den inte redan är markerad, och väljer sedan Spela upp (grön pil).

    Screenshot shows Run and Debug list with Attach to logic app selected and Play button selected.

    Terminalfönstret öppnas och visar den startade felsökningsprocessen. Fönstret Felsökningskonsol visas sedan och visar felsökningsstatusen. Längst ned i Visual Studio Code blir aktivitetsfältet orange, vilket anger att .NET-felsökningsprogrammet läses in.

  4. I listan Kör och felsök väljer du Anslut till .NET Functions (Functions) och sedan Spela upp (grön pil).

    Screenshot shows Run and Debug list with Attach to NET Functions selected and Play button selected.

  5. Om du vill ange brytpunkter i funktionsdefinitionen (<function-name.cs>) eller arbetsflödesdefinitionen (workflow.json) letar du reda på radnumret där du vill ha brytpunkten och väljer kolumnen till vänster, till exempel:

    Screenshot shows Visual Studio Code and the open function code file with a breakpoint set for a line in code.

  6. Om du vill köra utlösaren Begäran manuellt i arbetsflödet öppnar du arbetsflödets översiktssida.

    1. Öppna snabbmenyn för filen workflow.json i logikappsprojektet och välj Översikt.

      På arbetsflödets översiktssida är knappen Kör utlösare tillgänglig för när du vill starta arbetsflödet manuellt. Under Arbetsflödesegenskaper är värdet för återanrops-URL:en URL:en för en anropsbar slutpunkt som skapas av utlösaren Förfrågning i arbetsflödet. Du kan skicka begäranden till den här URL:en för att utlösa arbetsflödet från andra appar, inklusive andra arbetsflöden för logikappar.

      Screenshot shows Visual Studio Code and workflow's Overview page opened.

  7. I verktygsfältet Översikt väljer du Kör utlösare.

    När arbetsflödet har börjat köras aktiverar felsökningsprogrammet din första brytpunkt.

  8. I verktygsfältet Kör eller felsökaren väljer du en felsökningsåtgärd.

    När arbetsflödeskörningen har slutförts visar sidan Översikt den färdiga körningen och grundläggande information om den körningen.

  9. Om du vill granska mer information om arbetsflödeskörningen väljer du den färdiga körningen. I listan bredvid kolumnen Varaktighet väljer du Visa körning.

    Screenshot shows Visual Studio Code and finished workflow run.

Distribuera din kod

Du kan distribuera dina anpassade funktioner på samma sätt som du distribuerar ditt logikappsprojekt. Oavsett om du distribuerar från Visual Studio Code eller använder en CI/CD DevOps-process ska du se till att du skapar koden och att alla beroende sammansättningar finns i logikappprojektets lib/custom/net472-mapp innan du distribuerar. Mer information finns i Distribuera standardarbetsflöden från Visual Studio Code till Azure.

Felsöka problem

Fel i åtgärdsinformationsfönstret

När du väljer den inbyggda åtgärden Anropa en lokal funktion i den här logikappen i arbetsflödesdesignern visas följande meddelande i åtgärdsfönstret:

Failed to retrieve dynamic inputs. Error details:

I det här scenariot undersöker du logikappprojektet för att kontrollera om mappen LogicApp\lib\custom är tom. Om det är tomt går du till terminalmenyn och väljer Kör aktivitetsversionsfunktioner>.

Ingen process med det angivna namnet körs för närvarande

Om du får det här felmeddelandet när du kör arbetsflödet har du förmodligen felsökningsprocessen kopplad till .NET Functions i stället för till logikappen.

Lös problemet genom att i listan Kör och felsöka väljer du Anslut till logikapp (LogicApp) och väljer sedan Spela upp (grön triangel).

Paketet har inte importerats korrekt

Om utdatafönstret visar ett fel som liknar följande meddelande kontrollerar du att du har .NET 6.0 installerat. Om du har den här versionen installerad kan du prova att avinstallera och sedan installera om.

C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.targets(83,5): warning : The ExtensionsMetadataGenerator package was not imported correctly. Are you missing 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.targets' or 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.props'? [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] WeatherForecast -> C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\\bin\Debug\net472\WeatherForecast.dll C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : It was not possible to find any compatible framework version [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The specified framework 'Microsoft.NETCore.App', version '6.0.0' was not found. [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : - Check application dependencies and target a framework version installed at: [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj]

Build-fel

Om funktionen inte innehåller variabler och du skapar koden kan följande felmeddelanden visas i utdatafönstret:

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

Build FAILED.

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

0 Warning(s)
2 Error(s)

Åtgärda problemet genom att lägga till följande parameter i kodens Run metod:

string parameter1 = null

I följande exempel visas hur metodsignaturen Run visas:

public static Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale, string parameter1 = null)

Nästa steg

Skapa standardarbetsflöden med Visual Studio Code