Aspire ile Azure İşlevleri

Aspire , dağıtık uygulamalar oluşturmak, çalıştırmak, hata ayıklamak ve dağıtmak için bir araç zinciridir. Aspire Azure İşlevleri entegrasyonu, bir Azure İşlevleri projesini Aspire AppHost'un parçası olarak geliştirmeye, hata ayıklamanıza ve düzenlemenize olanak tanır. Bu makaledeki .NET örnekleri izole işçi modelini kullanır.

Prerequisites

Aspire ile Azure İşlevleri'nin kullanılması için geliştirme ortamınızı ayarlayın:

Visual Studio kullanıyorsanız, en son Visual Studio ve Azure İşlevleri araç güncellemelerini yükleyin:

  1. Araçlar>Seçenekler'e gidin.
  2. Projeler ve Çözümler'in altında Azure İşlevleri'ne tıklayın.
  3. Güncelleştirmeleri denetle seçeneğini belirleyin ve istendiğinde güncelleştirmeleri yükleyin.

Entegrasyon paketi ve desteklenen AppHost API'leri hakkında daha fazla bilgi için AppHost'ta Azure İşlevleri'ı Düzenle.

Çözüm yapısı

Azure İşlevleri ve Aspire kullanan bir çözüm, AppHost ve bir veya daha fazla Functions projesi dahil olmak üzere birden fazla projeye sahiptir.

AppHost, başvurunuz için giriş noktasıdır. İşlevler projesi dahil olmak üzere uygulamanızın bileşenlerinin kurulumunu düzenler.

Çözüm genellikle bir hizmet varsayılanları projesi de içerir. Bu proje, uygulamanızdaki projeler arasında kullanılacak bir dizi varsayılan hizmet ve yapılandırma sağlar.

AppHost projesi

Entegrasyonu başarılı bir şekilde yapılandırmak için, AppHost projesinin aşağıdaki gereksinimleri karşıladığından emin olun:

  • AppHost, Aspire.Hosting.Azure.Functions öğesine başvurur. Bu paket entegrasyonu tanımlar.
  • Bir C# AppHost, bir Functions projesini referans alır ve AddAzureFunctionsProject<TProject>() çağırır veya proje dosyasının yolunu kullanarak AddAzureFunctionsProject(name, projectPath) çağırır. TypeScript AppHosts, 'nin project-path formunu addAzureFunctionsProjectkullanır.
  • AddAzureFunctionsProjectyerine AddProject kullanın. AddProject kullanılarak eklenen bir Functions projesi düzgün şekilde başlatılamıyor.

Aşağıdaki örnek, bir C# AppHost projesi için minimum AppHost.cs bir dosyayı göstermektedir:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject");

builder.Build().Run();

Azure İşlevleri projesi

Tümleştirmeyi başarıyla yapılandırmak için Azure İşlevleri projesinin aşağıdaki gereksinimleri karşıladığından emin olun:

  • .NET 8 veya daha yeni sürümleri hedefleyin, .NET 9 SDK veya daha yenisini kullanın ve izole çalışan modelini kullanın.

  • Referans: Microsoft.Azure. Functions.Worker, Microsoft.Azure. Functions.Worker.Sdk ve HTTP tetikleyicileri için Microsoft.Azure. Functions.Worker.Extensions.Http.AspNetCore.

  • Dosyanız Program.csIHostApplicationBuilder sürümünü kullanmalıdır. Bu gereksinim, kullanmanız FunctionsApplication.CreateBuilder(args)gerektiği anlamına gelir.

  • Çözümünüz bir hizmet varsayılanları projesi içeriyorsa İşlevler projenizin bunu kullanacak şekilde yapılandırıldığından emin olun:

    • İşlevler projesi, hizmet varsayılanları projesine yönelik bir proje başvurusu içermelidir.
    • IHostApplicationBuilder öğesini Program.cs içinde derlemeden önce builder.AddServiceDefaults() işlevine bir çağrı ekleyin.

Aşağıdaki örnekte Aspire'de kullanılan İşlevler projesi için en düşük Program.cs dosya gösterilmektedir:

using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);

builder.AddServiceDefaults();

builder.ConfigureFunctionsWebApplication();

builder.Build().Run();

