Aracılığıyla paylaş


Azure Logic Apps için Standart iş akışlarıyla satır içinde C# betikleri ekleme ve çalıştırma (Önizleme)

Şunlar için geçerlidir: Azure Logic Apps (Standart)

Not

Bu özellik önizleme aşamasındadır ve Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları'na tabidir.

Azure Logic Apps'te Standart iş akışınızla satır içinde özel tümleştirme görevleri gerçekleştirmek için doğrudan iş akışınızın içinden C# betikleri ekleyebilir ve çalıştırabilirsiniz. Bu görev için CSharp Betik Kodunu Yürüt adlı Satır içi Kod eylemini kullanın. Bu eylem, bu çıkışı iş akışınızın sonraki eylemlerinde kullanabilmeniz için betiğinizden sonuçları döndürür.

Bu özellik aşağıdaki avantajları sağlar:

  • Azure İşlevleri kullanmak zorunda kalmadan daha karmaşık tümleştirme zorluklarını çözebilmeniz için iş akışı tasarımcısında kendi betiklerinizi yazın. Başka hizmet planı gerekmez.

    Bu avantaj, iş akışı geliştirmeyi kolaylaştırır ve daha fazla hizmet yönetimiyle karmaşıklığı ve maliyeti azaltır.

  • İş akışınızda kişiselleştirilmiş bir betik alanı sağlayan ayrılmış bir kod dosyası oluşturun.

  • betikleri iş akışlarınızla birlikte dağıtın.

Bu kılavuzda, eylemin iş akışınıza nasıl ekleneceği ve çalıştırmak istediğiniz C# betik kodunun nasıl ekleneceği gösterilir.

Önkoşullar

  • Bir Azure hesabı ve aboneliği Aboneliğiniz yoksa, ücretsiz bir Azure hesabı için kaydolun.

  • C# betiğinizi eklemek istediğiniz Standart mantıksal uygulama iş akışı. İş akışının zaten bir tetikleyiciyle başlaması gerekir. Daha fazla bilgi için bkz . Örnek Standart mantıksal uygulama iş akışları oluşturma.

    Senaryonuz için herhangi bir tetikleyici kullanabilirsiniz, ancak örnek olarak bu kılavuz http isteği alındığında adlı İstek tetikleyicisini ve yanıt eylemini kullanır. İş akışı, başka bir uygulama veya iş akışı tetikleyicinin uç nokta URL'sine istek gönderdiğinde çalışır. Örnek betik, sonraki eylemlerde kullanabileceğiniz çıkış olarak kod yürütme sonuçlarını döndürür.

Örnek senaryolar

Aşağıdaki listede, betiğin belirli tümleştirme görevlerine yardımcı olduğu bazı örnek senaryolar açıklanmaktadır:

  • Yerleşik ifadeler ve veri işlemleri özelliklerinin ötesinde bir yük üzerinde dönüştürmeleri veya işlemeleri ayrıştırın ve gerçekleştirin. Örneğin, aşağı akış işleme için değiştirilmiş bir şema döndürmek için bir betik kullanabilirsiniz.

  • Sanal makineler gibi Azure kaynaklarını yönetin ve bazı iş mantığına göre bunları başlatın veya adımlayın.

  • Bir zamanlamaya göre çalışması ve sonuçları SharePoint'te depolaması gereken bir SQL sunucusunda saklı yordamı çalıştırın.

  • Azure Depolama'ya kaydederek veya ekibinize e-posta göndererek veya bunu bildirerek ayrıntılı bilgilerle iş akışı hatalarını günlüğe kaydedin.

  • API güvenlik standartlarına uymak için verileri şifreleyin ve şifrelerini çözerek.

  • HTTP isteği için zip veya sıkıştırmayı açmak için betikte bir dosya geçirin.

  • Günlük raporlar oluşturmak için çeşitli API'lerden ve dosyalardan veri toplama

Dikkat edilmesi gereken noktalar

  • Azure portalı betiğinizi bir C# betik dosyası (.csx) olarak workflow.json dosyanızla aynı klasöre kaydeder ve bu klasör iş akışınızın JSON tanımını depolar ve dosyayı iş akışı tanımıyla birlikte mantıksal uygulama kaynağınıza dağıtır. Azure Logic Apps betiği yürütmeye hazır hale getirmek için bu dosyayı derler.

    .csx dosya biçimi daha az "ortak" yazmanıza ve yalnızca bir C# işlevi yazmaya odaklanmanıza olanak tanır. Dağıtım sırasında daha kolay yönetim için .csx dosyasını yeniden adlandırabilirsiniz. Ancak, betiği her yeniden adlandırdığınızda, yeni sürüm önceki sürümün üzerine yazar.

  • Betik iş akışı için yereldir. Aynı betiği diğer iş akışlarında kullanmak için KuduPlus konsolunda betik dosyasını görüntüleyin ve ardından betiği diğer iş akışlarında yeniden kullanmak üzere kopyalayın.

