Menambahkan dan menjalankan skrip C# sebaris dengan alur kerja Standar untuk Azure Logic Apps (Pratinjau)
Berlaku pada: Azure Logic Apps (Standar)
Catatan
Kemampuan ini masih dalam pratinjau dan mengacu pada Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure.
Untuk melakukan tugas integrasi kustom sebaris dengan alur kerja Standar Anda di Azure Logic Apps, Anda dapat langsung menambahkan dan menjalankan skrip C# dari dalam alur kerja Anda. Untuk tugas ini, gunakan tindakan Kode Sebaris bernama Jalankan Kode Skrip CSharp. Tindakan ini mengembalikan hasil dari skrip Anda sehingga Anda dapat menggunakan output ini dalam tindakan alur kerja berikutnya.
Kemampuan ini memberikan manfaat berikut:
Tulis skrip Anda sendiri dalam perancang alur kerja sehingga Anda dapat menyelesaikan tantangan integrasi yang lebih kompleks tanpa harus menggunakan Azure Functions. Tidak ada paket layanan lain yang diperlukan.
Manfaat ini menyederhanakan pengembangan alur kerja ditambah mengurangi kompleksitas dan biaya dengan mengelola lebih banyak layanan.
Buat file kode khusus, yang menyediakan ruang skrip yang dipersonalisasi dalam alur kerja Anda.
Sebarkan skrip bersama alur kerja Anda.
Panduan ini memperlihatkan cara menambahkan tindakan di alur kerja Anda dan menambahkan kode skrip C# yang ingin Anda jalankan.
Prasyarat
Akun dan langganan Azure. Jika Anda tidak memiliki langganan, daftar untuk mendapatkan akun Azure secara gratis.
Alur kerja aplikasi logika Standar tempat Anda ingin menambahkan skrip C#. Alur kerja harus sudah dimulai dengan pemicu. Untuk informasi selengkapnya, lihat Membuat contoh alur kerja aplikasi logika Standar.
Anda dapat menggunakan pemicu apa pun untuk skenario Anda, tetapi sebagai contoh, panduan ini menggunakan pemicu Permintaan bernama Saat permintaan HTTP diterima dan juga tindakan Respons . Alur kerja berjalan ketika aplikasi atau alur kerja lain mengirim permintaan ke URL titik akhir pemicu. Skrip sampel mengembalikan hasil dari eksekusi kode sebagai output yang dapat Anda gunakan dalam tindakan berikutnya.
Skenario contoh
Daftar berikut ini menjelaskan beberapa contoh skenario di mana Anda bisa menggunakan skrip untuk membantu tugas integrasi tertentu:
Mengurai dan melakukan transformasi atau manipulasi pada payload di luar ekspresi bawaan dan kemampuan operasi data. Misalnya, Anda dapat menggunakan skrip untuk mengembalikan skema yang dimodifikasi untuk pemrosesan hilir.
Kelola sumber daya Azure seperti komputer virtual dan mulai atau langkahkan, berdasarkan beberapa logika bisnis.
Jalankan prosedur tersimpan di server SQL yang perlu dijalankan sesuai jadwal dan simpan hasilnya di SharePoint.
Mencatat kesalahan alur kerja dengan informasi terperinci dengan menyimpan ke Azure Storage atau untuk mengirim email atau memberi tahu tim Anda.
Mengenkripsi dan mendekripsi data untuk mematuhi standar keamanan API.
Teruskan file ke dalam skrip untuk zip atau unzip untuk permintaan HTTP.
Agregat data dari berbagai API dan file untuk membuat laporan harian
Pertimbangan
portal Azure menyimpan skrip Anda sebagai file skrip C# (.csx) di folder yang sama dengan file workflow.json Anda, yang menyimpan definisi JSON untuk alur kerja Anda, dan menyebarkan file ke sumber daya aplikasi logika Anda bersama dengan definisi alur kerja. Azure Logic Apps mengkompilasi file ini untuk membuat skrip siap untuk dieksekusi.
Format file .csx memungkinkan Anda menulis lebih sedikit "boilerplate" dan fokus hanya pada penulisan fungsi C#. Anda dapat mengganti nama file .csx untuk manajemen yang lebih mudah selama penyebaran. Namun, setiap kali Anda mengganti nama skrip, versi baru menimpa versi sebelumnya.
Skrip bersifat lokal untuk alur kerja. Untuk menggunakan skrip yang sama di alur kerja lain, lihat file skrip di konsol KuduPlus, lalu salin skrip untuk digunakan kembali di alur kerja lain.
Batasan
Nama | Batas | Catatan |
---|---|---|
Durasi eksekusi skrip | 10 menit | Jika Anda memiliki skenario yang membutuhkan durasi lebih lama, gunakan opsi umpan balik produk untuk memberikan informasi selengkapnya tentang kebutuhan Anda. |
Ukuran output | 100 MB | Ukuran output tergantung pada batas ukuran output untuk tindakan, yang umumnya 100 MB. |
Menambahkan tindakan Jalankan Kode Skrip CSharp
Di portal Azure, buka sumber daya dan alur kerja aplikasi logika Standar Anda di perancang.
Di perancang, ikuti langkah-langkah umum ini untuk menambahkan tindakan Operasi Kode Sebaris bernama Jalankan Kode Skrip CSharp ke alur kerja Anda.
Setelah panel informasi tindakan terbuka, pada tab Parameter , dalam kotak File Kode, perbarui kode sampel yang telah diisi sebelumnya dengan kode skrip Anda sendiri.
Di bagian atas skrip, impor namespace yang diperlukan dan tambahkan referensi rakitan yang diperlukan seperti biasa.
Terapkan
Run
metode :Run
Nama metode telah ditentukan sebelumnya, dan alur kerja Anda hanya dijalankan dengan memanggil metode Jalankan ini saat runtime.Untuk mengakses data yang berasal dari alur kerja Anda,
Run
metode menerima data ini melalui parameter dengan jenis WorkflowContext . Anda bisa menggunakan objek WorkflowContext untuk tugas-tugas berikut:Akses output pemicu, output tindakan sebelumnya, dan alur kerja Anda.
Mengakses variabel lingkungan dan nilai pengaturan aplikasi logika.
Untuk mengembalikan hasil skrip atau data lain ke alur kerja Anda, terapkan
Run
metode dengan jenis pengembalian. Untuk informasi selengkapnya, lihat Mengembalikan data ke alur kerja Anda.Untuk mencatat output dari skrip Anda di C#, terapkan
Run
metode untuk menerima pencatat fungsi melalui parameter denganILogger
jenis, dan gunakanlog
sebagai nama argumen untuk identifikasi yang mudah. Hindari menyertakanConsole.Write
dalam skrip Anda.Penting
Jika Anda memiliki skrip jangka panjang yang memerlukan penghentian yang anggun jika host fungsi dimatikan, sertakan token pembatalan, yang diperlukan, dengan pencatat fungsi Anda.
Untuk informasi selengkapnya, lihat bagian berikut ini:
Contoh berikut menunjukkan tab Parameter tindakan dengan kode skrip sampel:
Contoh berikut menunjukkan contoh kode skrip:
/// 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;} }
Untuk informasi selengkapnya, lihat "#r" - Referensi rakitan eksternal.
Setelah selesai, simpan alur kerja Anda.
Setelah menjalankan alur kerja, Anda dapat meninjau output alur kerja di Application Insights, jika diaktifkan. Untuk informasi selengkapnya, lihat Menampilkan log di Application Insights.
Mengimpor namespace layanan
Untuk mengimpor namespace layanan, lakukan dengan using
klausul seperti biasa. Daftar berikut menyertakan namespace yang diimpor secara otomatis, sehingga opsional untuk Anda sertakan dalam skrip Anda:
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Menambahkan referensi ke rakitan eksternal
Untuk mereferensikan rakitan .NET Framework, gunakan direktif #r "<assembly-name>
, misalnya:
/// 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
{
<...>
}
Daftar berikut ini mencakup rakitan yang secara otomatis ditambahkan oleh lingkungan hosting Azure Functions:
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
Output log ke aliran
Dalam metode Anda Run
, sertakan parameter dengan ILogger
jenis dan log
sebagai nama, misalnya:
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# script successfully executed.");
}
Output log ke Application Insights
Untuk membuat metrik kustom di Application Insights, gunakan LogMetric
metode ekstensi pada ILogger
.
Contoh berikut menunjukkan contoh panggilan metode:
logger.LogMetric("TestMetric", 1234);
Mengakses pemicu alur kerja dan output tindakan dalam skrip Anda
Untuk mengakses data dari alur kerja Anda, gunakan metode berikut yang tersedia untuk WorkflowContext
objek konteks:
metode
GetTriggerResults
Untuk mengakses output pemicu, gunakan metode ini untuk mengembalikan objek yang mewakili pemicu dan outputnya, yang tersedia melalui
Outputs
properti . Objek ini memiliki jenis JObject , dan Anda dapat menggunakan kurung siku ([]) sebagai pengindeks untuk mengakses berbagai properti dalam output pemicu.Contoh berikut mendapatkan data dari
body
properti dalam output pemicu: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 { <...> }
metode
GetActionResults
Untuk mengakses output tindakan, gunakan metode ini untuk mengembalikan objek yang mewakili tindakan dan outputnya, yang tersedia melalui
Outputs
properti . Metode ini menerima nama tindakan sebagai parameter. Contoh berikut mendapatkan data daribody
properti dalam output dari tindakan bernama action-name: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 { <...> }
Mengakses variabel lingkungan atau nilai pengaturan aplikasi
Untuk mendapatkan variabel lingkungan atau nilai pengaturan aplikasi, gunakan System.Environment.GetEnvironmentVariable
metode , misalnya:
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);
}
Mengembalikan data ke alur kerja Anda
Untuk tugas ini, terapkan metode Anda Run
dengan jenis dan return
pernyataan pengembalian. Jika Anda menginginkan versi asinkron, terapkan Run
metode dengan Task<return-type>
atribut dan async
kata kunci. Nilai pengembalian diatur ke properti output body
tindakan skrip, yang kemudian dapat direferensikan oleh tindakan alur kerja berikutnya.
Contoh berikut menunjukkan Run
metode dengan Task<Results>
atribut, async
kata kunci, dan return
pernyataan:
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;}
}
Menampilkan file skrip
Di portal Azure, buka sumber daya aplikasi logika Standar yang memiliki alur kerja yang Anda inginkan.
Pada menu sumber daya aplikasi logika, di bawah Alat Pengembangan, pilih Alat Tingkat Lanjut.
Pada halaman Alat Tingkat Lanjut, pilih Buka, yang membuka konsol KuduPlus .
Buka menu konsol Debug, dan pilih CMD.
Buka lokasi akar aplikasi logika Anda: site/wwwroot
Buka folder alur kerja Anda, yang berisi file .csx, di sepanjang jalur ini: site/wwwroot/{workflow-name}
Di samping nama file, pilih Edit untuk membuka dan menampilkan file.
Melihat log di Application Insights
Di portal Azure, pada menu sumber daya aplikasi logika, di bawah Pengaturan, pilih Application Insights, lalu pilih aplikasi logika Anda.
Pada menu Application Insights , di bawah Pemantauan, pilih Log.
Buat kueri untuk menemukan jejak atau kesalahan dari eksekusi alur kerja Anda, misalnya:
union traces, errors | project TIMESTAMP, message
Kesalahan kompilasi
Dalam rilis ini, editor berbasis web mencakup dukungan IntelliSense terbatas, yang masih dalam penyempurnaan. Kesalahan kompilasi apa pun terdeteksi saat Anda menyimpan alur kerja, dan runtime Azure Logic Apps mengkompilasi skrip Anda. Kesalahan ini muncul di log kesalahan aplikasi logika Anda.
Kesalahan runtime
Jika kesalahan terjadi saat skrip Anda dijalankan, Azure Logic Apps melakukan langkah-langkah berikut:
- Meneruskan kesalahan kembali ke alur kerja Anda.
- Menandai tindakan skrip sebagai Gagal.
- Menyediakan objek kesalahan yang mewakili pengecualian yang dilemparkan dari skrip Anda.
Contoh berikut menunjukkan contoh kesalahan:
Fungsi 'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' gagal dengan kesalahan 'Tindakan 'tidak ada' tidak ada dalam alur kerja.' saat mengeksekusi. Pastikan kode fungsi valid.
Contoh skrip
Contoh skrip berikut melakukan berbagai tugas yang mungkin Anda lakukan
Mendekompresi file ZIP dengan file teks dari tindakan HTTP ke dalam array string
// 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;
}
Mengenkripsi data menggunakan kunci dari pengaturan aplikasi
// 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());
}
}
}
Kelas WorkflowContext
Mewakili konteks alur kerja.
Metode
GetActionResult(string actionName)
Mendapatkan hasil dari tindakan tertentu dalam alur kerja.
Versi asinkron menggunakan Tugas<> sebagai jenis pengembalian, misalnya:
Task<WorkflowOperationResult> GetActionResult(string actionName)
Parameter
actionName
: Nama tindakan.
Mengembalikan
Versi asinkron mengembalikan Task
objek yang mewakili operasi asinkron. Hasil tugas berisi WorkflowOperationResult
objek. Untuk informasi tentang properti objek WorkflowOperationResult , lihat Kelas WorkflowOperationResult.
RunTriggerResult()
Mendapatkan hasil dari pemicu dalam alur kerja.
Versi asinkron menggunakan Tugas<> sebagai jenis pengembalian, misalnya:
Task<WorkflowOperationResult> RunTriggerResult()
Parameter
Tidak ada.
Mengembalikan
Versi asinkron mengembalikan Task
objek yang mewakili operasi asinkron. Hasil tugas berisi WorkflowOperationResult
objek. Untuk informasi tentang properti objek WorkflowOperationResult , lihat Kelas WorkflowOperationResult.
Kelas WorkflowOperationResult
Mewakili hasil dari operasi alur kerja.
Properti
Nama | Tipe | Deskripsi |
---|---|---|
Nama | String | Mendapatkan atau mengatur nama operasi. |
Input | JToken | Mendapatkan atau mengatur input eksekusi operasi. |
Output | JToken | Mendapatkan atau mengatur output eksekusi operasi. |
StartTime | TanggalWaktu? | Mendapatkan atau mengatur waktu mulai operasi. |
EndTime | TanggalWaktu? | Mendapatkan atau mengatur waktu akhir operasi. |
OperationTrackingId | String | Mendapatkan atau mengatur ID pelacakan operasi. |
Kode | String | Mendapatkan atau mengatur kode status untuk tindakan tersebut. |
Keadaan | String | Mendapatkan atau mengatur status untuk tindakan tersebut. |
Kesalahan | JToken | Mendapatkan atau mengatur kesalahan untuk tindakan tersebut. |
TrackedProperties | JToken | Mendapatkan atau mengatur properti terlacak untuk tindakan tersebut. |