Bu örnek, diğer Program.cs birçok örnekte ve Azure İşlevleri şablonlarında görünen varsayılan Application Insights yapılandırmasını içermez. Bunun yerine, Aspire'de builder.AddServiceDefaults() yöntemini çağırarak OpenTelemetry entegrasyonunu yapılandırabilirsiniz.

Tümleştirmeden en iyi şekilde yararlanmak için aşağıdaki yönergeleri göz önünde bulundurun:

  • İşlevler projesine doğrudan Application Insights tümleştirmesi eklemeyin. Bunun yerine Aspire'de izleme, OpenTelemetry desteği aracılığıyla işlenir. Aspire'i hizmet varsayılanları projesi aracılığıyla Verileri Azure İzleyici'ye aktaracak şekilde yapılandırabilirsiniz.
  • Aspire Functions projesini çalıştırırken, AppHost tarafından enjekte edilen ayarları tercih edin. Projeyi func start ile bağımsız olarak çalıştırmak için eşdeğer ayarları local.settings.json içinde tutabilirsiniz; Aspire tarafından eklenen ortam değişkenleri bunları geçersiz kılar.

Aspire ile bağlantı yapılandırması

AppHost kaynakları tanımlar ve kod kullanarak aralarında bağlantı kurmanıza yardımcı olur. Bu bölümde, Azure İşlevleri projenizin kullandığı bağlantıların nasıl yapılandırılıp özelleştirileceği gösterilmektedir.

Aspire, başlamanıza yardımcı olabilecek varsayılan bağlantı izinlerini içerir. Ancak, bu izinler uygulamanız için uygun veya yeterli olmayabilir.

Azure rol tabanlı erişim denetimi (RBAC) kullanan senaryolar için, proje kaynağında WithRoleAssignments() yöntemini çağırarak izinleri özelleştirebilirsiniz. çağrısı WithRoleAssignments()yaptığınızda, tüm varsayılan rol atamaları kaldırılır ve istediğiniz tam küme rol atamalarını açıkça tanımlamanız gerekir. Uygulamanızı Azure Container Apps'te barındırıyorsanız, WithRoleAssignments() kullanmak için AddAzureContainerAppEnvironment() üzerinde DistributedApplicationBuilder çağrı yapmanız gerekir.

Azure İşlevleri barındırma depolama alanı

Azure İşlevleri, temel davranışlarının birkaçı için bir konak depolama bağlantısı (AzureWebJobsStorage) gerektirir. AppHost'unuzu çağırdığınızda AddAzureFunctionsProject<TProject>() , varsayılan olarak bir AzureWebJobsStorage bağlantı oluşturur ve bunu Functions projesine sağlarsınız. Bu varsayılan bağlantı, yerel geliştirme çalışmaları için Azure Depolama emülatörü kullanır ve dağıttığınızda otomatik olarak bir depolama hesabı oluşturur. Daha fazla kontrol için, bu bağlantıyı Functions proje kaynağını çağırarak .WithHostStorage() değiştirin.

Aspire’nin ana bilgisayar depolama bağlantısı için belirlediği varsayılan izinler, WithHostStorage() çağırıp çağırmamanıza bağlıdır. WithHostStorage() eklemek, bir Depolama Hesabı Katkıda Bulunanı atamasını kaldırır. Aşağıdaki tabloda Aspire'in konak depolama bağlantısı için ayar yaptığı varsayılan izinler listeleniyor:

Ana bilgisayar depolama bağlantısı Varsayılan roller
Arama yok WithHostStorage() Depolama Blob Veri Katkı Sağlayıcısı
Depolama Kuyruğu Veri Katkı Sağlayıcı
Depolama Tablosu Veri Katılımcısı
Depolama Hesabı Katılımcısı
Arama WithHostStorage() Depolama Blob Veri Katkı Sağlayıcısı
Depolama Kuyruğu Veri Katkı Sağlayıcı
Depolama Tablosu Veri Katkı Sağlayıcısı

Aşağıdaki örnek, ana depolamayı yerine koyan ve rol atamasını belirten minimal AppHost.cs bir dosyayı gösterir:

using Azure.Provisioning.Storage;

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureContainerAppEnvironment("myEnv");

var myHostStorage = builder.AddAzureStorage("myHostStorage");

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
    .WithHostStorage(myHostStorage)
    .WithRoleAssignments(myHostStorage, StorageBuiltInRole.StorageBlobDataOwner);

