Vytvoření a spuštění kódu .NET z pracovních postupů Standard v Azure Logic Apps

Platí pro: Azure Logic Apps (Standard)

V případě řešení integrace, kde musíte vytvářet a spouštět kód .NET z pracovního postupu standardní aplikace logiky, můžete použít Visual Studio Code s rozšířením Azure Logic Apps (Standard). Toto rozšíření poskytuje následující možnosti a výhody:

  • Napište svůj vlastní kód vytvořením funkcí, které mají flexibilitu a kontrolu, abyste vyřešili vaše nejnáročnější problémy s integrací.
  • Ladění kódu místně v editoru Visual Studio Code Projděte si kód a pracovní postupy ve stejné relaci ladění.
  • Nasaďte kód společně s pracovními postupy. Nejsou potřeba žádné jiné plány služeb.
  • Podporují scénáře migrace BizTalk Serveru, abyste mohli přesunout vlastní investice do .NET z místního prostředí do cloudu.

Díky možnosti psaní vlastního kódu můžete provádět například následující scénáře:

  • Implementace vlastní obchodní logiky
  • Vlastní analýza pro extrahování informací z příchozí zprávy
  • Ověření dat a jednoduché transformace
  • Formování zpráv pro odchozí zprávy do jiného systému, například rozhraní API
  • Výpočty

Tato funkce není vhodná pro scénáře, jako jsou následující:

  • Procesy, které poběží déle než 10 minut
  • Velké zprávy a transformace dat
  • Složité scénáře dávkování a debaty
  • Součásti kanálu BizTalk Serveru, které implementují streamování

Další informace o omezeních v Azure Logic Apps najdete v tématu Omezení a konfigurace – Azure Logic Apps.

Požadavky

Omezení

  • Vytváření vlastních funkcí v současné době není na webu Azure Portal dostupné. Po nasazení funkcí z editoru Visual Studio Code do Azure ale postupujte podle kroků v části Volání kódu z pracovního postupu pro Azure Portal. Pomocí integrované akce s názvem Volání místní funkce v této aplikaci logiky můžete vybrat z nasazených vlastních funkcí a spustit kód. Následné akce v pracovním postupu můžou odkazovat na výstupy z těchto funkcí, jako v jakémkoli jiném pracovním postupu. Můžete zobrazit historii spuštění integrované akce, vstupy a výstupy.

  • Vlastní funkce používají izolovaný pracovní proces k vyvolání kódu v pracovním postupu aplikace logiky. Chcete-li zabránit konfliktům odkazů na balíčky mezi vlastním kódem funkce a pracovním procesem, použijte stejné verze balíčků, na které odkazuje pracovní proces. Úplný seznam balíčků a verze odkazované pracovním procesem naleznete v tématu Závislosti pracovního procesu a balíčku.

Vytvoření projektu kódu

Nejnovější rozšíření Azure Logic Apps (Standard) pro Visual Studio Code obsahuje šablonu projektu kódu, která poskytuje zjednodušené prostředí pro psaní, ladění a nasazování vlastního kódu s pracovními postupy. Tato šablona projektu vytvoří soubor pracovního prostoru a dva ukázkové projekty: jeden projekt pro zápis kódu, druhý projekt pro vytvoření pracovních postupů.

Poznámka:

Pro kód i pracovní postupy nemůžete použít stejnou složku projektu.

  1. Otevřete Visual Studio Code. Na panelu aktivit vyberte ikonu Azure . (Klávesnice: Shift+Alt+A)

  2. V okně Azure , které se otevře, na panelu nástrojů oddílu Pracovní prostor v nabídce Azure Logic Apps vyberte Vytvořit nový pracovní prostor aplikace logiky.

    Snímek obrazovky znázorňující Visual Studio Code, okno Azure, panel nástrojů oddílu pracovního prostoru a vybranou možnost Pro vytvoření nového pracovního prostoru aplikace logiky

  3. V poli Vybrat složku přejděte do místní složky, kterou jste vytvořili pro svůj projekt, a vyberte ji.

  4. Po zobrazení výzvy k vytvoření nového pracovního prostoru aplikace logiky zadejte název pracovního prostoru:

    Snímek obrazovky znázorňující Visual Studio Code s výzvou k zadání názvu pracovního prostoru

    Tento příklad pokračuje s MyLogicAppWorkspace.

  5. Po zobrazení výzvy k výběru šablony projektu pro pracovní prostor aplikace logiky vyberte aplikaci logiky s vlastním projektem kódu.

    Snímek obrazovky znázorňující Visual Studio Code s výzvou k výběru šablony projektu pro pracovní prostor aplikace logiky

  6. V případě pracovních postupů aplikací logiky hostovaných v Azure postupujte podle výzvy a vyberte rozhraní .NET Framework nebo .NET 8.

  7. Postupujte podle následujících výzev a zadejte následující ukázkové hodnoty:

    Položka Příklad hodnoty
    Název funkce pro váš projekt funkcí .NET WeatherForecast
    Namespace název projektu funkcí .NET Contoso.Enterprise
    Šablona pracovního postupu:
    - Stavový pracovní postup
    - Bezstavové pracovní postupy
    Stavový pracovní postup
    Název pracovního postupu MyWorkflow
  8. Vyberte Otevřít v aktuálním okně.

    Po dokončení tohoto kroku Visual Studio Code vytvoří pracovní prostor, který obsahuje projekt funkcí .NET a projekt aplikace logiky, například:

    Snímek obrazovky znázorňující Visual Studio Code s vytvořeným pracovním prostorem

    Uzel Popis
    <název pracovního prostoru> Obsahuje projekt funkcí .NET i projekt pracovního postupu aplikace logiky.
    Functions Obsahuje artefakty pro projekt funkcí .NET. Například <název> funkce.cs soubor kódu, kde můžete vytvořit kód.
    LogicApp Obsahuje artefakty projektu aplikace logiky, včetně prázdného pracovního postupu.

