Azure Logic Apps'te Standart iş akışlarından .NET Framework kodu oluşturma ve çalıştırma

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

Standart mantıksal uygulama iş akışınızdan .NET Framework kodu yazmanız ve çalıştırmanız gereken tümleştirme çözümleri için Visual Studio Code'u Azure Logic Apps (Standart) uzantısıyla kullanabilirsiniz. Bu uzantı aşağıdaki özellikleri ve avantajları sağlar:

  • En zorlu tümleştirme sorunlarınızı çözmek için esneklik ve denetime sahip işlevler oluşturarak kendi kodunuzu yazın.
  • Visual Studio Code'da kodun hatalarını yerel olarak ayıklayın. Aynı hata ayıklama oturumunda kodunuzda ve iş akışlarınızda adım adım ilerleyin.
  • İş akışlarınızla birlikte kod dağıtın. Başka hizmet planı gerekmez.
  • Şirket içinden buluta özel .NET Framework yatırımlarını kaldırıp kaydırabilmeniz için BizTalk Server geçiş senaryolarını destekleyin.

Kendi kodunuzu yazma özelliği sayesinde aşağıdaki gibi senaryoları gerçekleştirebilirsiniz:

  • Özel iş mantığı uygulaması
  • Gelen iletiden bilgi ayıklamak için özel ayrıştırma
  • Veri doğrulama ve basit dönüştürmeler
  • API gibi başka bir sisteme giden iletiler için ileti şekillendirme
  • Hesaplamalar

Bu özellik aşağıdaki gibi senaryolar için uygun değildir:

  • Çalışması 10 dakikadan uzun sürecek işlemler
  • Büyük ileti ve veri dönüştürmeleri
  • Karmaşık toplu işleme ve karmaştırma senaryoları
  • Akış uygulayan BizTalk Server işlem hattı bileşenleri

Azure Logic Apps'teki sınırlamalar hakkında daha fazla bilgi için bkz . Sınırlar ve yapılandırma - Azure Logic Apps.

Ön koşullar

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

  • Azure Logic Apps (Standart) uzantısına sahip Visual Studio Code. Bu gereksinimleri karşılamak için Visual Studio Code ile tek kiracılı Azure Logic Apps'te Standart iş akışları oluşturma önkoşullarına bakın.

    • Özel işlevler özelliği şu anda yalnızca Windows işletim sisteminde çalışan Visual Studio Code'da kullanılabilir.

    • Özel işlevler özelliği şu anda yalnızca .NET Framework 4.7.2 derlemelerini çağırmayı destekler.

  • Kod projenizi oluşturmak için kullanılacak yerel klasör

Sınırlamalar

Özel işlevler yazma özelliği şu anda Azure portalında kullanılamıyor. Ancak, işlevlerinizi Visual Studio Code'dan Azure'a dağıttığınızda Azure portalı için bir iş akışından kodunuzu çağırma bölümünde yer alan adımları izleyin. Dağıtılan özel işlevlerinizden seçim yapmak ve kodunuzu çalıştırmak için Bu mantıksal uygulamada Yerel işlev çağır adlı yerleşik eylemi kullanabilirsiniz. İş akışınızdaki sonraki eylemler, diğer tüm iş akışlarında olduğu gibi bu işlevlerden gelen çıkışlara başvurabilir. Yerleşik eylemin çalıştırma geçmişini, girişlerini ve çıkışlarını görüntüleyebilirsiniz.

Kod projesi oluşturma

Visual Studio Code için en son Azure Logic Apps (Standart) uzantısı, iş akışlarınızla kendi kodunuzu yazmak, hata ayıklamak ve dağıtmak için kolaylaştırılmış bir deneyim sağlayan bir kod projesi şablonu içerir. Bu proje şablonu bir çalışma alanı dosyası ve iki örnek proje oluşturur: kodunuzu yazmak için bir proje, iş akışlarınızı oluşturmak için diğer proje.

Dekont

