Aspire ile Azure İşlevleri

Aspire , bulutta dağıtılmış uygulamaların geliştirilmesini basitleştiren, fikirli bir yığındır. Aspire'in Azure İşlevleri ile tümleştirilmesi, Aspire uygulama konağı kapsamında bir Azure İşlevleri .NET projesi geliştirmenizi, hatalarını ayıklamanızı ve düzenlemenizi sağlar.

Önkoşullar

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

Visual Studio kullanıyorsanız 17.12 veya sonraki bir sürüme güncelleştirin. Visual Studio için Azure İşlevleri araçlarının en son sürümüne de sahip olmanız gerekir. Güncelleştirmeleri denetlemek için:

  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 ve istendiği gibi güncelleştirmeleri yükleyin.

Çözüm yapısı

Azure İşlevleri ve Aspire kullanan bir çözümün, uygulama konak projesi ve bir veya daha fazla İşlev projesi dahil olmak üzere birden çok projesi vardır.

Uygulama ana bilgisayar projesi, uygulamanızın başlangıç 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.

Uygulama Sunucu Projesi

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

  • Uygulama konak projesi Aspire.Hosting.Azure.Functions'a başvurmalıdır. Bu paket tümleştirme için gerekli mantığı tanımlar.
  • Uygulama ana bilgisayarı projesinin, orkestrasyona dahil etmek istediğiniz her İşlev projesi için bir proje başvurusu olması gerekir.
  • Uygulama konağı AppHost.cs dosyasında, AddAzureFunctionsProject<TProject>() örneğiniz üzerinde IDistributedApplicationBuilder projeyi çağırarak dahil etmeniz gerekir. Diğer proje türleri için Aspire'de kullandığınız AddProject<TProject>() yönteminin yerine bu yöntemi kullanırsınız. Eğer AddProject<TProject>() kullanıyorsanız, Functions projesi düzgün bir şekilde başlayamaz.

Aşağıdaki örnekte, bir uygulama ana bilgisayar projesi için en düşük AppHost.cs dosya gösterilmektedir:

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:

  • İşlevler projesi, Microsoft.Azure.Functions.Worker ve Microsoft.Azure.Functions.Worker.Sdk'nın2.x sürümlerine başvurmalıdır. Ayrıca tüm Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore başvurularını da 2.x sürümüne güncelleştirmeniz gerekir.

  • 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.
  • İşlevler projesi için dosyada local.settings.json özel uygulama ayarları tanımlamayın. içinde local.settings.json olması gereken tek ayardır "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated". Uygulama ana bilgisayar projesi aracılığıyla diğer tüm uygulama yapılandırmalarını ayarlayın.

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

Uygulama konak projesi kaynakları tanımlar ve kod kullanarak bunlar arasında bağlantı oluşturmanı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. Uygulama ana bilgisayar projenizde AddAzureFunctionsProject<TProject>() çağrıldığında, bir AzureWebJobsStorage bağlantı varsayılan olarak oluşturulur ve İşlevler projesine iletilir. Bu varsayılan bağlantı, yerel geliştirme çalıştırmaları için Azure Depolama öykünücüsü kullanır ve dağıtıldığında otomatik olarak bir depolama hesabı sağlar. Daha fazla denetim için İşlevler proje kaynağında arayarak .WithHostStorage() bu bağlantıyı değiştirebilirsiniz.

Aspire'in konak depolama bağlantısı için ayarladığı varsayılan izinler, WithHostStorage()'ın çağrılıp çağrılmadığına 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ı Katkı Sağlayan
Arama WithHostStorage() Depolama Blob Verileri Katkıda Bulunanı,
Depolama Kuyruğu Veri Katılımcısı
Depolama Tablosu Veri Katkıda Bulunanı

Aşağıdaki örnekte, konak depolama alanının yerini alan ve rol atamasını belirten bir uygulama konak projesi için en düşük AppHost.cs dosya gösterilmektedir:

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();

Uyarı

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 Verileri Katkıda Bulunanı,
Depolama Kuyruğu Veri Katılımcısı
Depolama Tablosu Veri Katkısı Sağlayıcı
Azure Kuyruk Depolama Depolama Blob Verileri Katılımcısı
Depolama Kuyruğu Veri Katılımcısı
Veri Depolama Tablosu Katılımcısı
Azure Event Hubs Azure Event Hubs Veri Yöneticisi
Azure Service Bus Azure Service Bus Veri Sahibi

Aşağıdaki örnekte, kuyruk tetikleyicisini yapılandıran bir uygulama ana bilgisayar projesi için minimal bir AppHost.cs dosya gösterilmektedir. 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.