Napsání kódu

  1. V pracovním prostoru rozbalte uzel Functions , pokud ještě není rozbalený.

  2. <Otevřete soubor název> funkce.cs s názvem WeatherForecast.cs v tomto příkladu.

    Ve výchozím nastavení tento soubor obsahuje vzorový kód, který obsahuje následující prvky kódu spolu s dříve zadanými ukázkovými hodnotami tam, kde je to vhodné:

    • Název oboru názvů
    • Název třídy
    • Název funkce
    • Parametry funkce
    • Návratový typ
    • Komplexní typ

    Následující příklad ukazuje kompletní vzorový kód:

    //------------------------------------------------------------
    // 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; }
            }
        }
    }
    

    Definice funkce obsahuje výchozí Run metodu, kterou můžete použít k zahájení práce. Tato ukázková Run metoda demonstruje některé možnosti dostupné pomocí funkce vlastních funkcí, jako je předávání různých vstupů a výstupů, včetně složitých typů .NET.

    Název <funkce>.cs soubor také obsahuje ILogger rozhraní, které poskytuje podporu protokolování událostí do prostředku Application Insights. Informace o trasování můžete odesílat do Application Insights a ukládat je spolu s informacemi o trasování z pracovních postupů, například:

    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. Nahraďte vzorový kód funkce vlastními a upravte výchozí Run metodu pro vlastní scénáře. Nebo můžete funkci zkopírovat, včetně [FunctionName("<*function-name*>")] deklarace, a pak ji přejmenovat jedinečným názvem. Přejmenovanou funkci pak můžete upravit tak, aby vyhovovala vašim potřebám.

Tento příklad pokračuje vzorovým kódem bez jakýchkoli změn.

Kompilace a sestavení kódu

Po napsání kódu se zkompilujte a ujistěte se, že neexistují žádné chyby sestavení. Projekt funkcí .NET automaticky obsahuje úlohy sestavení, které se kompilují a pak přidávají váš kód do složky lib\custom v projektu aplikace logiky, kde pracovní postupy hledají vlastní funkce, které se mají spustit. Tyto úlohy umístí sestavení do složky lib\custom\net472 nebo lib\custom\net8 na základě vaší verze .NET.

  1. V editoru Visual Studio Code v nabídce Terminál vyberte Nový terminál.

  2. V seznamu pracovních adresářů, který se zobrazí, vyberte jako aktuální pracovní adresář pro nový terminál funkci Functions .

    Snímek obrazovky ukazuje Visual Studio Code, výzvu k zadání aktuálního pracovního adresáře a vybraného adresáře Functions.

    Visual Studio Code otevře okno terminálu s příkazovým řádkem.

  3. V okně terminálu na příkazovém řádku zadejte dotnet restore.

    Visual Studio Code analyzuje vaše projekty a určuje, jestli jsou aktuální.

    Snímek obrazovky znázorňující Visual Studio Code, okno terminálu a dokončený příkaz dotnet restore

  4. Po opětovném zobrazení příkazového řádku zadejte dotnet build. Nebo v nabídce Terminál vyberte Spustit úlohu. V seznamu úkolů vyberte sestavení (Funkce).

    Pokud sestavení proběhne úspěšně, okno terminálu oznámí, že sestavení proběhlo úspěšně.

  5. Ověřte, že v projektu aplikace logiky existují následující položky:

    • V pracovním prostoru rozbalte následující složky: LogicApp>lib\custom>net472 nebo net8 na základě vaší verze .NET. Ověřte, že podsložka s názvem net472 nebo net8 obsahuje soubory sestavení (DLL) potřebné ke spuštění kódu včetně souboru s názvem< název> funkce.dll.

    • V pracovním prostoru rozbalte následující složky: LogicApp>lib\custom<>function-name.> Ověřte, že podsložka s názvem <název funkce> obsahuje soubor function.json, který obsahuje metadata o kódu funkce, který jste napsali. Návrhář pracovního postupu používá tento soubor k určení potřebných vstupů a výstupů při volání kódu.

    Následující příklad ukazuje ukázková vygenerovaná sestavení a další soubory v projektu aplikace logiky:

    Snímek obrazovky znázorňující pracovní prostor aplikace sady Visual Studio Code a aplikace logiky s projektem funkcí .NET a projektem aplikace logiky, nyní se vygenerovanými sestaveními a dalšími požadovanými soubory