Hem kodunuz hem de iş akışlarınız için aynı proje klasörünü kullanamazsınız.

  1. Visual Studio Code'u açın. Etkinlik Çubuğu'nda Azure simgesini seçin. (Klavye: Shift+Alt+A)

  2. Açılan Azure penceresinde, Çalışma Alanı bölüm araç çubuğunda, Azure Logic Apps menüsünden Yeni mantıksal uygulama çalışma alanı oluştur'u seçin.

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

  3. Klasör seç kutusunda, projeniz için oluşturduğunuz yerel klasöre göz atın ve seçin.

  4. Yeni mantıksal uygulama çalışma alanı oluştur istemi kutusu görüntülendiğinde, çalışma alanınız için bir ad belirtin:

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

    Bu örnek MyLogicAppWorkspace ile devam eder.

  5. Mantıksal uygulama çalışma alanınız için proje şablonu seçin istemi kutusu görüntülendiğinde Özel kod projesi ile mantıksal uygulama'yı seçin.

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

  6. Aşağıdaki örnek değerleri sağlamak için sonraki istemleri izleyin:

    Kalem Örnek değer
    İşlevler projesi için işlev adı WeatherForecast
    İşlevler projesi için ad alanı adı Contoso.Enterprise
    İş akışı şablonu:
    - Durum Bilgisi Olan İş Akışı
    - Durum Bilgisi Olmayan İş Akışı
    Durum Bilgisi Olan İş Akışı
    İş akışı adı MyWorkflow
  7. Geçerli pencerede aç'ı seçin.

    Bu adımı tamamladıktan sonra Visual Studio Code, varsayılan olarak bir işlev projesi ve mantıksal uygulama projesi içeren çalışma alanınızı oluşturur, örneğin:

    Screenshot shows Visual Studio Code with created workspace.

    Düğüm Tanım
    <çalışma alanı-adı> hem işlev projenizi hem de mantıksal uygulama iş akışı projenizi içerir.
    İşlevler İşlev projenizin yapıtlarını içerir. Örneğin function-name.cs <>dosyası, kodunuzu yazabileceğiniz kod dosyasıdır.
    LogicApp Boş bir iş akışı dahil olmak üzere mantıksal uygulama projenizin yapıtlarını içerir.

Kodunuzu yazma

  1. Çalışma alanınızda, henüz genişletilmemişse İşlevler düğümünü genişletin.

  2. Bu örnekte WeatherForecast.cs adlı function-name.cs> dosyasını açın.<

    Varsayılan olarak, bu dosya aşağıdaki kod öğelerinin yanı sıra uygun yerlerde önceden sağlanan örnek değerleri içeren örnek kodu içerir:

    • Ad alanı adı
    • Sınıf adı
    • İşlev adı
    • İşlev parametreleri
    • Dönüş türü
    • Karmaşık tür

    Aşağıdaki örnekte örnek kodun tamamı gösterilmektedir:

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

    İşlev tanımı, başlamak için kullanabileceğiniz varsayılan Run bir yöntem içerir. Bu örnek Run yöntem, karmaşık .NET türleri de dahil olmak üzere farklı giriş ve çıkışları geçirme gibi özel işlevler özelliğiyle kullanılabilen bazı özellikleri gösterir.

    function-name.cs> dosyası, bir Uygulama Analizler kaynağına olayları günlüğe kaydetme desteği sağlayan arabirimini de içerir.ILogger< İzleme bilgilerini Uygulama Analizler gönderebilir ve bu bilgileri iş akışlarınızdaki izleme bilgileriyle birlikte depolayabilirsiniz, örneğin:

    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. Örnek işlev kodunu kendinizle değiştirin ve kendi senaryolarınız için varsayılan Run yöntemi düzenleyin. İsterseniz, bildirimi de dahil olmak üzere [FunctionName("<*function-name*>")] işlevi kopyalayabilir ve ardından işlevi benzersiz bir adla yeniden adlandırabilirsiniz. Ardından yeniden adlandırılan işlevi gereksinimlerinizi karşılayacak şekilde düzenleyebilirsiniz.

Bu örnek, değişiklik yapmadan örnek kodla devam eder.

Kodunuzu derleme ve derleme