builder.Build().Run();

Note

Depolama Blobu Veri Sahibi , konak depolama bağlantısının temel gereksinimleri için önerdiğimiz roldür. Blob hizmetine bağlantı yalnızca Depolama Blob Verisi Katkıcısı Aspire rolüne sahipse, uygulamanız sorunlarla karşılaşabilir.

Üretim senaryoları için hem WithHostStorage() hem de WithRoleAssignments() çağrılarını ekleyin. Ardından bu rolü, ihtiyacınız olan diğer kişilerle birlikte açıkça ayarlayabilirsiniz.

Bağlantıları tetikleme ve bağlama

Tetikleyicileriniz ve bağlamalarınız ada göre bağlantılara referans verir. Aşağıdaki Aspire tümleştirmeleri, proje kaynağındaki WithReference() çağrısı aracılığıyla bu bağlantıları sağlar.

Aspire tümleştirmesi Varsayılan roller
Azure Blob Depolama Depolama Blob Veri Katkı Sağlayıcısı
Depolama Kuyruğu Veri Katkı Sağlayıcı
Depolama Tablosu Veri Katkı Sağlayıcısı
Azure Kuyruk Depolama Depolama Blob Veri Katkı Sağlayıcısı
Depolama Kuyruğu Veri Katkı Sağlayıcı
Depolama Tablosu Veri Katkı Sağlayıcısı
Azure Event Hubs Azure Event Hubs Veri Yöneticisi
Azure Service Bus Azure Service Bus Veri Sahibi

Aşağıdaki örnek, bir kuyruk tetikleyicisini yapılandıran minimal AppHost.cs bir dosyayı gösterir. Bu örnekte, karşılık gelen kuyruk tetikleyicisinin Connection özelliği MyQueueTriggerConnection olarak ayarlanmıştır, bu yüzden WithReference() adı belirtir.

var builder = DistributedApplication.CreateBuilder(args);

var myAppStorage = builder.AddAzureStorage("myAppStorage").RunAsEmulator();
var queues = myAppStorage.AddQueues("queues");

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
    .WithReference(queues, "MyQueueTriggerConnection");

builder.Build().Run();

Diğer tümleştirmelerde, WithReference yapılandırmayı farklı bir şekilde ayarlamak için yapılan çağrılar. Yapılandırmayı Aspire istemci tümleştirmeleri için kullanılabilir hale getirir, ancak tetikleyiciler ve bağlamalar için kullanılamaz. Bu tümleştirmeler için, tetikleyicinin veya bağlayıcının bağlantı bilgilerini çözülmesi için iletmek amacıyla WithEnvironment() çağrısı yapın.

Aşağıdaki örnekte, bağlantı dizesi ifadesini kullanıma sunan bir kaynak için ortam değişkeninin MyBindingConnection nasıl ayarlanacağı gösterilmektedir:

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
    .WithEnvironment("MyBindingConnection", otherIntegration.Resource.ConnectionStringExpression);

Eğer hem Aspire istemci tümleştirmelerinin hem de tetikleyici ve bağlama sisteminin bir bağlantı kullanmasını istiyorsanız, WithReference() ve WithEnvironment()'yi yapılandırabilirsiniz.

Bazı kaynaklar için, bağlantının yapısı yerel olarak çalıştırdığınız ve Azure'da yayımladığınız zaman arasında farklı olabilir. Önceki örnekte, öykünücü olarak çalışan otherIntegration bir kaynak olduğunda, bu nedenle ConnectionStringExpression bir öykünücü bağlantı dizesi döndürebilir. Ancak kaynak yayımlandığında Aspire kimlik tabanlı bir bağlantı ayarlayabilir ve ConnectionStringExpression hizmetin URI'sini döndürebilir. Bu durumda, Azure İşlevleri için kimlik tabanlı bağlantılar ayarlamak için farklı bir ortam değişkeni adı sağlamanız gerekebilir.

Aşağıdaki örnek, gerekli son eki koşullu olarak eklemek için kullanır builder.ExecutionContext.IsPublishMode :

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
    .WithEnvironment("MyBindingConnection" + (builder.ExecutionContext.IsPublishMode ? "__serviceUri" : ""), otherIntegration.Resource.ConnectionStringExpression);

