Yalıtılmış çalışan modelinde C# Azure İşlevleri çalıştırma kılavuzu
Bu makale, yalıtılmış çalışan modelini kullanarak .NET'te Azure İşlevleri ile çalışmaya giriş niteliğindedir. Bu model, projenizin diğer çalışma zamanı bileşenlerinden bağımsız olarak .NET sürümlerini hedeflemesine olanak tanır. Desteklenen belirli .NET sürümleri hakkında bilgi için desteklenen sürüme bakın.
.NET yalıtılmış çalışan modeli işlevlerini oluşturmaya hemen başlamak için aşağıdaki bağlantıları kullanın.
Başlarken | Kavramlar | Örnekler |
---|---|---|
Yalıtılmış çalışan modeli projesini Azure'a dağıtma hakkında bilgi edinmek için bkz. Azure İşlevleri dağıtma.
Yalıtılmış çalışan modelinin avantajları
.NET sınıf kitaplığı işlevlerinizi çalıştırabileceğiniz iki mod vardır: İşlevler konak çalışma zamanıyla aynı işlemde (işlem içi) veya yalıtılmış bir çalışan işleminde. .NET işlevleriniz yalıtılmış bir çalışan işleminde çalıştırıldığında aşağıdaki avantajlardan yararlanabilirsiniz:
- Daha az çakışma: İşlevleriniz ayrı bir işlemde çalıştığından, uygulamanızda kullanılan derlemeler konak işlemi tarafından kullanılan aynı derlemelerin farklı sürümleriyle çakışmaz.
- İşlemin tam denetimi: Uygulamanın başlatılmasını denetlersiniz, bu da kullanılan yapılandırmaları yönetebileceğiniz ve ara yazılımı başlatabileceğiniz anlamına gelir.
- Standart bağımlılık ekleme: İşlemin tam denetimine sahip olduğunuzdan, işlev uygulamanıza bağımlılık ekleme ve ara yazılım ekleme için geçerli .NET davranışlarını kullanabilirsiniz.
- .NET sürüm esnekliği: Konak işleminin dışında çalışmak, işlevlerinizin .NET Framework de dahil olmak üzere İşlevler çalışma zamanı tarafından yerel olarak desteklenmeyen .NET sürümlerinde çalışabileceği anlamına gelir.
Devam eden bir C# işlev uygulamanız varsa, bu avantajlardan yararlanmak için uygulamanızı geçirmeniz gerekir. Daha fazla bilgi için bkz . .NET uygulamalarını işlem içi modelden yalıtılmış çalışan modeline geçirme.
İki mod arasında kapsamlı bir karşılaştırma için bkz. .NET Azure İşlevleri işlem içi ve yalıtma çalışan işlemi arasındaki farklar.
Desteklenen sürümler
İşlevler çalışma zamanının sürümleri .NET'in belirli sürümlerini destekler. İşlev sürümleri hakkında daha fazla bilgi edinmek için bkz. Azure İşlevleri çalışma zamanı sürümlerine genel bakış. Sürüm desteği, işlevlerinizin işlem içinde mi yoksa yalıtılmış çalışan işlemi mi çalıştırdığına da bağlıdır.
Not
İşlev uygulamanız tarafından kullanılan İşlevler çalışma zamanı sürümünü değiştirmeyi öğrenmek için bkz . Geçerli çalışma zamanı sürümünü görüntüleme ve güncelleştirme.
Aşağıdaki tabloda, İşlevler'in belirli bir sürümüyle kullanılabilecek en yüksek .NET veya .NET Framework düzeyi gösterilmektedir.
İşlevler çalışma zamanı sürümü | Yalıtılmış çalışan modeli | İşlem içi model5 |
---|---|---|
İşlevler 4.x1 | .NET 9.0 (önizleme) .NET 8.0 .NET 6.02 .NET Framework 4.83 |
.NET 8.0 .NET 6.02 |
İşlevler 1.x4 | yok | .NET Framework 4.8 |
1 .NET 7, yalıtılmış çalışan modelinde daha önce destekleniyordu ancak 14 Mayıs 2024'te resmi desteğin sonuna ulaştı.
2 .NET 6, 12 Kasım 2024'te resmi desteğin sonuna ulaşıyor.
3 Derleme işlemi ayrıca .NET SDK'sını gerektirir.
4 Azure İşlevleri çalışma zamanının 1.x sürümü için destek 14 Eylül 2026'da sona erer. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı 4.x sürümüne geçirmeniz gerekir.
5 İşlem içi model için destek 10 Kasım 2026'da sona eriyor. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmeniz gerekir.
Belirli eski ikincil sürümlerin kaldırılması da dahil olmak üzere Azure İşlevleri sürümlerle ilgili en son haberler için Azure Uygulaması Hizmet duyurularını izleyin.
Proje yapısı
Yalıtılmış çalışan modelini kullanan Azure İşlevleri için bir .NET projesi, desteklenen bir .NET çalışma zamanını hedefleyen bir .NET konsol uygulaması projesidir. Aşağıdakiler, herhangi bir .NET yalıtılmış projesinde gereken temel dosyalardır:
- Projeyi ve bağımlılıkları tanımlayan C# proje dosyası (.csproj).
- Uygulamanın giriş noktası olan dosyayı Program.cs.
- İşlevlerinizi tanımlayan tüm kod dosyaları.
- Projenizdeki işlevler tarafından paylaşılan yapılandırmayı tanımlayan host.json dosyası.
- Makinenizde yerel olarak çalıştırıldığında projeniz tarafından kullanılan ortam değişkenlerini tanımlayan local.settings.json dosyası.
Tam örnekler için bkz . .NET 8 örnek projesi ve .NET Framework 4.8 örnek projesi.
Paket başvuruları
Yalıtılmış çalışan modelini kullanan Azure İşlevleri için bir .NET projesi, hem temel işlevsellik hem de bağlama uzantıları için benzersiz bir paket kümesi kullanır.
Çekirdek paketler
.NET işlevlerinizi yalıtılmış bir çalışan işleminde çalıştırmak için aşağıdaki paketler gereklidir:
Sürüm 2.x (Önizleme)
Çekirdek paketlerin 2.x sürümleri desteklenen çerçeveleri değiştirir ve bu sonraki sürümlerden yeni .NET API'leri için destek getirir. .NET 9 (Önizleme) veya sonraki bir sürümü hedeflediğinizde uygulamanızın her iki paketin 2.0.0-preview1 veya sonraki bir sürümüne başvurması gerekir.
İlk önizleme sürümleri 1.x sürümüne göre yazılmış kodla uyumludur. Ancak, önizleme döneminde daha yeni sürümler yazdığınız kodu etkileyebilecek davranış değişikliklerine neden olabilir.
2.x sürümlerine güncelleştirirken aşağıdaki değişiklikleri not edin:
- 2.0.0-preview2 sürümünden başlayarak Microsoft.Azure.Functions.Worker.Sdk, SDK kapsayıcı derlemeleri için varsayılan yapılandırmalar ekler.
- Microsoft.Azure.Functions.Worker'ın 2.0.0-preview2 sürümünden itibaren:
- Bu sürüm için
IHostApplicationBuilder
destek ekler. Bu kılavuzdaki bazı örnekler, kullanarakIHostApplicationBuilder
alternatifleri göstermek için sekmeler içerir. Bu örnekler için 2.x sürümleri gerekir. - Hizmet sağlayıcısı kapsam doğrulaması, bir geliştirme ortamında çalıştırılırsa varsayılan olarak dahil edilir. Bu davranış ASP.NET Core ile eşleşir.
- Seçenek
EnableUserCodeException
varsayılan olarak etkindir. Özelliği artık kullanım dışı olarak işaretlendi. - Seçenek
IncludeEmptyEntriesInMessagePayload
varsayılan olarak etkindir. Bu seçenek etkinleştirildiğinde, koleksiyonları temsil eden tetikleyici yükleri her zaman boş girdiler içerir. Örneğin, bir ileti gövde olmadan gönderilirse, tetikleyici verileri için boş bir giriş yine destring[]
bulunur. Boş girişlerin eklenmesi, işlevin de başvurabileceği meta veri dizileriyle çapraz başvuruda bulunmayı kolaylaştırır. Hizmet yapılandırmasındaWorkerOptions
olarak ayarlayarakIncludeEmptyEntriesInMessagePayload
false
bu davranışı devre dışı bırakabilirsiniz. ILoggerExtensions
sınıfı olarak yeniden adlandırılırFunctionsLoggerExtensions
. Yeniden adlandırma, bir örnekte kullanırkenLogMetric()
belirsiz birILogger
çağrı hatası oluşmasını önler.
- Bu sürüm için
Uzantı paketleri
.NET yalıtılmış çalışan işlemi işlevleri farklı bağlama türleri kullandığından, benzersiz bir bağlama uzantısı paketleri kümesi gerektirir.
Bu uzantı paketlerini Microsoft.Azure.Functions.Worker.Extensions altında bulabilirsiniz.
Başlatma ve yapılandırma
Yalıtılmış çalışan modelini kullandığınızda, genellikle içinde Program.cs
bulunan işlev uygulamanızın başlangıcına erişebilirsiniz. Kendi konak örneğinizi oluşturmak ve başlatmak sizin sorumluluğunuzdadır. Bu nedenle, uygulamanızın yapılandırma işlem hattına doğrudan erişiminiz de vardır. .NET İşlevleri yalıtılmış çalışan işlemiyle yapılandırmaları çok daha kolay ekleyebilir, bağımlılıkları ekleyebilir ve kendi ara yazılımınızı çalıştırabilirsiniz.
Aşağıdaki kodda HostBuilder işlem hattı örneği gösterilmektedir:
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(s =>
{
s.AddApplicationInsightsTelemetryWorkerService();
s.ConfigureFunctionsApplicationInsights();
s.AddSingleton<IHttpResponderService, DefaultHttpResponderService>();
s.Configure<LoggerFilterOptions>(options =>
{
// The Application Insights SDK adds a default logging filter that instructs ILogger to capture only Warning and more severe logs. Application Insights requires an explicit override.
// Log levels can also be configured using appsettings.json. For more information, see https://learn.microsoft.com/en-us/azure/azure-monitor/app/worker-service#ilogger-logs
LoggerFilterRule toRemove = options.Rules.FirstOrDefault(rule => rule.ProviderName
== "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
if (toRemove is not null)
{
options.Rules.Remove(toRemove);
}
});
})
.Build();
Bu kod gerektirir using Microsoft.Extensions.DependencyInjection;
.
üzerinde IHostBuilder
aramadan Build()
önce şunları yapmalısınız:
ConfigureFunctionsWebApplication()
ASP.NET Core tümleştirmesi kullanıyorsanız veyaConfigureFunctionsWorkerDefaults()
başka bir şekilde arayın. Bu seçeneklerle ilgili ayrıntılar için bkz . HTTP tetikleyicisi .
Uygulamanızı F# kullanarak yazıyorsanız, bazı tetikleyici ve bağlama uzantıları fazladan yapılandırma gerektirir. Bu uzantıları bir F# uygulamasında kullanmayı planlarken Bloblar uzantısı, Tablolar uzantısı ve Cosmos DB uzantısı için kurulum belgelerine bakın.- Projenizin gerektirdiği hizmetleri veya uygulama yapılandırmasını yapılandırın. Ayrıntılar için bkz . Yapılandırma .
Application Insights'ı kullanmayı planlıyorsanız temsilciyiConfigureServices()
aramanızAddApplicationInsightsTelemetryWorkerService()
gerekirConfigureFunctionsApplicationInsights()
. Ayrıntılar için bkz . Application Insights .
Projeniz .NET Framework 4.8'i hedef alıyorsa HostBuilder'ı oluşturmadan önce de eklemeniz FunctionsDebugger.Enable();
gerekir. Yönteminizin Main()
ilk satırı olmalıdır. Daha fazla bilgi için bkz . .NET Framework hedeflenirken hata ayıklama.
HostBuilder, işlev uygulamanızı başlatmak için zaman uyumsuz olarak çalıştırdığınız tam olarak başlatılan IHost
bir örneği derlemek ve döndürmek için kullanılır.
await host.RunAsync();
Yapılandırma
Kullandığınız oluşturucu türü, uygulamayı nasıl yapılandırabileceğinizi belirler.
configureFunctionsWorkerDefaults yöntemi, işlev uygulamasının çalışması için gereken ayarları eklemek için kullanılır. yöntemi aşağıdaki işlevleri içerir:
- Varsayılan dönüştürücü kümesi.
- Özellik adlarında büyük/küçük harfe dönüştürmeyi yoksaymak için varsayılan JsonSerializerOptions değerini ayarlayın.
- Azure İşlevleri günlüğüyle tümleştirme.
- Çıkış bağlama ara yazılımı ve özellikleri.
- İşlev yürütme ara yazılımı.
- Varsayılan gRPC desteği.
.ConfigureFunctionsWorkerDefaults()
Konak oluşturucu işlem hattına erişim sahibi olmak, başlatma sırasında uygulamaya özgü yapılandırmaları da ayarlayabileceğiniz anlamına gelir. Kodunuzun gerektirdiği yapılandırma kaynaklarını eklemek için HostBuilder'da ConfigureAppConfiguration yöntemini bir veya daha fazla kez çağırabilirsiniz. Uygulama yapılandırması hakkında daha fazla bilgi edinmek için bkz . ASP.NET Core'da yapılandırma.
Bu yapılandırmalar yalnızca yazdığınız çalışan kodu için geçerlidir ve İşlevler ana bilgisayarının veya tetikleyicilerinin ve bağlamalarının yapılandırmasını doğrudan etkilemez. İşlev ana bilgisayarında veya tetikleyici ve bağlama yapılandırmasında değişiklik yapmak için yine de host.json dosyasını kullanmanız gerekir.
Not
Özel yapılandırma kaynakları tetikleyicilerin ve bağlamaların yapılandırması için kullanılamaz. Tetikleyici ve bağlama yapılandırması yalnızca uygulama kodunuz için değil İşlevler platformunda kullanılabilir olmalıdır. Bu yapılandırmayı uygulama ayarları, Key Vault başvuruları veya Uygulama Yapılandırması başvuru özellikleri aracılığıyla sağlayabilirsiniz.
Bağımlılık ekleme
Yalıtılmış çalışan modeli, hizmetleri eklemek için standart .NET mekanizmalarını kullanır.
kullandığınızdaHostBuilder
, konak oluşturucuda ConfigureServices'i çağırın ve belirli hizmetleri eklemek için IServiceCollection'da uzantı yöntemlerini kullanın. Aşağıdaki örnek bir tekil hizmet bağımlılığını eklimektedir:
.ConfigureServices(services =>
{
services.AddSingleton<IHttpResponderService, DefaultHttpResponderService>();
})
Bu kod gerektirir using Microsoft.Extensions.DependencyInjection;
. Daha fazla bilgi edinmek için bkz . ASP.NET Core'da bağımlılık ekleme.
Azure istemcilerini kaydetme
Bağımlılık ekleme, diğer Azure hizmetleriyle etkileşime geçmek için kullanılabilir. Microsoft.Extensions.Azure paketini kullanarak .NET için Azure SDK'sından istemciler ekleyebilirsiniz. Paketi yükledikten sonra, içindeki hizmet koleksiyonunda Program.cs
arayarak AddAzureClients()
istemcileri kaydedin. Aşağıdaki örnekte Azure Blobları için adlandırılmış bir istemci yapılandırılır:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices((hostContext, services) =>
{
services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(hostContext.Configuration.GetSection("MyStorageConnection"))
.WithName("copierOutputBlob");
});
})
.Build();
host.Run();
Aşağıdaki örnekte, eklenen istemciyi kullanarak blob içeriğini bir kapsayıcıdan diğerine akış olarak kopyalamak için bu kaydı ve SDK türlerini nasıl kullanabileceğimiz gösterilmektedir:
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Logging;
namespace MyFunctionApp
{
public class BlobCopier
{
private readonly ILogger<BlobCopier> _logger;
private readonly BlobContainerClient _copyContainerClient;
public BlobCopier(ILogger<BlobCopier> logger, IAzureClientFactory<BlobServiceClient> blobClientFactory)
{
_logger = logger;
_copyContainerClient = blobClientFactory.CreateClient("copierOutputBlob").GetBlobContainerClient("samples-workitems-copy");
_copyContainerClient.CreateIfNotExists();
}
[Function("BlobCopier")]
public async Task Run([BlobTrigger("samples-workitems/{name}", Connection = "MyStorageConnection")] Stream myBlob, string name)
{
await _copyContainerClient.UploadBlobAsync(name, myBlob);
_logger.LogInformation($"Blob {name} copied!");
}
}
}
ILogger<T>
Bu örnekteki de bağımlılık ekleme yoluyla elde edildi, bu nedenle otomatik olarak kaydedilir. Günlüğe kaydetme yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için bkz . Günlüğe kaydetme.
İpucu
Örnekte hem hem de Program.cs
işlevinde istemcinin adı için değişmez değer dizesi kullanılmıştır. Bunun yerine işlev sınıfında tanımlanan paylaşılan bir sabit dize kullanmayı göz önünde bulundurun. Örneğin, her iki konuma da ekleyip public const string CopyStorageClientName = nameof(_copyContainerClient);
başvurabilirsiniz BlobCopier.CopyStorageClientName
. Yapılandırma bölümü adını da içinde değil Program.cs
işleviyle benzer şekilde tanımlayabilirsiniz.
Ara yazılım
Yalıtılmış çalışan modeli, ASP.NET'de bulunana benzer bir model kullanarak ara yazılım kaydını da destekler. Bu model, çağırma işlem hattına ve işlevlerin yürütülmesinden önce ve sonra mantık ekleme olanağı sağlar.
ConfigureFunctionsWorkerDefaults uzantısı yöntemi, aşağıdaki örnekte görebileceğiniz gibi kendi ara yazılımınızı kaydetmenizi sağlayan bir aşırı yüklemeye sahiptir.
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults(workerApplication =>
{
// Register our custom middlewares with the worker
workerApplication.UseMiddleware<ExceptionHandlingMiddleware>();
workerApplication.UseMiddleware<MyCustomMiddleware>();
workerApplication.UseWhen<StampHttpHeaderMiddleware>((context) =>
{
// We want to use this middleware only for http trigger invocations.
return context.FunctionDefinition.InputBindings.Values
.First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
});
})
.Build();
UseWhen
Uzantı yöntemi, koşullu olarak yürütülen bir ara yazılımı kaydetmek için kullanılabilir. Bu yönteme boole değeri döndüren bir koşul geçirmelisiniz ve koşulun dönüş değeri olduğunda ara yazılım çağırma işleme işlem hattına true
katılır.
FunctionContext'teki aşağıdaki uzantı yöntemleri, yalıtılmış modelde ara yazılımla çalışmayı kolaylaştırır.
Metot | Açıklama |
---|---|
GetHttpRequestDataAsync |
HTTP tetikleyicisi HttpRequestData tarafından çağrıldığında örneği alır. Bu yöntem, istek üst bilgileri ve tanımlama bilgileri gibi ileti verilerini okumak istediğinizde yararlı olan bir örneğini ValueTask<HttpRequestData?> döndürür. |
GetHttpResponseData |
HTTP tetikleyicisi HttpResponseData tarafından çağrıldığında örneği alır. |
GetInvocationResult |
Geçerli işlev yürütmesinin sonucunu temsil eden bir örneğini InvocationResult alır. Value Değeri gerektiği gibi almak veya ayarlamak için özelliğini kullanın. |
GetOutputBindings |
Geçerli işlev yürütmesi için çıkış bağlama girdilerini alır. Bu yöntemin sonucundaki her girdi türündedir OutputBindingData . gerektiğinde değerini almak veya ayarlamak için özelliğini kullanabilirsiniz Value . |
BindInputAsync |
İstenen BindingMetadata örnek için bir giriş bağlama öğesi bağlar. Örneğin, ara yazılımınız tarafından kullanılması gereken giriş bağlamasına sahip bir BlobInput işleviniz olduğunda bu yöntemi kullanabilirsiniz. |
Bu, örneği okuyan HttpRequestData
ve işlev yürütme sırasında örneği güncelleştiren HttpResponseData
bir ara yazılım uygulaması örneğidir:
internal sealed class StampHttpHeaderMiddleware : IFunctionsWorkerMiddleware
{
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
var requestData = await context.GetHttpRequestDataAsync();
string correlationId;
if (requestData!.Headers.TryGetValues("x-correlationId", out var values))
{
correlationId = values.First();
}
else
{
correlationId = Guid.NewGuid().ToString();
}
await next(context);
context.GetHttpResponseData()?.Headers.Add("x-correlationId", correlationId);
}
}
Bu ara yazılım, belirli bir istek üst bilgisinin (x-correlationId) varlığını denetler ve mevcut olduğunda bir yanıt üst bilgisini damgalama için üst bilgi değerini kullanır. Aksi takdirde, yeni bir GUID değeri oluşturur ve bunu yanıt üst bilgisini damgalama için kullanır. İşlev uygulamanızda özel ara yazılım kullanmanın daha eksiksiz bir örneği için özel ara yazılım başvuru örneğine bakın.
JSON serileştirmesini özelleştirme
Yalıtılmış çalışan modeli varsayılan olarak kullanır System.Text.Json
. Hizmetleri dosyanızın Program.cs
bir parçası olarak yapılandırarak seri hale getiricinin davranışını özelleştirebilirsiniz. Bu bölüm genel amaçlı serileştirmeyi kapsar ve ayrı olarak yapılandırılması gereken ASP.NET Core tümleştirmesi ile HTTP tetikleyicisi JSON serileştirmesini etkilemeyecektir.
Aşağıdaki örnek bunu kullanarak ConfigureFunctionsWebApplication
gösterir, ancak aynı zamanda için ConfigureFunctionsWorkerDefaults
de çalışır:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication((IFunctionsWorkerApplicationBuilder builder) =>
{
builder.Services.Configure<JsonSerializerOptions>(jsonSerializerOptions =>
{
jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
jsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
jsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
// override the default value
jsonSerializerOptions.PropertyNameCaseInsensitive = false;
});
})
.Build();
host.Run();
Bunun yerine serileştirme için JSON.NET (Newtonsoft.Json
) kullanmak isteyebilirsiniz. Bunu yapmak için paketi yüklersiniz Microsoft.Azure.Core.NewtonsoftJson
. Ardından, hizmet kaydınızda özelliği yapılandırmada Serializer
WorkerOptions
yeniden atayabilirsiniz. Aşağıdaki örnek bunu kullanarak ConfigureFunctionsWebApplication
gösterir, ancak aynı zamanda için ConfigureFunctionsWorkerDefaults
de çalışır:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication((IFunctionsWorkerApplicationBuilder builder) =>
{
builder.Services.Configure<WorkerOptions>(workerOptions =>
{
var settings = NewtonsoftJsonObjectSerializer.CreateJsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
workerOptions.Serializer = new NewtonsoftJsonObjectSerializer(settings);
});
})
.Build();
host.Run();
İşlev olarak tanınan yöntemler
İşlev yöntemi, aşağıdaki örnekte gösterildiği gibi yöntemine uygulanan bir Function
özniteliği ve giriş parametresine tetikleyici özniteliği uygulanmış bir ortak sınıfın genel yöntemidir:
[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
Tetikleyici özniteliği tetikleyici türünü belirtir ve giriş verilerini bir yöntem parametresine bağlar. Önceki örnek işlev bir kuyruk iletisi tarafından tetiklenmiş ve kuyruk iletisi parametresindeki myQueueItem
yöntemine geçirilir.
Function
özniteliği, yöntemini bir işlev giriş noktası olarak işaretler. Ad proje içinde benzersiz olmalı, harfle başlamalıdır ve yalnızca en fazla 127 karakter uzunluğunda harf, _
sayı, ve -
içermelidir. Proje şablonları genellikle adlı Run
bir yöntem oluşturur, ancak yöntem adı geçerli bir C# yöntemi adı olabilir. yöntemi, bir ortak sınıfın genel üyesi olmalıdır. Hizmetlerin bağımlılık ekleme yoluyla geçirilebilmesi için genellikle bir örnek yöntemi olmalıdır.
İşlev parametreleri
İşlev yöntemi imzası kapsamında ekleyebileceğiniz parametrelerden bazıları şunlardır:
- Parametreleri öznitelik olarak dekore ederek bu şekilde işaretlenen bağlamalar. İşlev tam olarak bir tetikleyici parametresi içermelidir.
- Geçerli çağrı hakkında bilgi sağlayan bir yürütme bağlamı nesnesi.
- Düzgün kapatma için kullanılan bir iptal belirteci.
Yürütme bağlamı
.NET yalıtılmış işlevi yöntemlerinize bir FunctionContext nesnesi geçirir. Bu nesne, GetLogger yöntemini çağırıp bir dize sağlayarak günlüklere yazabileceğiniz bir ILogger
categoryName
örnek almanıza olanak tanır. Bağımlılık ekleme kullanmak zorunda kalmadan bir ILogger
elde etmek için bu bağlamı kullanabilirsiniz. Daha fazla bilgi için bkz . Günlüğe kaydetme.
İptal belirteçleri
İşlev bir CancellationToken parametresini kabul edebilir ve bu parametre, işletim sisteminin işlev sonlandırılacakken kodunuzu bildirmesini sağlar. İşlevin verileri tutarsız bir durumda bırakabilecek şekilde beklenmedik şekilde sonlandırılmadığından emin olmak için bu bildirimi kullanabilirsiniz.
İptal belirteçleri yalıtılmış bir çalışan işleminde çalıştırılırken .NET işlevlerinde desteklenir. Aşağıdaki örnek, iptal isteği alındığında bir özel durum oluşturur:
[Function(nameof(ThrowOnCancellation))]
public async Task ThrowOnCancellation(
[EventHubTrigger("sample-workitem-1", Connection = "EventHubConnection")] string[] messages,
FunctionContext context,
CancellationToken cancellationToken)
{
_logger.LogInformation("C# EventHub {functionName} trigger function processing a request.", nameof(ThrowOnCancellation));
foreach (var message in messages)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(6000); // task delay to simulate message processing
_logger.LogInformation("Message '{msg}' was processed.", message);
}
}
Aşağıdaki örnek, bir iptal isteği alındığında temizleme eylemleri gerçekleştirir:
[Function(nameof(HandleCancellationCleanup))]
public async Task HandleCancellationCleanup(
[EventHubTrigger("sample-workitem-2", Connection = "EventHubConnection")] string[] messages,
FunctionContext context,
CancellationToken cancellationToken)
{
_logger.LogInformation("C# EventHub {functionName} trigger function processing a request.", nameof(HandleCancellationCleanup));
foreach (var message in messages)
{
if (cancellationToken.IsCancellationRequested)
{
_logger.LogInformation("A cancellation token was received, taking precautionary actions.");
// Take precautions like noting how far along you are with processing the batch
_logger.LogInformation("Precautionary activities complete.");
break;
}
await Task.Delay(6000); // task delay to simulate message processing
_logger.LogInformation("Message '{msg}' was processed.", message);
}
}
Bağlamalar
Bağlamalar yöntemler, parametreler ve dönüş türleri üzerindeki öznitelikler kullanılarak tanımlanır. Bağlamalar verileri dizeler, diziler ve düz eski sınıf nesneleri (POCO' lar) gibi serileştirilebilir türler olarak sağlayabilir. Bazı bağlama uzantıları için, hizmet SDK'larında tanımlanan hizmete özgü türlere de bağlanabilirsiniz.
HTTP tetikleyicileri için HTTP tetikleyicisi bölümüne bakın.
Yalıtılmış çalışan işlemi işlevlerine sahip tetikleyicileri ve bağlamaları kullanan eksiksiz bir başvuru örnekleri kümesi için bağlama uzantıları başvuru örneğine bakın.
Giriş bağlamaları
İşlev, bir işleve veri geçirebilen sıfır veya daha fazla giriş bağlamasına sahip olabilir. Tetikleyiciler gibi giriş bağlamaları da bir giriş parametresine bağlama özniteliği uygulanarak tanımlanır. İşlev yürütürken, çalışma zamanı bağlamada belirtilen verileri almaya çalışır. İstenen veriler genellikle bağlama parametreleri kullanılarak tetikleyici tarafından sağlanan bilgilere bağlıdır.
Çıkış bağlamaları
Bir çıkış bağlamasına yazmak için, ilişkili hizmete nasıl yazacağını tanımlayan işlev yöntemine bir çıkış bağlama özniteliği uygulamanız gerekir. yöntemi tarafından döndürülen değer çıkış bağlamasına yazılır. Örneğin, aşağıdaki örnek bir çıkış bağlaması kullanarak adlı output-queue
ileti kuyruğuna bir dize değeri yazar:
[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
{
// Use a string array to return more than one message.
string[] messages = {
$"Album name = {myQueueItem.Name}",
$"Album songs = {myQueueItem.Songs.ToString()}"};
_logger.LogInformation("{msg1},{msg2}", messages[0], messages[1]);
// Queue Output messages
return messages;
}
Birden çok çıkış bağlaması
Çıkış bağlamasına yazılan veriler her zaman işlevin dönüş değeridir. Birden fazla çıkış bağlamasına yazmanız gerekiyorsa, özel bir dönüş türü oluşturmanız gerekir. Bu dönüş türü, sınıfın bir veya daha fazla özelliğine uygulanan çıkış bağlama özniteliğine sahip olmalıdır. Aşağıdaki örnek, hem HTTP yanıtına hem de kuyruk çıkış bağlamasına yazan ASP.NET Core tümleştirmesi kullanan HTTP ile tetiklenen bir işlevdir:
public class MultipleOutputBindings
{
private readonly ILogger<MultipleOutputBindings> _logger;
public MultipleOutputBindings(ILogger<MultipleOutputBindings> logger)
{
_logger = logger;
}
[Function("MultipleOutputBindings")]
public MyOutputType Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
var myObject = new MyOutputType
{
Result = new OkObjectResult("C# HTTP trigger function processed a request."),
MessageText = "some output"
};
return myObject;
}
public class MyOutputType
{
[HttpResult]
public IActionResult Result { get; set; }
[QueueOutput("myQueue")]
public string MessageText { get; set; }
}
}
ASP.NET Core tümleştirmesi ile birden çok çıkış bağlaması için özel dönüş türleri kullanırken, sonucu sağlayan özelliğe özniteliğini eklemeniz [HttpResult]
gerekir. ÖZNITELIĞI, HTTP uzantısının HttpResult
3.2.0 veya sonraki sürümü ve ASP.NET Core uzantısının 1.3.0 veya sonraki sürümleriyle birlikte SDK 1.17.3-preview2 veya üzeri kullanılırken kullanılabilir.
SDK türleri
Hizmete özgü bazı bağlama türleri için, bağlama verileri hizmet SDK'larından ve çerçevelerinden türler kullanılarak sağlanabilir. Bunlar, serileştirilmiş bir dizenin veya düz eski CLR nesnesinin (POCO) sunabileceği özelliklerin ötesinde daha fazla özellik sağlar. Daha yeni türleri kullanmak için projenizin çekirdek bağımlılıkların daha yeni sürümlerini kullanacak şekilde güncelleştirilmesi gerekir.
Dependency | Sürüm gereksinimi |
---|---|
Microsoft.Azure.Functions.Worker | 1.18.0 veya üzeri |
Microsoft.Azure.Functions.Worker.Sdk | 1.13.0 veya üzeri |
Makinenizde SDK türlerini yerel olarak test ederken, Azure İşlevleri Core Tools, sürüm 4.0.5000 veya üzerini de kullanmanız gerekir. Komutunu kullanarak func version
geçerli sürümünüzü de kontrol edebilirsiniz.
Her tetikleyici ve bağlama uzantısının, uzantı başvuru makalelerinde açıklanan kendi en düşük sürüm gereksinimi de vardır. Aşağıdaki hizmete özgü bağlamalar SDK türlerini sağlar:
Hizmet | Tetikle | Giriş bağlaması | Çıkış bağlaması |
---|---|---|---|
Azure Blobları | Genel Kullanıma Sunuldu | Genel Kullanıma Sunuldu | SDK türleri önerilmez.1 |
Azure Kuyrukları | Genel Kullanıma Sunuldu | Giriş bağlaması yok | SDK türleri önerilmez.1 |
Azure Service Bus | Genel Kullanıma Sunuldu | Giriş bağlaması yok | SDK türleri önerilmez.1 |
Azure Event Hubs | Genel Kullanıma Sunuldu | Giriş bağlaması yok | SDK türleri önerilmez.1 |
Azure Cosmos DB | KullanılmayanSDK türleri 2 | Genel Kullanıma Sunuldu | SDK türleri önerilmez.1 |
Azure Tabloları | Tetikleyici yok | Genel Kullanıma Sunuldu | SDK türleri önerilmez.1 |
Azure Event Grid | Genel Kullanıma Sunuldu | Giriş bağlaması yok | SDK türleri önerilmez.1 |
1 SDK türünü kullanacağınız çıkış senaryoları için, bir çıkış bağlaması kullanmak yerine doğrudan SDK istemcileri oluşturup bu istemcilerle çalışmanız gerekir. Bağımlılık ekleme örneği için bkz . Azure istemcilerini kaydetme.
2 Cosmos DB tetikleyicisi Azure Cosmos DB değişiklik akışını kullanır ve değişiklik akışı öğelerini JSON serileştirilebilir türler olarak kullanıma sunar. SDK türlerinin olmaması bu senaryo için tasarım gereğidir.
Not
Tetikleyici verilerini kullanan bağlama ifadeleri kullanılırken, tetikleyicinin kendisi için SDK türleri kullanılamaz.
HTTP tetikleyicisi
HTTP tetikleyicileri , bir işlevin bir HTTP isteği tarafından çağrılmasına olanak tanır. Kullanılabilecek iki farklı yaklaşım vardır:
- ASP.NET Core geliştiricilerine tanıdık kavramları kullanan bir ASP.NET Core tümleştirme modeli
- Ek bağımlılıklar gerektirmeyen ve HTTP istekleri ve yanıtları için özel türler kullanan yerleşik bir model. Bu yaklaşım, önceki .NET yalıtılmış çalışan uygulamalarıyla geriye dönük uyumluluk için korunur.
ASP.NET Core tümleştirmesi
Bu bölümde, HttpRequest, HttpResponse ve IActionResult gibi ASP.NET Core'dan türleri kullanarak temel alınan HTTP isteği ve yanıt nesneleriyle nasıl çalışabilirsiniz gösterilmektedir. Bu model, .NET Framework'ün hedeflendiği uygulamalarda kullanılamaz ve bunun yerine yerleşik modeli kullanması gerekir.
Not
ASP.NET Core'un tüm özellikleri bu model tarafından kullanıma sunulmaz. Özellikle, ASP.NET Core ara yazılım işlem hattı ve yönlendirme özellikleri kullanılamaz. ASP.NET Core tümleştirmesi güncelleştirilmiş paketleri kullanmanızı gerektirir.
HTTP için ASP.NET Core tümleştirmesini etkinleştirmek için:
Projenizde Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore paketi, sürüm 1.0.0 veya sonraki bir sürüme başvuru ekleyin.
Projenizi şu belirli paket sürümlerini kullanacak şekilde güncelleştirin:
- Microsoft.Azure.Functions.Worker.Sdk, sürüm 1.11.0. veya üzeri
- Microsoft.Azure.Functions.Worker, sürüm 1.16.0 veya üzeri.
Dosyanızda
Program.cs
konak oluşturucu yapılandırmasını çağıracakConfigureFunctionsWebApplication()
şekilde güncelleştirin. Bu yöntemi aksi takdirde kullanırsanız, bunun yerini alırConfigureFunctionsWorkerDefaults()
. Aşağıdaki örnekte, diğer özelleştirmeler olmadan minimum kurulum gösterilmektedir:using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Hosting; var host = new HostBuilder() .ConfigureFunctionsWebApplication() .Build(); host.Run();
ASP.NET Core türlerini kullanmak için mevcut HTTP ile tetiklenen işlevleri güncelleştirin. Bu örnekte standart
HttpRequest
veIActionResult
basit bir "hello, world" işlevi için kullanılan bir gösterilir:[Function("HttpFunction")] public IActionResult Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req) { return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!"); }
ASP.NET Core tümleştirmesi ile JSON serileştirme
ASP.NET Core'un kendi serileştirme katmanı vardır ve genel serileştirme yapılandırmasını özelleştirmeden etkilenmez. HTTP tetikleyicileriniz için kullanılan serileştirme davranışını özelleştirmek için hizmet kaydının bir parçası olarak bir .AddMvc()
çağrı eklemeniz gerekir. Döndürülen IMvcBuilder
, ASP.NET Core'un JSON serileştirme ayarlarını değiştirmek için kullanılabilir. Aşağıdaki örnekte, bu yaklaşımı kullanarak serileştirme için JSON.NET (Newtonsoft.Json
) yapılandırma işlemi gösterilmektedir:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.AddMvc().AddNewtonsoftJson();
})
.Build();
host.Run();
Yerleşik HTTP modeli
Yerleşik modelde sistem, gelen HTTP istek iletisini işleve geçirilen bir HttpRequestData nesnesine çevirir. Bu nesne istekten , , Cookies
, Identities
URL
ve isteğe bağlı olarak bir ileti Body
de dahil olmak üzere Headers
veri sağlar. Bu nesne, HTTP isteğinin bir gösterimidir ancak temel alınan HTTP dinleyicisine veya alınan iletiye doğrudan bağlı değildir.
Benzer şekilde, işlev, http StatusCode
yanıtını oluşturmak için kullanılan verileri sağlayan bir HttpResponseData nesnesi döndürür. İleti , Headers
ve isteğe bağlı olarak bir ileti Body
de dahil olmak üzere.
Aşağıdaki örnekte ve HttpResponseData
kullanımı gösterilmektedirHttpRequestData
:
[Function(nameof(HttpFunction))]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger(nameof(HttpFunction));
logger.LogInformation("message logged");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString("Welcome to .NET isolated worker !!");
return response;
}
Günlük Kaydı
Veya ILogger
örneğini kullanarak ILogger<T>
günlüklere yazabilirsiniz. Günlükçü, bir veya bir ILoggerFactory'nin ILogger<T>
bağımlılık ekleme yoluyla elde edilebilir:
public class MyFunction {
private readonly ILogger<MyFunction> _logger;
public MyFunction(ILogger<MyFunction> logger) {
_logger = logger;
}
[Function(nameof(MyFunction))]
public void Run([BlobTrigger("samples-workitems/{name}", Connection = "")] string myBlob, string name)
{
_logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {myBlob}");
}
}
Günlükçü, işlevinize geçirilen bir FunctionContext nesnesinden de alınabilir. Günlüklerin yazıldığı kategorinin adı olan bir dize değeri geçirerek GetLogger<T> veya GetLogger yöntemini çağırın. Kategori genellikle günlüklerin yazıldığı belirli işlevin adıdır. Kategoriler hakkında daha fazla bilgi edinmek için izleme makalesine bakın.
veya LogError
gibi LogWarning
çeşitli günlük düzeylerini ILogger<T>
yazmak için ve ILogger
yöntemlerini kullanın. Günlük düzeyleri hakkında daha fazla bilgi edinmek için izleme makalesine bakın. Filtreleri kaydederek kodunuza eklenen bileşenlerin günlük düzeylerini özelleştirebilirsiniz:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
{
// Registers IHttpClientFactory.
// By default this sends a lot of Information-level logs.
services.AddHttpClient();
})
.ConfigureLogging(logging =>
{
// Disable IHttpClientFactory Informational logs.
// Note -- you can also remove the handler that does the logging: https://github.com/aspnet/HttpClientFactory/issues/196#issuecomment-432755765
logging.AddFilter("System.Net.Http.HttpClient", LogLevel.Warning);
})
.Build();
uygulamanızı içinde Program.cs
yapılandırmanın bir parçası olarak, hataların günlüklerinize nasıl ortaya çıkarılacağını gösteren davranışı da tanımlayabilirsiniz. Varsayılan davranış, kullandığınız oluşturucunun türüne bağlıdır.
varsayılan olarak bir HostBuilder
kullandığınızda, kodunuz tarafından oluşan özel durumlar içinde RpcException
sarmalanabilir. Bu ek katmanı kaldırmak için oluşturucuyu yapılandırmanın EnableUserCodeException
bir parçası olarak özelliğini "true" olarak ayarlayın:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults(builder => {}, options =>
{
options.EnableUserCodeException = true;
})
.Build();
host.Run();
Application Insights
Yalıtılmış işlem uygulamanızı günlükleri doğrudan Application Insights'a yayacak şekilde yapılandırabilirsiniz. Bu davranış, günlükleri konak üzerinden geçirmenin varsayılan davranışının yerini alır ve bu günlüklerin nasıl yayıldığında size denetim sağladığından önerilir.
Paketleri yükleme
Kodunuzdan doğrudan Application Insights'a günlük yazmak için projenizde bu paketlere başvurular ekleyin:
- Microsoft.Azure.Functions.Worker.ApplicationInsights, sürüm 1.0.0 veya üzeri.
- Microsoft.ApplicationInsights.WorkerService.
Projenize bu başvuruları eklemek için aşağıdaki komutları çalıştırabilirsiniz:
dotnet add package Microsoft.ApplicationInsights.WorkerService
dotnet add package Microsoft.Azure.Functions.Worker.ApplicationInsights
Başlatmayı yapılandırma
Paketler yüklendikten sonra, aşağıdaki örnekte olduğu gibi dosyanızda Program.cs
ve hizmet yapılandırması sırasında öğesini çağırmalısınız:AddApplicationInsightsTelemetryWorkerService()
ConfigureFunctionsApplicationInsights()
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services => {
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
çağrısıConfigureFunctionsApplicationInsights()
, İşlevler tanımlı ActivitySource
bir ITelemetryModule
öğesini dinleyen bir ekler. Bu, dağıtılmış izlemeyi desteklemek için gereken bağımlılık telemetrisini oluşturur. Bu uygulamayı kullanma hakkında AddApplicationInsightsTelemetryWorkerService()
daha fazla bilgi edinmek için bkz . Çalışan Hizmeti uygulamaları için Application Insights.
Günlük düzeylerini yönetme
Önemli
İşlevler ana bilgisayarı ve yalıtılmış işlem çalışanı günlük düzeyleri için ayrı yapılandırmaya sahiptir. host.json'daki herhangi bir Application Insights yapılandırması çalışandan gelen günlüğü etkilemez ve benzer şekilde, çalışan kodunuzda yapılan yapılandırma da konaktan günlüğe kaydetmeyi etkilemez. Senaryonuz her iki katmanda da özelleştirme gerektiriyorsa değişiklikleri her iki yerde de uygulamanız gerekir.
Uygulamanızın geri kalanı ve ILogger<T>
ile ILogger
çalışmaya devam eder. Ancak, varsayılan olarak Application Insights SDK'sı günlükçüye yalnızca uyarıları ve daha ciddi günlükleri yakalamasını belirten bir günlük filtresi ekler. Bu davranışı devre dışı bırakmak istiyorsanız, hizmet yapılandırmasının bir parçası olarak filtre kuralını kaldırın:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services => {
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.ConfigureLogging(logging =>
{
logging.Services.Configure<LoggerFilterOptions>(options =>
{
LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule => rule.ProviderName
== "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
if (defaultRule is not null)
{
options.Rules.Remove(defaultRule);
}
});
})
.Build();
host.Run();
Performansta iyileştirmeler
Bu bölümde, soğuk başlangıçla ilgili performansı geliştiren etkinleştirebileceğiniz seçenekler özetlenmiştir.
Genel olarak, uygulamanız temel bağımlılıklarının en son sürümlerini kullanmalıdır. Projenizi en azından aşağıdaki gibi güncelleştirmeniz gerekir:
- Microsoft.Azure.Functions.Worker'ı 1.19.0 veya sonraki bir sürüme yükseltin.
- Microsoft.Azure.Functions.Worker.Sdk'yi 1.16.4 veya sonraki bir sürüme yükseltin.
- Uygulamanız .NET Framework'i hedeflemediği sürece uygulamasına
Microsoft.AspNetCore.App
bir çerçeve başvurusu ekleyin.
Aşağıdaki kod parçacığı bu yapılandırmayı bir proje dosyası bağlamında gösterir:
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
</ItemGroup>
Yer tutucular
Yer tutucular, .NET 6 veya üzerini hedefleyen uygulamalar için soğuk başlatmayı geliştiren bir platform özelliğidir. Bu iyileştirmeyi kullanmak için aşağıdaki adımları kullanarak yer tutucuları açıkça etkinleştirmeniz gerekir:
Proje yapılandırmanızı, önceki bölümde açıklandığı gibi en son bağımlılık sürümlerini kullanacak şekilde güncelleştirin.
WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED
Bu az functionapp config appsettings set komutunu kullanarak yapabileceğiniz uygulama ayarını1
olarak ayarlayın:az functionapp config appsettings set -g <groupName> -n <appName> --settings 'WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED=1'
Bu örnekte değerini
<groupName>
kaynak grubunun adıyla, değerini ise işlev uygulamanızın adıyla değiştirin<appName>
.İşlev uygulamasının
netFrameworkVersion
özelliğinin projenizin .NET 6 veya üzeri olması gereken hedef çerçevesiyle eşleştiğinden emin olun. Bunu yapmak için şu az functionapp config set komutunu kullanabilirsiniz:az functionapp config set -g <groupName> -n <appName> --net-framework-version <framework>
Bu örnekte, hedef .NET sürümünüze göre değerini gibi
v8.0
uygun sürüm dizesiyle de değiştirin<framework>
.İşlev uygulamanızın şu az functionapp config set komutunu kullanarak yapabileceğiniz 64 bitlik bir işlem kullanacak şekilde yapılandırıldığından emin olun:
az functionapp config set -g <groupName> -n <appName> --use-32bit-worker-process false
Önemli
olarak ayarlanırken WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED
1
, diğer tüm işlev uygulaması yapılandırmaları doğru ayarlanmalıdır. Aksi takdirde işlev uygulamanız başlatılamaz.
İyileştirilmiş yürütücü
İşlev yürütücüsü, çağırmaların çalışmasına neden olan platformun bir bileşenidir. Bu bileşenin iyileştirilmiş bir sürümü, SDK'nın 1.16.2 sürümünden başlayarak varsayılan olarak etkinleştirilir. Başka yapılandırma gerekmez.
ReadyToRun
İşlev uygulamanızı ReadyToRun ikili dosyaları olarak derleyebilirsiniz. ReadyToRun, Bir Tüketim planında çalışırken soğuk başlangıçların etkisini azaltmaya yardımcı olmak için başlangıç performansını geliştirebilen bir önceden derleme biçimidir. ReadyToRun , .NET 6 ve sonraki sürümlerde kullanılabilir ve Azure İşlevleri çalışma zamanının 4.0 veya sonraki bir sürümünü gerektirir.
ReadyToRun, projeyi barındırma uygulamasının çalışma zamanı mimarisine göre derlemenizi gerektirir. Bunlar hizalanmamışsa, uygulamanız başlangıçta bir hatayla karşılaşır. Bu tablodan çalışma zamanı tanımlayıcınızı seçin:
İşletim Sistemi | Uygulama 32 bit1 | Çalışma zamanı tanımlayıcısı |
---|---|---|
Windows | True | win-x86 |
Windows | False | win-x64 |
Linux | True | Yok (desteklenmez) |
Linux | False | linux-x64 |
1 Yalnızca 64 bit uygulamalar diğer bazı performans iyileştirmeleri için uygundur.
Windows uygulamanızın 32 bit mi yoksa 64 bit mi olduğunu denetlemek için kaynak grubunuzun adını ve <app_name>
uygulamanızın adını yazarak aşağıdaki CLI komutunu <group_name>
çalıştırabilirsiniz. "true" çıkışı, uygulamanın 32 bit, "false" ise 64 bit olduğunu gösterir.
az functionapp config show -g <group_name> -n <app_name> --query "use32BitWorkerProcess"
Aynı değiştirmeleri kullanarak aşağıdaki komutla uygulamanızı 64 bit olarak değiştirebilirsiniz:
az functionapp config set -g <group_name> -n <app_name> --use-32bit-worker-process false`
Projenizi ReadyToRun olarak derlemek için ve <RuntimeIdentifier>
öğelerini ekleyerek proje dosyanızı güncelleştirin<PublishReadyToRun>
. Aşağıdaki örnekte, Bir Windows 64 bit işlev uygulamasında yayımlama yapılandırması gösterilmektedir.
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
proje dosyasının <RuntimeIdentifier>
bir parçası olarak ayarlamak istemiyorsanız, bunu yayımlama hareketinin bir parçası olarak da yapılandırabilirsiniz. Örneğin, bir Windows 64 bit işlev uygulaması ile .NET CLI komutu şu şekilde olabilir:
dotnet publish --runtime win-x64
Visual Studio'da, yayımlama profilindeki Hedef Çalışma Zamanı seçeneği doğru çalışma zamanı tanımlayıcısına ayarlanmalıdır. Taşınabilir varsayılan değerine ayarlandığında ReadyToRun kullanılmaz.
Azure İşlevlerine dağıtma
İşlev kodu projenizi Azure'a dağıttığınızda, proje bir işlev uygulamasında veya Linux kapsayıcısında çalıştırılmalıdır. Kodunuzu dağıtmadan önce işlev uygulamasının ve diğer gerekli Azure kaynaklarının mevcut olması gerekir.
İşlev uygulamanızı bir Linux kapsayıcısında da dağıtabilirsiniz. Daha fazla bilgi için bkz. Kapsayıcılarla çalışma ve Azure İşlevleri.
Azure kaynakları oluşturma
Aşağıdaki yöntemlerden birini kullanarak azureda işlev uygulamanızı ve diğer gerekli kaynakları oluşturabilirsiniz:
- Visual Studio: Visual Studio, kod yayımlama işlemi sırasında sizin için kaynaklar oluşturabilir.
- Visual Studio Code: Visual Studio Code aboneliğinize bağlanabilir, uygulamanız için gereken kaynakları oluşturabilir ve ardından kodunuzu yayımlayabilir.
- Azure CLI: Azure'da gerekli kaynakları oluşturmak için Azure CLI'yi kullanabilirsiniz.
- Azure PowerShell: Azure'da gerekli kaynakları oluşturmak için Azure PowerShell'i kullanabilirsiniz.
- Dağıtım şablonları: Gerekli kaynakların Azure'a dağıtımını otomatikleştirmek için ARM şablonlarını ve Bicep dosyalarını kullanabilirsiniz. Şablonunuzun gerekli ayarları içerdiğine emin olun.
- Azure portalı: Azure portalında gerekli kaynakları oluşturabilirsiniz.
Uygulamanızı yayımlama
azure'da işlev uygulamanızı ve diğer gerekli kaynakları oluşturduktan sonra aşağıdaki yöntemlerden birini kullanarak kod projesini Azure'a dağıtabilirsiniz:
- Visual Studio: Geliştirme sırasında basit el ile dağıtım.
- Visual Studio Code: Geliştirme sırasında basit el ile dağıtım.
- Azure İşlevleri Temel Araçlar: Komut satırından proje dosyasını dağıtın.
- Sürekli dağıtım: Sürekli bakım için, genellikle bir hazırlama yuvasında kullanışlıdır.
- Dağıtım şablonları: Paket dağıtımlarını otomatikleştirmek için ARM şablonlarını veya Bicep dosyalarını kullanabilirsiniz.
Daha fazla bilgi için bkz. Azure İşlevleri dağıtım teknolojileri.
Dağıtım yükü
Dağıtım yöntemlerinin çoğu zip arşivini kullanır. Zip arşivini kendiniz oluşturuyorsanız, bu bölümde açıklanan yapıyı izlemesi gerekir. Aksi takdirde, uygulamanız başlangıçta hatalarla karşılaşabilir.
Dağıtım yükü, kapsayan üst klasör olmadan bir dotnet publish
komutun çıktısı ile eşleşmelidir. Zip arşivi aşağıdaki dosyalardan oluşturulmalıdır:
.azurefunctions/
extensions.json
functions.metadata
host.json
worker.config.json
- Proje yürütülebilir dosyanız (konsol uygulaması)
- Diğer destekleyici dosyalar ve dizinler bu yürütülebilir dosyayla eş
Bu dosyalar derleme işlemi tarafından oluşturulur ve doğrudan düzenlenmesi amaçlanmamıştır.
Dağıtım için zip arşivi hazırlarken, yalnızca çıkış dizininin içeriğini sıkıştırmanız gerekir, kapsayan dizinin kendisini değil. Arşiv geçerli çalışma dizinine ayıklandığında, yukarıda listelenen dosyaların hemen görünür olması gerekir.
Dağıtım gereksinimleri
İşletim sistemine bağlı olarak Azure'daki yalıtılmış çalışan modelinde .NET işlevlerini çalıştırmak için birkaç gereksinim vardır:
- FUNCTIONS_WORKER_RUNTIME değerine
dotnet-isolated
ayarlanmalıdır. - netFrameworkVersion , istenen sürüme ayarlanmalıdır.
Önceki bölümde yer alan yöntemleri kullanarak Azure'da işlev uygulamanızı oluşturduğunuzda, bu gerekli ayarlar sizin için eklenir. Arm şablonlarını veya otomasyon için Bicep dosyalarını kullanarak bu kaynakları oluşturduğunuzda, bunları şablonda ayarladığınızdan emin olmanız gerekir.
Hata ayıklama
Visual Studio veya Visual Studio Code kullanarak yerel olarak çalışırken, .NET yalıtılmış çalışan projenizde normal şekilde hata ayıklayabilirsiniz. Ancak, beklendiği gibi çalışmayan iki hata ayıklama senaryosu vardır.
Visual Studio kullanarak Uzaktan Hata Ayıklama
Yalıtılmış çalışan işlemi uygulamanız İşlevler çalışma zamanının dışında çalıştığından, uzak hata ayıklayıcıyı ayrı bir işleme eklemeniz gerekir. Visual Studio kullanarak hata ayıklama hakkında daha fazla bilgi edinmek için bkz . Uzaktan Hata Ayıklama.
.NET Framework hedeflenirken hata ayıklama
Yalıtılmış projeniz .NET Framework 4.8'i hedef alıyorsa, geçerli önizleme kapsamı hata ayıklamayı etkinleştirmek için el ile adımlar gerektirir. Başka bir hedef çerçeve kullanılıyorsa bu adımlar gerekli değildir.
Uygulamanız ilk işlemi olarak çağrısıyla FunctionsDebugger.Enable();
başlamalıdır. Bu, bir HostBuilder başlatmadan önce yönteminde Main()
oluşur. Dosyanız Program.cs
şuna benzer görünmelidir:
using System;
using System.Diagnostics;
using Microsoft.Extensions.Hosting;
using Microsoft.Azure.Functions.Worker;
using NetFxWorker;
namespace MyDotnetFrameworkProject
{
internal class Program
{
static void Main(string[] args)
{
FunctionsDebugger.Enable();
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.Build();
host.Run();
}
}
}
Ardından, .NET Framework hata ayıklayıcısını kullanarak işleme el ile eklemeniz gerekir. Visual Studio, yalıtılmış çalışan işlemi .NET Framework uygulamaları için bunu henüz otomatik olarak yapmaz ve "Hata Ayıklamayı Başlat" işleminden kaçınılmalıdır.
Proje dizininizde (veya derleme çıktı dizininde) şu komutu çalıştırın:
func host start --dotnet-isolated-debug
Bu işlem çalışanınızı başlatır ve işlem şu iletiyle durdurulur:
Azure Functions .NET Worker (PID: <process id>) initialized in debug mode. Waiting for debugger to attach...
Çalışan işleminizin kimliği nerededir <process id>
? Artık işleme el ile eklemek için Visual Studio'yu kullanabilirsiniz. Bu işlemle ilgili yönergeler için bkz . Çalışan işleme ekleme.
Hata ayıklayıcı eklendikten sonra işlem yürütmesi devam eder ve hata ayıklaması yapabileceksiniz.
.NET sürümlerini önizleme
Genel kullanıma sunulan bir sürümden önce bir .NET sürümü Önizleme veya Go-live durumunda yayınlanabilir. Bu durumlarla ilgili ayrıntılar için .NET Resmi Destek İlkesi'ne bakın.
Yerel İşlevler projesinden belirli bir sürümü hedeflemek mümkün olsa da, Azure'da barındırılan işlev uygulamalarında bu sürüm kullanılamayabilir. Azure İşlevleri yalnızca bu bölümde not edilen Önizleme veya Canlı yayınlarla kullanılabilir.
Azure İşlevleri şu anda aşağıdaki "Önizleme" veya "Go-live" .NET sürümleriyle kullanılabilir:
İşletim sistemi | .NET önizleme sürümü |
---|---|
Windows | .NET 9 Önizleme 61, 2 |
Linux | .NET 9 RC21, 3 |
1 .NET 9'un başarıyla hedeflenmesi için projenizin çekirdek paketlerin 2.x sürümlerine başvurması gerekir. Visual Studio kullanıyorsanız, .NET 9 için sürüm 17.12 veya üzeri gerekir.
2 Önizleme süresi boyunca bazı istemcilerde Windows desteği görünmeyebilir.
3 .NET 9, Esnek Tüketim SKU'su üzerinde henüz desteklenmiyor.
Kullanabileceğiniz genel kullanıma sunulan sürümlerin listesi için bkz . Desteklenen sürümler .
Önizleme .NET SDK'sı kullanma
Azure İşlevleri .NET'in önizleme sürümüyle kullanmak için projenizi şu şekilde güncelleştirmeniz gerekir:
- Geliştirmenizde ilgili .NET SDK sürümünü yükleme
TargetFramework
Dosyanızdaki.csproj
ayarı değiştirme
Azure'daki işlev uygulamanıza dağıttığınızda, çerçevenin uygulama için kullanılabilir hale getirildiğinden de emin olmanız gerekir. Önizleme döneminde, bazı araçlar ve deneyimler yeni önizleme sürümünü bir seçenek olarak ortaya çıkaramayabilir. Örneğin Azure portalında önizleme sürümünü görmüyorsanız, sürümü el ile yapılandırmak için REST API, Bicep şablonları veya Azure CLI kullanabilirsiniz.
Windows'ta barındırılan uygulamalar için aşağıdaki Azure CLI komutunu kullanın. değerini <groupName>
kaynak grubunun adıyla, değerini ise işlev uygulamanızın adıyla değiştirin <appName>
. değerini gibi v8.0
uygun sürüm dizesiyle değiştirin<framework>
.
az functionapp config set -g <groupName> -n <appName> --net-framework-version <framework>
.NET önizleme sürümlerini kullanma konusunda dikkat edilmesi gerekenler
.NET'in önizleme sürümleriyle İşlevler'i kullanırken şu noktaları göz önünde bulundurun:
Visual Studio'da işlevlerinizi yazarken, .NET önizleme SDK'ları ile Azure İşlevleri proje derlemeyi destekleyen Visual Studio Preview'ı kullanmanız gerekir.
En son İşlevler araçlarına ve şablonlarına sahip olduğunuzdan emin olun. Araçlarınızı güncelleştirmek için:
- Araçlar>Seçenekleri'ne gidin, Projeler ve Çözümler'in altında Azure İşlevleri seçin.
- İstendiği gibi Güncelleştirmeleri denetle ve güncelleştirmeleri yükle'yi seçin.
Önizleme süresi boyunca geliştirme ortamınız barındırılan hizmetten daha yeni bir .NET önizleme sürümüne sahip olabilir. Bu, dağıtıldığında işlev uygulamanızın başarısız olmasına neden olabilir. Bu sorunu gidermek için, içinde
global.json
kullanılacak SDK sürümünü belirtebilirsiniz.dotnet --list-sdks
komutunu çalıştırın ve yerel geliştirme sırasında kullanmakta olduğunuz önizleme sürümünü not edin.dotnet new globaljson --sdk-version <SDK_VERSION> --force
Komutunu çalıştırın. Burada<SDK_VERSION>
, yerel olarak kullandığınız sürümdür. Örneğin,dotnet new globaljson --sdk-version dotnet-sdk-8.0.100-preview.7.23376.3 --force
sistemin projenizi oluştururken .NET 8 Preview 7 SDK'sını kullanmasına neden olur.
Not
Önizleme çerçevelerinin tam zamanında yüklenmesi nedeniyle Windows üzerinde çalışan işlev uygulamaları, önceki GA sürümlerine kıyasla daha fazla soğuk başlangıç süresiyle karşılaşabilir.