Kodunuzu yazmayı bitirdikten sonra derleme hatası olmadığından emin olmak için derleyin. İşlev projeniz otomatik olarak derleme görevlerini içerir. Bu görevler derlenip kodunuzu iş akışlarının çalıştırılacak özel işlevleri arayabileceği mantıksal uygulama projenizdeki lib\custom klasörüne ekler. Bu görevler derlemeleri lib\custom\net472 klasörüne koyar.

  1. Visual Studio Code'da, Terminal menüsünden Yeni Terminal'i seçin.

  2. Görüntülenen çalışma dizini listesinden, yeni terminal için geçerli çalışma dizininiz olarak İşlevler'i seçin.

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

    Visual Studio Code, komut istemi içeren bir terminal penceresi açar.

  3. Terminal penceresindeki komut istemine dotnet restore yazın.

    Visual Studio Code, projelerinizi analiz eder ve bunların güncel olup olmadığını belirler.

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

  4. Komut istemi yeniden gösterildikten sonra dotnet build yazın. Veya Terminal menüsünde Görevi Çalıştır'ı seçin. Görev listesinden derleme (İşlevler) öğesini seçin.

    Derlemeniz başarılı olursa, Terminal penceresi Derlemenin başarılı olduğunu bildirir.

  5. Mantıksal uygulama projenizde aşağıdaki öğelerin mevcut olduğunu onaylayın:

    • Çalışma alanınızda şu klasörleri genişletin: LogicApp>lib\custom>net472. net472 adlı alt klasörün, function-name.dll> adlı< bir dosya da dahil olmak üzere kodunuzu çalıştırmak için gereken birden çok derleme (DLL) dosyasını içerdiğini onaylayın.

    • Çalışma alanınızda şu klasörleri genişletin: LogicApp>lib\custom<>function-name.> function-name> adlı< alt klasörün, yazdığınız işlev koduyla ilgili meta verileri içeren bir function.json dosyası içerdiğini onaylayın. İş akışı tasarımcısı, kodunuzu çağırırken gerekli girişleri ve çıkışları belirlemek için bu dosyayı kullanır.

    Aşağıdaki örnek, mantıksal uygulama projesinde örnek oluşturulan derlemeleri ve diğer dosyaları gösterir:

    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.

Kodunuzu bir iş akışından çağırma

Kodunuzun derlendiğini ve mantıksal uygulama projenizin kodunuzun çalıştırılması için gerekli dosyaları içerdiğini onayladıktan sonra mantıksal uygulama projenize dahil edilen varsayılan iş akışını açın.

  1. Çalışma alanınızda LogicApp'in altında iş akışı adı> düğümünü <genişletin, workflow.json kısayol menüsünü açın ve Tasarım Aracı aç'ı seçin.

    Açılan iş akışı tasarımcısında, mantıksal uygulama projenize dahil edilen varsayılan iş akışı aşağıdaki tetikleyici ve eylemlerle birlikte görüntülenir:

    • HTTP isteği alındığında adlı yerleşik İstek tetikleyicisi
    • Bu mantıksal uygulamada Yerel işlev çağır adlı yerleşik eylem
    • Yalnızca İstek tetikleyicisini kullandığınızda çağıranı yanıtlamak için kullandığınız Yanıt adlı yerleşik Yanıt eylemi
  2. Bu mantıksal uygulamada Yerel işlev çağır adlı eylemi seçin.

    Eylemin bilgi bölmesi sağ tarafta açılır.

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

  3. İşlev Adı parametre değerinin çalıştırmak istediğiniz işleve ayarlandığını gözden geçirin ve onaylayın. İşlevinizin kullandığı diğer parametre değerlerini gözden geçirin veya değiştirin.