Her bağlamanın desteklediği bağlantı biçimleri ve bu biçimlerin gerektirdiği izinler hakkında ayrıntılı bilgi için bağlamanın başvuru sayfalarına bakın.

Functions kodunun enjekte WithReferenceedilen değerleri nasıl okuduğu hakkında daha fazla bilgi için bkz. Azure İşlevleri runtime configuration.

Uygulamayı barındırma

Aspire, Functions projeleri için Azure Container Apps dağıtımını destekler. Ayrıca ayrı önizleme uygulama uygulama entegrasyonunu kullanarak konteyner özellikli bir fonksiyon uygulamasını hedefleyebilirsiniz:

Her iki durumda da projeniz bir konteyner olarak dağıtılır. Aspire kapsayıcı görüntüsünü sizin için oluşturup Azure Container Registry'ye göndermeyi üstlenir.

Konteyner uygulaması olarak dağıt

AppHost Azure Container Apps'ı hedeflediğinde, Aspire Functions projeniz için KEDA kullanarak ölçeklendirme kuralları ayarlar. Azure Container Apps kullanırken fonksiyon anahtarları için ekstra kurulum yapmanız gerekir. Daha fazla bilgi için Azure Container Apps'te erişim anahtarları konusuna bakın.

Yapılandırılmış AppHost'u aspire deploy çalıştırarak dağıtın. Daha fazla bilgi için bkz. Deploy to Azure Container Apps ve aspire deploy.

Azure Container Apps'te erişim anahtarları

Çeşitli Azure İşlevleri senaryoları, istenmeyen erişime karşı temel bir risk azaltma sağlamak için erişim anahtarlarını kullanır. Örneğin, HTTP tetikleyici işlevleri varsayılan olarak bir erişim anahtarının çağrılmasına ihtiyaç duyar, ancak bu gereksinim özelliği kullanılarak AuthLeveldevre dışı bırakılabilir. Anahtar gerektirebilecek senaryolar için bkz. Azure İşlevleri'nde erişim anahtarlarıyla çalışma .

Aspire ile Azure Container Apps'e bir Functions projesi dağıttığınızda, sistem otomatik olarak Functions erişim anahtarlarını oluşturmaz veya yönetmez. Erişim anahtarlarını kullanmanız gerekiyorsa, bunları AppHost kurulumunuzun bir parçası olarak yönetebilirsiniz. Bu bölüm, erişim anahtarları oluşturmak ve yönetmek için AppHost'unuzun AppHost.cs dosyasından çağırabileceğiniz bir uzantı yöntemini nasıl oluşturacağınızı gösterir. Bu yaklaşımda anahtarları depolamak için Azure Key Vault kullanılır ve bunları kapsayıcı uygulamasına gizli dizi olarak bağlar.

Note

Buradaki ContainerApps davranış, gizli sağlayıcıya bağlıdır ve bu da Functions host sürümü 4.1044.0 veya daha sonrasını gerektirir.

Bu adımlar için Bicep sürümü 0.38.3 veya daha yeni bir sürümü gerektirir. Bicep sürümünüzü kontrol etmek için bir komut isteminden bicep --version komutunu çalıştırabilirsiniz. Azure CLI yüklüyse, Bicep'i en son sürüme hızla güncelleştirmek için kullanabilirsiniz az bicep upgrade .

AppHost projenize aşağıdaki NuGet paketlerini ekleyin:

AppHost projenizde yeni bir sınıf oluşturun ve aşağıdaki kodu ekleyin:

using Aspire.Hosting.Azure;
using Azure.Provisioning.AppContainers;

namespace Aspire.Hosting;

internal static class Extensions
{
    private record SecretMapping(string OriginalName, IAzureKeyVaultSecretReference Reference);