Sınırlamalar

Veri Akışı Adı Sınırla Notlar
Betik çalıştırma süresi 10 dakika Daha uzun sürelere ihtiyaç duyan senaryolarınız varsa, gereksinimleriniz hakkında daha fazla bilgi sağlamak için ürün geri bildirimi seçeneğini kullanın.
Çıkış boyutu 100 MB Çıkış boyutu, eylemler için çıkış boyutu sınırına bağlıdır ve bu sınır genellikle 100 MB'tır.

CSharp Betik Kodunu Yürüt eylemini ekleme

  1. Azure portalında Standart mantıksal uygulama kaynağınızı ve iş akışınızı tasarımcıda açın.

  2. Tasarımcıda, iş akışınıza CSharp Betik Kodunu Yürüt adlı Satır içi Kod İşlemleri eylemini eklemek için bu genel adımları izleyin.

  3. Eylem bilgileri bölmesi açıldıktan sonra, Parametreler sekmesindeki Kod Dosyası kutusunda, önceden doldurulmuş örnek kodu kendi betik kodunuzla güncelleştirin.

    Aşağıdaki örnekte, örnek betik koduyla eylemin Parametreler sekmesi gösterilmektedir:

    Azure portalı, Standart iş akışı tasarımcısı, İstek tetikleyicisi, Bilgi bölmesi açık CSharp Betik Kodunu Yürüt eylemini ve Yanıt eylemini gösteren ekran görüntüsü. Bilgi bölmesinde örnek C# betiği gösterilir.

    Aşağıdaki örnekte örnek betik kodu gösterilmektedir:

    /// Add the required libraries.
    #r "Newtonsoft.Json"
    #r "Microsoft.Azure.Workflows.Scripting"
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Workflows.Scripting;
    using Newtonsoft.Json.Linq;
    
    /// <summary>
    /// Executes the inline C# code.
    /// </summary>
    /// <param name="context">The workflow context.</param>
    /// <remarks> The entry-point to your code. The function signature should remain unchanged.</remarks>
    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
        var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs;
    
        /// Dereferences the 'name' property from the trigger payload.
        var name = triggerOutputs?["body"]?["name"]?.ToString();
    
        /// To get the outputs from a preceding action, you can uncomment and repurpose the following code.
        // var actionOutputs = (await context.GetActionResults("<action-name>").ConfigureAwait(false)).Outputs;
    
        /// The following logs appear in the Application Insights traces table.
        // log.LogInformation("Outputting results.");
        // var name = null;
    
        return new Results
        {
            Message = !string.IsNullOrEmpty(name) ? $"Hello {name} from CSharp action" : "Hello from CSharp action."
        };
    }
    
    public class Results
    {
        public string Message {get; set;}
    }
    

    Daha fazla bilgi için bkz . "#r" - Dış derlemelere başvurma.

  4. bitirdiğinizde iş akışınızı kaydedin.

İş akışınızı çalıştırdıktan sonra, etkinleştirilmişse Application Insights'ta iş akışı çıkışını gözden geçirebilirsiniz. Daha fazla bilgi için bkz . Application Insights'ta günlükleri görüntüleme.

Ad alanlarını içeri aktarma

Ad alanlarını içeri aktarmak için bunu her zamanki gibi yan tümcesiyle using yapın. Aşağıdaki liste otomatik olarak içeri aktarılan ad alanlarını içerdiğinden betiğinize eklemeniz isteğe bağlıdır:

System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host

Dış derlemelere başvuru ekleme

.NET Framework derlemelerine başvurmak için yönergesini #r "<assembly-name> kullanın, örneğin:

/// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;

public static async Task<Results> Run(WorkflowContext context)
{
    <...>
}

public class Results
{
    <...>
}

Aşağıdaki liste, Azure İşlevleri barındırma ortamı tarafından otomatik olarak eklenen derlemeleri içerir:

mscorlib
System
System.Core
System.Xml
System.Net.Http
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Microsoft.Azure.WebJobs.Extensions
System.Web.Http
System.Net.Http.Formatting
Newtonsoft.Json

Akışın çıkışını günlüğe kaydetme

Yönteminize Run tür ve log ad olarak bir parametre ILogger ekleyin, örneğin:

public static void Run(WorkflowContext context, ILogger log)
{
    log.LogInformation($"C# script successfully executed.");
}

Application Insights'a günlük çıkışı

Application Insights'ta özel ölçümler oluşturmak için üzerinde ILoggeruzantı yöntemini kullanınLogMetric.

Aşağıdaki örnekte örnek yöntem çağrısı gösterilmektedir:

logger.LogMetric("TestMetric", 1234);

Betiğinizdeki iş akışı tetikleyicilerine ve eylem çıkışlarına erişme

İş akışınızdaki verilere erişmek için bağlam nesnesi için WorkflowContext aşağıdaki yöntemleri kullanın:

  • GetTriggerResults yöntem

    Tetikleyici çıkışlarına erişmek için bu yöntemi kullanarak tetikleyiciyi ve özelliği aracılığıyla kullanılabilen çıkışlarını temsil eden bir nesne döndürebilirsiniz Outputs . Bu nesnenin JObject türü vardır ve tetikleyici çıkışlarındaki çeşitli özelliklere erişmek için dizin oluşturucu olarak köşeli ayraçları ([]) kullanabilirsiniz.

    Aşağıdaki örnek, tetikleyici çıkışlarındaki özelliğinden body verileri alır:

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
    
        var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs;
        var body = triggerOutputs["body"];
    
        return new Results;
    
    }
    
    public class Results
    {
        <...>
    }
    
  • GetActionResults yöntem

    Eylem çıkışlarına erişmek için, bu yöntemi kullanarak eylemi ve özelliği aracılığıyla kullanılabilen çıkışlarını temsil eden bir nesne döndürebilirsiniz Outputs . Bu yöntem bir eylem adını parametre olarak kabul eder. Aşağıdaki örnek, çıkışlardaki özelliğinden body action-name adlı bir eylemin verilerini alır:

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
    
        var actionOutputs = (await context.GetActionResults("action-name").ConfigureAwait(false)).Outputs;
        var body = actionOutputs["body"];
    
        return new Results;
    
    }
    
    public class Results
    {
        <...>
    }
    

Ortam değişkenlerine veya uygulama ayarı değerine erişme

Ortam değişkeni veya uygulama ayarı değeri almak için yöntemini kullanın System.Environment.GetEnvironmentVariable , örneğin:

public static void Run(WorkflowContext context, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
    System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

verileri iş akışınıza döndürme

Bu görev için yönteminizi Run bir dönüş türü ve return deyimiyle uygulayın. Zaman uyumsuz bir sürüm istiyorsanız, yöntemini bir Task<return-type> özniteliği ve async anahtar sözcüğüyle uygulayınRun. Dönüş değeri, sonraki iş akışı eylemlerinin başvurabileceği betik eyleminin outputs body özelliğine ayarlanır.

Aşağıdaki örnekte özniteliği, anahtar sözcüğü ve deyimi olan Task<Results> async bir return yöntem gösterilmektedirRun:

public static async Task<Results> Run(WorkflowContext context, ILogger log)
{
    return new Results
    {
        Message = !string.IsNullOrEmpty(name) ? $"Returning results with status message."
    };
}

public class Results
{
    public string Message {get; set;}
}

Betik dosyasını görüntüleme

  1. Azure portalında, istediğiniz iş akışını içeren Standart mantıksal uygulama kaynağınızı açın.

  2. Mantıksal uygulama kaynak menüsünde, Geliştirme Araçları'nın altında Gelişmiş Araçlar'ı seçin.

  3. Gelişmiş Araçlar sayfasında Git'i seçerek KuduPlus konsolunu açın.

  4. Hata ayıklama konsolu menüsünü açın ve CMD'yi seçin.

  5. Mantıksal uygulamanızın kök konumuna gidin: site/wwwroot

  6. şu yol boyunca .csx dosyasını içeren iş akışınızın klasörüne gidin: site/wwwroot/{workflow-name}

  7. Dosya adının yanındaki Düzenle'yi seçerek dosyayı açın ve görüntüleyin.

Application Insights'ta günlükleri görüntüleme

  1. Azure portalındaki mantıksal uygulama kaynak menüsünde, Ayarlar'ın altında Application Insights'ı ve ardından mantıksal uygulamanızı seçin.

  2. Application Insights menüsündeki İzleme'nin altında Günlükler'i seçin.

  3. İş akışı yürütmenizdeki izlemeleri veya hataları bulmak için bir sorgu oluşturun, örneğin:

    union traces, errors
    | project TIMESTAMP, message
    

Derleme hataları

Bu sürümde web tabanlı düzenleyici sınırlı IntelliSense desteği içeriyor ve bu destek hala geliştiriliyor. İş akışınızı kaydettiğinizde tüm derleme hataları algılandı ve Azure Logic Apps çalışma zamanı betiğinizi derler. Bu hatalar mantıksal uygulamanızın hata günlüklerinde görünür.

Çalışma zamanı hataları

Betiğiniz yürütürken bir hata oluşursa Azure Logic Apps şu adımları gerçekleştirir:

  • Hatayı iş akışınıza geri geçirir.
  • Betik eylemini Başarısız olarak işaretler.
  • Betiğinizden oluşan özel durumu temsil eden bir hata nesnesi sağlar.

Aşağıdaki örnekte örnek bir hata gösterilmektedir:

'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' işlevi 'Yok' eylemi iş akışında yok' hatasıyla başarısız oldu. yürütülürken. lütfen işlev kodunun geçerli olduğunu doğrulayın.

Örnek betikler

Aşağıdaki örnek betikler, gerçekleştirebileceğiniz çeşitli görevleri gerçekleştirir

HTTP eyleminden metin dosyaları içeren zip dosyasını dize dizisine açma

// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Collections.Generic;

/// <summary>
/// Executes the inline C# code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<List<string>> Run(WorkflowContext context)
{

    var outputs = (await context.GetActionResults("HTTP_1").ConfigureAwait(false)).Outputs;
    var base64zipFileContent = outputs["body"]["$content"].ToString();

    // Decode base64 to bytes.
    byte[] zipBytes = Convert.FromBase64String(base64zipFileContent);

    List<string> fileContents = new List<string>();

    // Creates an in-memory stream from the zip bytes.
    using (MemoryStream zipStream = new MemoryStream(zipBytes))
    {

        // Extracts files from the zip archive.
        using (ZipArchive zipArchive = new ZipArchive(zipStream))
        {

            foreach (ZipArchiveEntry entry in zipArchive.Entries)
            {

                // Read each file's content.
                using (StreamReader reader = new StreamReader(entry.Open()))
                {
                    string fileContent = reader.ReadToEnd();
                    fileContents.Add(fileContent);
                }
            }
        }
    }

    return fileContents;
}

Uygulama ayarlarından bir anahtar kullanarak verileri şifreleme

// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// Executes the inline csharp code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<string> Run(WorkflowContext context)
{

    var compose = (await context.GetActionResults("compose").ConfigureAwait(false)).Outputs;
    var text = compose["sampleData"].ToString();

    return EncryptString(text);

}

public static string EncryptString(string plainText)
{

    var key = Environment.GetEnvironmentVariable("app-setting-key");
    var iv = Environment.GetEnvironmentVariable("app-setting-iv");

    using (Aes aesAlg = Aes.Create())
    {

        aesAlg.Key = Encoding.UTF8.GetBytes(key);
        aesAlg.IV = Encoding.UTF8.GetBytes(iv);
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

        using (MemoryStream msEncrypt = new MemoryStream())
        {

            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {

                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                }

            }

             return Convert.ToBase64String(msEncrypt.ToArray());

        }
    }
}