Kodunuzda ve iş akışınızda hata ayıklama

  1. Azurite depolama öykünücüsİnİ üç kez başlatmak için aşağıdaki adımları yineleyin: Aşağıdaki Azure Depolama hizmetleri için her biri bir kez:

    • Azure Blob Hizmeti
    • Azure Kuyruk Hizmeti
    • Azure Tablo Hizmeti
    1. Visual Studio Code Görünümü menüsünden Komut Paleti'ni seçin.

    2. Görüntülenen istemde Azurite: Blob Hizmetini Başlat'ı bulun ve seçin.

    3. Görüntülenen çalışma dizini listesinden LogicApp'i seçin.

    4. Azurite için şu adımları yineleyin: Kuyruk Hizmetini Başlat ve Azurite: Tablo Hizmetini Başlat.

    Ekranın alt kısmındaki Visual Studio Code görev çubuğu çalışan üç depolama hizmetini gösterdiğinde başarılısınızdır, örneğin:

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

  2. Visual Studio Code Etkinlik Çubuğu'nda Çalıştır ve Hata Ayıkla'yı seçin. (Klavye: Ctrl+Shift+D)

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

  3. Çalıştır ve Hata Ayıkla listesinden Mantıksal uygulamaya ekle (LogicApp) (henüz seçili değilse) seçeneğini belirleyin ve ardından Yürüt (yeşil ok) öğesini seçin.

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

    Terminal penceresi açılır ve başlatılan hata ayıklama işlemini gösterir. Ardından Hata Ayıklama Konsolu penceresi görüntülenir ve hata ayıklama durumlarını gösterir. Visual Studio Code'un en altında görev çubuğu turuncuya döner ve .NET hata ayıklayıcısının yüklendiğini gösterir.

  4. Çalıştır ve Hata Ayıkla listesinden .NET İşlevlerine (İşlevler) Ekle'yi ve ardından Yürüt (yeşil ok) öğesini seçin.

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

  5. Kesme noktalarını ayarlamak için işlev tanımınızda (<function-name.cs>) veya iş akışı tanımınızda (workflow.json), kesme noktasını istediğiniz satır numarasını bulun ve soldaki sütunu seçin, örneğin:

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

  6. İstek tetikleyicisini iş akışınızda el ile çalıştırmak için iş akışının Genel Bakış sayfasını açın.

    1. Mantıksal uygulama projenizde workflow.json dosyasının kısayol menüsünü açın ve Genel Bakış'ı seçin.

      İş akışının Genel Bakış sayfasında, iş akışını el ile başlatmak istediğinizde tetikleyiciyi çalıştır düğmesi kullanılabilir. İş Akışı Özellikleri'nin altında Geri Arama URL'si değeri, iş akışınızdaki İstek tetikleyicisi tarafından oluşturulan çağrılabilir uç noktanın URL'sidir. Diğer mantıksal uygulama iş akışları da dahil olmak üzere diğer uygulamalardan iş akışınızı tetikleme amacıyla bu URL'ye istek gönderebilirsiniz.

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

  7. Genel Bakış sayfası araç çubuğunda Tetikleyiciyi çalıştır'ı seçin.

    İş akışınız çalışmaya başladıktan sonra hata ayıklayıcı ilk kesme noktanızı etkinleştirir.

  8. Çalıştır menüsünde veya hata ayıklayıcı araç çubuğunda bir hata ayıklama eylemi seçin.

    İş akışı çalıştırması tamamlandıktan sonra, Genel Bakış sayfası tamamlanmış çalıştırmayı ve bu çalıştırmayla ilgili temel ayrıntıları gösterir.

  9. İş akışı çalıştırması hakkında daha fazla bilgi gözden geçirmek için tamamlanan çalıştırmayı seçin. Alternatif olarak, Süre sütununun yanındaki listeden Çalıştırmayı göster'i seçin.

    Screenshot shows Visual Studio Code and finished workflow run.

Kodunuzu dağıtma

Özel işlevlerinizi mantıksal uygulama projenizi dağıttığınız şekilde dağıtabilirsiniz. İster Visual Studio Code'dan dağıtın ister CI/CD DevOps işlemi kullanın, dağıtmadan önce kodunuzu oluşturduğunuzdan ve tüm bağımlı derlemelerin mantıksal uygulama projesinin lib/custom/net472 klasöründe bulunduğundan emin olun. Daha fazla bilgi için bkz . Visual Studio Code'dan Azure'a Standart iş akışları dağıtma.

Sorunları giderme

Eylem bilgileri bölmesi hatası

İş akışı tasarımcısında, Bu mantıksal uygulamada Yerel işlev çağır adlı yerleşik eylemi seçtiğinizde, eylemin bilgi bölmesi aşağıdaki iletiyi gösterir:

Failed to retrieve dynamic inputs. Error details:

Bu senaryoda LogicApp\lib\custom klasörünün boş olup olmadığını denetlemek için mantıksal uygulama projenizi inceleyin. Boşsa, Terminal menüsünde Görev>derleme İşlevlerini Çalıştır'ı seçin.

Belirtilen ada sahip hiçbir işlem şu anda çalışmıyor

İş akışınızı çalıştırdığınızda bu hata iletisini alırsanız, büyük olasılıkla hata ayıklayıcı işlemi mantıksal uygulamanız yerine .NET İşlevleri'ne eklenmiştir.

Bu sorunu çözmek için Çalıştır ve Hata Ayıkla listesinden Mantıksal uygulamaya ekle (LogicApp) öğesini ve ardından Yürüt (yeşil üçgen) öğesini seçin.

Paket doğru içeri aktarılmadı

Çıktı penceresinde aşağıdaki iletiye benzer bir hata gösterildiyse. .NET 6.0'ın yüklü olduğundan emin olun. Bu sürüm yüklüyse kaldırmayı ve sonra yeniden yüklemeyi deneyin.

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]

Derleme hataları

İşleviniz değişken içermiyorsa ve kodunuzu oluşturuyorsanız Çıkış penceresinde aşağıdaki hata iletileri gösterebilirsiniz:

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)

Bu sorunu çözmek için kodunuzun Run yöntemine aşağıdaki parametreyi ekleyin:

string parameter1 = null

Aşağıdaki örnekte yöntem imzasının Run nasıl göründüğü gösterilmektedir:

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

Sonraki adımlar

Visual Studio Code ile Standart iş akışları oluşturma