    public static IResourceBuilder<T> PublishWithContainerAppSecrets<T>(
        this IResourceBuilder<T> builder,
        IResourceBuilder<AzureKeyVaultResource>? keyVault = null,
        string[]? hostKeyNames = null,
        string[]? systemKeyExtensionNames = null)
        where T : AzureFunctionsProjectResource
    {
        if (!builder.ApplicationBuilder.ExecutionContext.IsPublishMode)
        {
            return builder;
        }

        keyVault ??= builder.ApplicationBuilder.AddAzureKeyVault("functions-keys");

        var hostKeysToAdd = (hostKeyNames ?? []).Append("default").Select(k => $"host-function-{k}");
        var systemKeysToAdd = systemKeyExtensionNames?.Select(k => $"host-systemKey-{k}_extension") ?? [];
        var secrets = hostKeysToAdd.Union(systemKeysToAdd)
            .Select(secretName => new SecretMapping(
                secretName,
                CreateSecretIfNotExists(builder.ApplicationBuilder, keyVault, secretName.Replace("_", "-"))
            )).ToList();

        return builder
            .WithReference(keyVault)
            .WithEnvironment("AzureWebJobsSecretStorageType", "ContainerApps")
            .PublishAsAzureContainerApp((infra, app) => ConfigureFunctionsContainerApp(infra, app, builder.Resource, secrets));
    }

    private static void ConfigureFunctionsContainerApp(
        AzureResourceInfrastructure infrastructure, 
        ContainerApp containerApp, 
        IResource resource, 
        List<SecretMapping> secrets)
    {
        const string volumeName = "functions-keys";
        const string mountPath = "/run/secrets/functions-keys";

        var appIdentityAnnotation = resource.Annotations.OfType<AppIdentityAnnotation>().Last();
        var containerAppIdentityId = appIdentityAnnotation.IdentityResource.Id.AsProvisioningParameter(infrastructure);

        var containerAppSecretsVolume = new ContainerAppVolume
        {
            Name = volumeName,
            StorageType = ContainerAppStorageType.Secret
        };

        foreach (var mapping in secrets)
        {
            var secret = mapping.Reference.AsKeyVaultSecret(infrastructure);

            containerApp.Configuration.Secrets.Add(new ContainerAppWritableSecret()
            {
                Name = mapping.Reference.SecretName.ToLowerInvariant(),
                KeyVaultUri = secret.Properties.SecretUri,
                Identity = containerAppIdentityId
            });

            containerAppSecretsVolume.Secrets.Add(new SecretVolumeItem
            {
                Path = mapping.OriginalName.Replace("-", "."),
                SecretRef = mapping.Reference.SecretName.ToLowerInvariant()
            });
        }

        containerApp.Template.Containers[0].Value!.VolumeMounts.Add(new ContainerAppVolumeMount
        {
            VolumeName = volumeName,
            MountPath = mountPath
        });
        containerApp.Template.Volumes.Add(containerAppSecretsVolume);
    }

    public static IAzureKeyVaultSecretReference CreateSecretIfNotExists(
        IDistributedApplicationBuilder builder,
        IResourceBuilder<AzureKeyVaultResource> keyVault,
        string secretName)
    {
        var secretParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder, $"param-{secretName}", special: false);
        builder.AddBicepTemplateString($"key-vault-key-{secretName}", """
                param location string = resourceGroup().location
                param keyVaultName string
                param secretName string
                @secure()
                param secretValue string    

                // Reference the existing Key Vault
                resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
                  name: keyVaultName
                }

                // Deploy the secret only if it does not already exist
                @onlyIfNotExists()
                resource newSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
                  parent: keyVault
                  name: secretName
                  properties: {
                      value: secretValue
                  }
                }
                """)
            .WithParameter("keyVaultName", keyVault.GetOutput("name"))
            .WithParameter("secretName", secretName)
            .WithParameter("secretValue", secretParameter);

        return keyVault.GetSecret(secretName);
    }
}

Sonra AppHost AppHost.cs dosyanızda bu yöntemi kullanabilirsiniz:

builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
       .WithHostStorage(storage)
       .WithExternalHttpEndpoints()
       .PublishWithContainerAppSecrets(systemKeyExtensionNames: ["mcp"]);

Bu örnek, uzantı yöntemi tarafından oluşturulan varsayılan bir anahtar kasası kullanır. Model Bağlam Protokolü uzantısıyla kullanılan bir varsayılan anahtar ve sistem anahtarı oluşur.

Bu anahtarları kullanmak için istemcilerden anahtarları anahtar deposundan almanız gerekir.

Fonksiyon uygulaması olarak dağıt

Note

Fonksiyon uygulaması olarak dağıtmak için şu anda önizleme aşamasında olan Aspire Azure App Service entegrasyonu gereklidir.