WorkflowContext sınıfı

bir iş akışı bağlamı temsil eder.

Yöntemler

GetActionResult(string actionName)

İş akışındaki belirli bir eylemin sonucunu alır.

Zaman uyumsuz sürüm, dönüş türü olarak Görev'i<> kullanır, örneğin:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parametreler

actionName: Eylem adı.

Döndürülenler

Zaman uyumsuz sürüm, zaman uyumsuz işlemi temsil eden bir Task nesne döndürür. Görev sonucu bir WorkflowOperationResult nesne içeriyor. WorkflowOperationResult nesne özellikleri hakkında bilgi için bkz. WorkflowOperationResult sınıfı.

RunTriggerResult()

sonucu iş akışındaki tetikleyiciden alır.

Zaman uyumsuz sürüm, dönüş türü olarak Görev'i<> kullanır, örneğin:

Task<WorkflowOperationResult> RunTriggerResult()

Parametreler

Hiçbiri.

Döndürülenler

Zaman uyumsuz sürüm, zaman uyumsuz işlemi temsil eden bir Task nesne döndürür. Görev sonucu bir WorkflowOperationResult nesne içeriyor. WorkflowOperationResult nesne özellikleri hakkında bilgi için bkz. WorkflowOperationResult sınıfı.

WorkflowOperationResult sınıfı

bir iş akışı işleminin sonucunu temsil eder.

Properties

Adı Tür Açıklama
Adı String İşlem adını alır veya ayarlar.
Giriş JToken İşlem yürütme girişlerini alır veya ayarlar.
Çıkışlar JToken İşlem yürütme çıkışlarını alır veya ayarlar.
StartTime DateTime mı? İşlemin başlangıç saatini alır veya ayarlar.
EndTime DateTime mı? İşlemin bitiş saatini alır veya ayarlar.
OperationTrackingId String İşlem izleme kimliğini alır veya ayarlar.
Kod String Eylemin durum kodunu alır veya ayarlar.
Statü String Eylemin durumunu alır veya ayarlar.
Hata JToken Eylemin hatasını alır veya ayarlar.
TrackedProperties JToken Eylemin izlenen özelliklerini alır veya ayarlar.

JavaScript kod parçacıkları ekleme ve çalıştırma