Volání kódu z pracovního postupu

Po potvrzení, že se kód zkompiluje a že projekt aplikace logiky obsahuje potřebné soubory pro spuštění kódu, otevřete výchozí pracovní postup, který je součástí projektu aplikace logiky.

  1. V pracovním prostoru v části LogicApp rozbalte <uzel názvu> pracovního postupu, otevřete místní nabídku pro workflow.json a vyberte Otevřít Návrhář.

    V návrháři pracovního postupu, který se otevře, se zobrazí výchozí pracovní postup zahrnutý v projektu aplikace logiky s následující aktivační událostí a akcemi:

  2. Vyberte akci s názvem Volání místní funkce v této aplikaci logiky.

    Vpravo se otevře informační podokno akce.

    Snímek obrazovky znázorňující Visual Studio Code, návrháře pracovního postupu a výchozí pracovní postup s triggerem a akcemi

  3. Zkontrolujte a ověřte, že je hodnota parametru Název funkce nastavená na funkci, kterou chcete spustit. Zkontrolujte nebo změňte jakékoli jiné hodnoty parametrů, které vaše funkce používá.

Ladění kódu a pracovního postupu

  1. Opakujte následující kroky a třikrát spusťte emulátor úložiště Azurite: jednou pro následující služby Azure Storage:

    • Azure Blob Service
    • Služba fronty Azure
    • Azure Table Service
    1. V nabídce Zobrazení editoru Visual Studio Code vyberte Paleta příkazů.

    2. Na příkazovém řádku, který se zobrazí, vyhledejte a vyberte Azurite: Spustit službu Blob Service.

    3. V seznamu pracovních adresářů, který se zobrazí, vyberte LogicApp.

    4. Opakujte tento postup pro Azurite: Spustit službu fronty a Azurite: Start Table Service.

    Po úspěšném spuštění hlavního panelu editoru Visual Studio Code v dolní části obrazovky se zobrazí tři spuštěné služby úložiště, například:

    Snímek obrazovky znázorňující hlavní panel editoru Visual Studio Code se spuštěnou službou Azure Blob Service, službou Azure Queue Service a službou Azure Table Service

  2. Pomocí následujícího postupu připojte ladicí program k projektu aplikace logiky:

    1. Na panelu aktivit editoru Visual Studio Code vyberte Spustit a Ladit. (Klávesnice: Ctrl+Shift+D)

      Snímek obrazovky znázorňující panel aktivit editoru Visual Studio Code s vybranou možností Spustit a Ladit

    2. V seznamu Spustit a ladit vyberte Připojit k aplikaci logiky (LogicApp), pokud ještě není vybraná, a pak vyberte Přehrát (zelená šipka).

      Snímek obrazovky ukazuje seznam Spustit a Ladit s vybranou možností Připojit k aplikaci logiky a vybraným tlačítkem Přehrát.

      Otevře se okno terminálu a zobrazí se spuštěný proces ladění. Zobrazí se okno konzoly ladění a zobrazí se stavy ladění. V dolní části editoru Visual Studio Code se hlavní panel změní na oranžovou, což znamená, že je načten ladicí program .NET.

  3. Pomocí následujícího postupu na základě kódu připojte ladicí program k projektu funkcí .NET:

    Projekty .NET 8

    1. V nabídce Zobrazení editoru Visual Studio Code vyberte Paleta příkazů.

    2. Na paletě příkazů vyhledejte a vyberte Ladit: Připojit k procesu .NET 5 nebo .NET Core.

      Snímek obrazovky znázorňující seznam Spustit a Ladit s vybranou možností Připojit k funkcím NET a vybraným tlačítkem Přehrát

    3. V seznamu vyhledejte a vyberte proces dotnet.exe . Pokud existuje více dotnet.exe procesů, vyberte proces, který má následující cestu:

      <drive-name>:\Users<user-name.azure-functions-core-tools>\Functions\ExtensionBundles\Microsoft.Azure.Functions.ExtensionBundle.Workflows<extension-bundle-version>\CustomCodeNetFxWorker\net8\Microsoft.Azure.Workflows.Functions.CustomCodeNetFxWorker.dll

    Projekty rozhraní .NET Framework

    V seznamu Spustit a ladit vyberte Připojit k funkcím .NET (Funkce), pokud ještě nejsou vybrané, a pak vyberte Přehrát (zelená šipka).

    Snímek obrazovky znázorňující seznam Spustit a Ladit s vybranou možností Připojit k funkcím NET (Funkce) a vybraným tlačítkem Přehrát

  4. Pokud chcete nastavit zarážky, najděte v definici funkce (<název> funkce.cs) nebo definici pracovního postupu (workflow.json), najděte číslo řádku, kde chcete zarážku, a vyberte sloupec vlevo, například:

    Snímek obrazovky ukazuje Visual Studio Code a soubor otevřeného kódu funkce se zarážkou nastavenou pro řádek v kódu.

  5. Pokud chcete v pracovním postupu ručně spustit trigger požadavku, otevřete stránku Přehled pracovního postupu.

    1. V projektu aplikace logiky otevřete místní nabídku workflow.json souboru a vyberte Přehled.

      Na stránce Přehled pracovního postupu je tlačítko Spustit trigger k dispozici, pokud chcete pracovní postup spustit ručně. V části Vlastnosti pracovního postupu je hodnota adresy URL zpětného volání adresa URL pro volatelný koncový bod vytvořený triggerem požadavku ve vašem pracovním postupu. Na tuto adresu URL můžete odesílat požadavky, které aktivují pracovní postup z jiných aplikací, včetně dalších pracovních postupů aplikace logiky.

      Snímek obrazovky znázorňující otevřenou stránku Přehled nástroje Visual Studio Code a pracovního postupu

  6. Na panelu nástrojů stránky Přehled vyberte Aktivační událost spustit.

    Jakmile se pracovní postup spustí, ladicí program aktivuje první zarážku.

  7. V nabídce Spustit nebo panelu nástrojů ladicího programu vyberte akci ladění.

    Po dokončení pracovního postupu se na stránce Přehled zobrazí dokončené spuštění a základní podrobnosti o tomto spuštění.

  8. Pokud chcete zkontrolovat další informace o spuštění pracovního postupu, vyberte dokončené spuštění. Nebo v seznamu vedle sloupce Doba trvání vyberte Zobrazit spuštění.

    Snímek obrazovky ukazuje Visual Studio Code a dokončené spuštění pracovního postupu.