Aspire'yi bir fonksiyon uygulamasına dağıtacak şekilde Aspire Azure App Service entegrasyonunu kullanarak yapılandırmak mümkündür. Aspire, Functions projesini bir konteyner olarak dağıttığı için, fonksiyon uygulamanızın barındırma planı konteynerize uygulamaları dağıtmayı desteklemelidir.

Aspire Functions projenizi bir fonksiyon uygulaması olarak dağıtmak için şu adımları izleyin:

  1. AppHost dizininden, aspire add Aspire.Hosting.Azure.AppService NuGet paketini eklemek için komutunu çalıştırın.
  2. AppHost.cs bir App Service planı oluşturmak için, AddAzureAppServiceEnvironment() dosyasında örneğinizi IDistributedApplicationBuilder çağırın. Adına rağmen, bunun bir App Service Ortamı kaynağı sağlamadığını unutmayın.
  3. İşlevler proje kaynağında .WithExternalHttpEndpoints() öğesini çağırın. Aspire Azure App Service tümleştirmesi ile dağıtmak için bu gereklidir.
  4. Functions projesi kaynağında, bu projeyi plan içinde bir işlev uygulaması olarak özelleştirmek için .PublishAsAzureAppServiceWebsite((infra, app) => app.Kind = "functionapp,linux") çağırın.

Important

özelliğini app.Kindolarak ayarladığınızdan "functionapp,linux" emin olun. Bu ayar, kaynağın bir işlev uygulaması olarak oluşturulmasını sağlar ve bu da uygulamanızla çalışma deneyimlerini etkiler.

Aşağıdaki örnek, bir Functions projesini fonksiyon uygulaması olarak dağıtan minimal AppHost.cs bir dosyayı gösterir:

var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureAppServiceEnvironment("functions-env");
builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
    .WithExternalHttpEndpoints()
    .PublishAsAzureAppServiceWebsite((infra, app) => app.Kind = "functionapp,linux");

builder.Build().Run();

Bu yapılandırma bir Premium V3 planı oluşturur. Ayrılmış bir App Service planı SKU'su kullanılırken ölçeklendirme olay tabanlı değildir. Bunun yerine ölçeklendirme, App Service planı ayarları aracılığıyla yönetilir.

Dikkat edilmesi gerekenler ve en iyi yöntemler

Azure İşlevleri'nin Aspire ile tümleştirmesini değerlendirirken aşağıdaki noktaları göz önünde bulundurun:

  • Aspire aracılığıyla tetikleme ve bağlama yapılandırması şu anda belirli tümleştirmelerle sınırlıdır. Ayrıntılar için bu makaledeki Aspire ile bağlantı yapılandırması bölümüne bakın.

  • İşlev projenizin Program.cs dosyası IHostApplicationBuilder sürümünü kullanmalıdır. IHostApplicationBuilder kullanarak, Functions projenize builder.AddServiceDefaults() eklemek için çağırabilirsiniz.

  • Aspire, izleme için OpenTelemetry kullanır. Aspire'i hizmet varsayılanları projesi aracılığıyla Verileri Azure İzleyici'ye aktaracak şekilde yapılandırabilirsiniz.

    Diğer birçok Azure İşlevi bağlamında çalışan hizmetini kaydederek Application Insights ile doğrudan tümleştirme ekleyebilirsiniz. Aspire Service Defaults kullanırken ikinci, doğrudan Application Insights pipeline kaydetmeyin.

  • Aspire orkestrasyonuna dahil edilen Fonksiyon projeleri için, AppHost çoğu uygulama yapılandırmasını sağlamalıdır. local.settings.json Fonksiyonlar projesini bağımsız olarak çalıştırmak için kullanabilirsin.func start Aspire projeyi çalıştırdığında, Aspire tarafından enjekte edilen ortam değişkenleri aynı isimlere sahip değerleri geçersiz kılar.local.settings.json

  • AppHost'un yönettiği bağlantılar için ikinci bir Azure Depolama emülatörü başlatmaktan kaçının. Rekabet eden emülatör örnekleri port ve depolama çatışmalarına yol açabilir.

Daha fazla bilgi için bkz. Azure İşlevleri runtime configuration ve Aspire telemetri.