Uygulamayı barındırma

Aspire, İşlevler projenizi Azure'da barındırmak için iki farklı yolu destekler:

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.

Kapsayıcı uygulama olarak yayımla

Varsayılan olarak, Bir Aspire projesini Azure'da yayımladığınızda, bu proje Azure Container Apps'e dağıtılır. Sistem, KEDA kullanarak İşlevler projeniz için ölçeklendirme kuralları ayarlar. Azure Container Apps kullanırken işlev anahtarları için ek kurulum gerekir. Daha fazla bilgi için bkz. Azure Container Apps'te erişim anahtarları .

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 kullanarak Azure Container Apps'e bir İşlevler projesi dağıttığınızda sistem, İşlevler erişim anahtarlarını otomatik olarak oluşturmaz veya yönetmez. Erişim anahtarlarını kullanmanız gerekiyorsa, bunları Uygulama Konağı kurulumunuzun bir parçası olarak yönetebilirsiniz. Bu bölümde, erişim anahtarları oluşturmak ve yönetmek için uygulama konağınızın Program.cs dosyasından çağırabileceğiniz bir uzantı yönteminin nasıl oluşturulacağı gösterilmektedir. Bu yaklaşımda anahtarları depolamak için Azure Key Vault kullanılır ve bunları kapsayıcı uygulamasına gizli dizi olarak bağlar.

Uyarı

Buradaki davranış, yalnızca İşlevler ana bilgisayar sürümü ContainerApps itibaren kullanılabilen 4.1044.0 gizli sağlayıcısını kullanır. Bu sürüm henüz tüm bölgelerde kullanılamaz ve bu sürüme kadar Aspire projenizi yayımladığınızda İşlevler projesi için kullanılan temel görüntü gerekli değişiklikleri içermeyebilir.

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 .

Uygulama ana bilgisayar projenize aşağıdaki NuGet paketlerini ekleyin:

Uygulama ana bilgisayar 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);
    }
}

Ardından bu yöntemi uygulama konağınızın Program.cs dosyasında 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.

İşlev uygulaması olarak yayımla

Uyarı

Fonksiyon uygulaması olarak yayımlamak için, şu anda önizlemede olan Aspire Azure App Service entegrasyonu gereklidir.

Aspire Azure App Service tümleştirmesini kullanarak Aspire'i bir işlev uygulamasına dağıtacak şekilde yapılandırabilirsiniz. Aspire İşlevler projesini kapsayıcı olarak yayımladığından, işlev uygulamanızın barındırma planı kapsayıcılı uygulamaların dağıtılmasına destek olmalıdır.

Aspire İşlevleri projenizi işlev uygulaması olarak yayımlamak için şu adımları izleyin:

  1. Uygulama barındırıcı projenize Aspire.Hosting.Azure.AppService NuGet paketine referans ekleyin.
  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 Environment 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. İşlevler proje kaynağında, bu projeyi plana yayımlamak için .PublishAsAzureAppServiceWebsite((infra, app) => app.Kind = "functionapp,linux") çağırın.

Önemli

ö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 örnekte, İşlevler projesini işlev uygulaması olarak yayımlayan bir uygulama konak projesi için en düşük AppHost.cs dosya gösterilmektedir:

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

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, İşlevler projenize builder.AddServiceDefaults() eklemek için çağrısı yapmanıza olanak tanır.

  • 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'de bu tür bir tümleştirme önermiyoruz. Microsoft.ApplicationInsights.WorkerService'ün 2.22.0 sürümü ile çalışma zamanı hatalarına yol açabilir, ancak 2.23.0 sürümü bu sorunu giderir. Aspire kullanırken, İşlevler projenizden tüm doğrudan Application Insights tümleştirmelerini kaldırın.

  • Aspire orkestrasyonuna kaydedilen İşlevler projeleri için, uygulama yapılandırmasının çoğunluğu Aspire uygulama ana projesinden gelmelidir. local.settings.json içinde ayarlamalar yapmaktan kaçının, yalnızca FUNCTIONS_WORKER_RUNTIME ayarını yapın. ve Aspire'de local.settings.json aynı ortam değişkenini ayarlarsanız sistem Aspire sürümünü kullanır.

  • İçindeki hiçbir bağlantı için Azure Depolama öykünücüsünü local.settings.json yapılandırmayın. Birçok İşlev başlangıç şablonunda AzureWebJobsStorage için varsayılan olarak öykünücü bulunur. Ancak öykünücü ayarları, bazı geliştirici araçlarının Aspire'in kullandığı sürümle çelişebilecek bir öykünücüyü başlatmasına neden olabilir.