Nasazení kódu

Vlastní funkce můžete nasadit stejným způsobem jako projekt aplikace logiky. Bez ohledu na to, jestli nasazujete z editoru Visual Studio Code nebo používáte proces CI/CD DevOps, ujistěte se, že kód sestavíte a že všechna závislá sestavení existují ve složce projektu následující aplikace logiky před nasazením:

  • .NET 4.7.2: složka lib/custom/net472

  • .NET 8: lib/custom/net8 folder

Další informace najdete v tématu Nasazení standardních pracovních postupů z editoru Visual Studio Code do Azure.

Poradce při potížích

Chyba podokna informací o akci

Když v návrháři pracovního postupu vyberete integrovanou akci s názvem Volání místní funkce v této aplikaci logiky, zobrazí se v informačním podokně akce následující zpráva:

Failed to retrieve dynamic inputs. Error details:

V tomto scénáři zkontrolujte projekt aplikace logiky a zkontrolujte, jestli je logicApp\lib\custom složka prázdná. Pokud je prázdná, v nabídce Terminál vyberte Spustit funkce sestavení úlohy>.

Aktuálně není spuštěn žádný proces se zadaným názvem.

Pokud se vám při spuštění pracovního postupu zobrazí tato chybová zpráva, pravděpodobně máte k aplikaci logiky připojený proces ladicího programu k funkcím .NET.

Pokud chcete tento problém vyřešit, vyberte v seznamu Spustit a ladit možnost Připojit k aplikaci logiky (LogicApp) a pak vyberte Přehrát (zelený trojúhelník).

Balíček se neimportoval správně

Pokud se v okně Výstup zobrazí chyba podobná následující zprávě, ujistěte se, že máte nainstalovaný aspoň .NET 6.0. Pokud máte tuto verzi nainstalovanou, zkuste ji odinstalovat a znovu nainstalovat.

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]

Selhání sestavení

Pokud vaše funkce neobsahuje proměnné a sestavíte kód, může se v okně Výstup zobrazit následující chybové zprávy:

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)

Pokud chcete tento problém vyřešit, připojte v metodě kódu Run následující parametr:

string parameter1 = null

Následující příklad ukazuje, jak se Run zobrazí podpis metody:

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

Další kroky

Vytváření standardních pracovních postupů pomocí editoru Visual Studio Code