De Azure WebJobs SDK gebruiken voor gebeurtenisgestuurde verwerking op de achtergrond
Dit artikel bevat richtlijnen voor het werken met de Azure WebJobs SDK. Zie Aan de slag met de Azure WebJobs SDK om meteen aan de slag te gaan met WebJobs.
WebJobs SDK-versies
Dit zijn de belangrijkste verschillen tussen versie 3.x en versie 2.x van de WebJobs SDK:
- Versie 3.x voegt ondersteuning toe voor .NET Core.
- In versie 3.x, installeert u de opslagbindingsextensie die is vereist voor de WebJobs SDK. In versie 2.x, de Storage-bindingen zijn opgenomen in de SDK.
- Visual Studio 2019-hulpprogramma's voor .NET Core (3.x) projecten verschillen van hulpprogramma's voor .NET Framework (2).x) projecten. Zie Webjobs ontwikkelen en implementeren met Visual Studio - Azure-app Service voor meer informatie.
Verschillende beschrijvingen in dit artikel bevatten voorbeelden voor beide WebJobs versie 3.x en WebJobs versie 2.x.
Azure Functions is gebaseerd op de WebJobs SDK.
- Azure Functions versie 2.x is gebouwd op WebJobs SDK versie 3.x.
- Azure Functions versie 1.x is gebouwd op WebJobs SDK versie 2.x.
Broncodeopslagplaatsen voor zowel Azure Functions als WebJobs SDK maken gebruik van de nummering van de WebJobs SDK. In verschillende secties van dit artikel wordt een koppeling gemaakt naar de Documentatie van Azure Functions.
Zie De WebJobs SDK en Azure Functions vergelijken voor meer informatie
WebJobs-host
De host is een runtimecontainer voor functies. De host luistert naar triggers en aanroepen. In versie 3.x, de host is een implementatie van IHost
. In versie 2.x, u gebruikt het JobHost
object. U maakt een hostinstantie in uw code en schrijft code om het gedrag ervan aan te passen.
Dit is een belangrijk verschil tussen het rechtstreeks gebruiken van de WebJobs SDK en het indirect gebruiken via Azure Functions. In Azure Functions beheert de service de host en kunt u de host niet aanpassen door code te schrijven. Met Azure Functions kunt u het gedrag van de host aanpassen via instellingen in het host.json-bestand. Deze instellingen zijn tekenreeksen, geen code en het gebruik van deze tekenreeksen beperkt de soorten aanpassingen die u kunt doen.
Hostverbindingen
De WebJobs SDK zoekt naar Azure Storage- en Azure Service Bus-verbindingen in het local.settings.json-bestand wanneer u lokaal of in de omgeving van de webtaak uitvoert wanneer u in Azure uitvoert. Voor de WebJobs SDK is standaard een opslagverbinding met de naam AzureWebJobsStorage
vereist.
Wanneer de verbindingsnaam wordt omgezet in één exacte waarde, identificeert de runtime de waarde als een verbindingsreeks, die doorgaans een geheim bevat. De details van een verbindingsreeks zijn afhankelijk van de service waarmee u verbinding maakt. Een verbindingsnaam kan echter ook verwijzen naar een verzameling van meerdere configuratie-items, handig voor het configureren van op identiteit gebaseerde verbindingen. Omgevingsvariabelen kunnen worden behandeld als een verzameling met behulp van een gedeeld voorvoegsel dat eindigt op dubbele onderstrepingstekens __
. Er kan vervolgens naar de groep worden verwezen door de verbindingsnaam in te stellen op dit voorvoegsel.
De eigenschap voor een Azure Blob-triggerdefinitie kan bijvoorbeeld connection
zijn Storage1
. Zolang er geen enkele tekenreekswaarde is geconfigureerd door een omgevingsvariabele met de naam Storage1
, kan een omgevingsvariabele met de naam Storage1__blobServiceUri
worden gebruikt om de blobServiceUri
eigenschap van de verbinding te informeren. De verbindingseigenschappen verschillen voor elke service. Raadpleeg de documentatie voor het onderdeel dat gebruikmaakt van de verbinding.
Op identiteit gebaseerde verbindingen
Als u op identiteit gebaseerde verbindingen in de WebJobs SDK wilt gebruiken, moet u ervoor zorgen dat u de nieuwste versies van WebJobs-pakketten in uw project gebruikt. Zorg er ook voor dat u een verwijzing hebt naar Microsoft.Azure.WebJobs.Host.Storage. Hier volgt een voorbeeld van hoe uw projectbestand eruit kan zien nadat u deze updates hebt uitgevoerd:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net48</TargetFramework>
<IsWebJobProject>true</IsWebJobProject>
<WebJobName>$(AssemblyName)</WebJobName>
<WebJobType>Continuous</WebJobType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.41" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage.Queues" Version="5.3.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Host.Storage" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Wanneer u WebJobs instelt in uw HostBuilder, moet u een aanroep toevoegen aan AddAzureStorageCoreServices
, omdat dit is wat het mogelijk maakt AzureWebJobsStorage
en andere opslagtriggers en bindingen om identiteit te gebruiken:
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
// other configurations...
});
Vervolgens kunt u de AzureWebJobsStorage
verbinding configureren door omgevingsvariabelen in te stellen (of toepassingsinstellingen wanneer deze worden gehost in App Service):
Omgevingsvariabele | Beschrijving | Voorbeeldwaarde |
---|---|---|
AzureWebJobsStorage__blobServiceUri |
De gegevensvlak-URI van de blobservice van het opslagaccount met behulp van het HTTPS-schema. | <https:// storage_account_name.blob.core.windows.net> |
AzureWebJobsStorage__queueServiceUri |
De gegevensvlak-URI van de wachtrijservice van het opslagaccount met behulp van het HTTPS-schema. | <https:// storage_account_name.queue.core.windows.net> |
Als u uw configuratie opgeeft via een andere manier dan omgevingsvariabelen, zoals met een appsettings.json
, moet u in plaats daarvan een gestructureerde configuratie opgeven voor de verbinding en de bijbehorende eigenschappen:
{
"AzureWebJobsStorage": {
"blobServiceUri": "https://<storage_account_name>.blob.core.windows.net",
"queueServiceUri": "https://<storage_account_name>.queue.core.windows.net"
}
}
U kunt de queueServiceUri
eigenschap weglaten als u geen blobtriggers wilt gebruiken.
Wanneer uw code lokaal wordt uitgevoerd, wordt uw ontwikkelaarsidentiteit standaard gebruikt volgens het gedrag dat wordt beschreven voor DefaultAzureCredential.
Wanneer uw code wordt gehost in Azure-app Service, wordt de bovenstaande configuratie standaard ingesteld op de door het systeem toegewezen beheerde identiteit voor de resource. Als u in plaats daarvan een door de gebruiker toegewezen identiteit wilt gebruiken die aan de app is toegewezen, moet u extra eigenschappen toevoegen voor uw verbinding waarmee wordt opgegeven welke identiteit moet worden gebruikt. De credential
eigenschap (AzureWebJobsStorage__credential
als een omgevingsvariabele) moet worden ingesteld op de tekenreeks 'managedidentity'. De clientId
eigenschap (AzureWebJobsStorage__clientId
als een omgevingsvariabele) moet worden ingesteld op de client-id van de door de gebruiker toegewezen beheerde identiteit die moet worden gebruikt. Als gestructureerde configuratie is het volledige object:
{
"AzureWebJobsStorage": {
"blobServiceUri": "https://<storage_account_name>.blob.core.windows.net",
"queueServiceUri": "https://<storage_account_name>.queue.core.windows.net",
"credential": "managedidentity",
"clientId": "<user-assigned-identity-client-id>"
}
}
De identiteit die voor deze identiteit wordt gebruikt AzureWebJobsStorage
, moet roltoewijzingen hebben die deze toewijzen aan de rol Eigenaar van opslagblobgegevens, Inzender voor opslagwachtrijgegevens en Inzender voor opslagaccounts . U kunt zowel inzender voor opslagwachtrijgegevens als inzender voor opslagaccounts weglaten als u geen blobtriggers wilt gebruiken.
De volgende tabel bevat ingebouwde rollen die worden aanbevolen bij het gebruik van triggers in bindingen in normale werking. Uw toepassing vereist mogelijk verdere machtigingen op basis van de code die u schrijft.
Binding | Voorbeeld van ingebouwde rollen |
---|---|
Blob-trigger | Eigenaar van opslagblobgegevens en Inzender voor opslagwachtrijgegevens Zie hierboven ook voor vereisten AzureWebJobsStorage . |
Blob (invoer) | Lezer voor opslagblobgegevens |
Blob (uitvoer) | Eigenaar van opslagblobgegevens |
Wachtrijtrigger | Storage Queue Data Reader, Storage Queue Data Message Processor |
Wachtrij (uitvoer) | Inzender voor opslagwachtrijgegevens, afzender van opslagwachtrijgegevensbericht |
Service Bus-trigger1 | Azure Service Bus-gegevensontvanger, Azure Service Bus-gegevenseigenaar |
Service Bus (uitvoer) | Azure Service Bus-gegevenszender |
1 Voor triggering vanuit Service Bus-onderwerpen moet de roltoewijzing een effectief bereik hebben voor de Service Bus-abonnementsresource. Als alleen het onderwerp is opgenomen, treedt er een fout op. Sommige clients, zoals de Azure Portal, maken de Service Bus-abonnementsresource niet beschikbaar als een bereik voor roltoewijzing. In dergelijke gevallen kan de Azure CLI worden gebruikt. Zie ingebouwde Azure-rollen voor Azure Service Bus voor meer informatie.
Verbindingsreeksen in versie 2.x
Versie 2.x van de SDK vereist geen specifieke naam. Versie 2.met x kunt u uw eigen namen gebruiken voor deze verbindingsreeks s en kunt u ze elders opslaan. U kunt namen instellen in code met behulp van de JobHostConfiguration
, zoals deze:
static void Main(string[] args)
{
var _storageConn = ConfigurationManager
.ConnectionStrings["MyStorageConnection"].ConnectionString;
//// Dashboard logging is deprecated; use Application Insights.
//var _dashboardConn = ConfigurationManager
// .ConnectionStrings["MyDashboardConnection"].ConnectionString;
JobHostConfiguration config = new JobHostConfiguration();
config.StorageConnectionString = _storageConn;
//config.DashboardConnectionString = _dashboardConn;
JobHost host = new JobHost(config);
host.RunAndBlock();
}
Notitie
Omdat versie 3.x maakt gebruik van de standaard .NET Core-configuratie-API's. Er is geen API om verbindingsreeks namen te wijzigen. Zie WebJobs ontwikkelen en implementeren met Visual Studio
Instellingen voor hostontwikkeling
U kunt de host uitvoeren in de ontwikkelingsmodus om lokale ontwikkeling efficiënter te maken. Hier volgen enkele van de instellingen die automatisch worden gewijzigd wanneer u in de ontwikkelingsmodus wordt uitgevoerd:
Eigenschappen | Ontwikkelingsinstelling |
---|---|
Tracing.ConsoleLevel |
TraceLevel.Verbose om logboekuitvoer te maximaliseren. |
Queues.MaxPollingInterval |
Een lage waarde om ervoor te zorgen dat wachtrijmethoden onmiddellijk worden geactiveerd. |
Singleton.ListenerLockPeriod |
15 seconden om te helpen bij snelle iteratieve ontwikkeling. |
Het proces voor het inschakelen van de ontwikkelingsmodus is afhankelijk van de SDK-versie.
Versie 3.x
Versie 3.x maakt gebruik van de standaard-ASP.NET Core-API's. Roep de UseEnvironment
methode aan op het HostBuilder
exemplaar. Geef een tekenreeks met de naam development
door, zoals in dit voorbeeld:
static async Task Main()
{
var builder = new HostBuilder();
builder.UseEnvironment("development");
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Versie 2.x
De JobHostConfiguration
klasse heeft een UseDevelopmentSettings
methode waarmee de ontwikkelmodus wordt ingeschakeld. In het volgende voorbeeld ziet u hoe u ontwikkelinstellingen gebruikt. config.IsDevelopment
Als u wilt retourneren true
wanneer deze lokaal wordt uitgevoerd, stelt u een lokale omgevingsvariabele AzureWebJobsEnv
in met de waardeDevelopment
.
static void Main()
{
config = new JobHostConfiguration();
if (config.IsDevelopment)
{
config.UseDevelopmentSettings();
}
var host = new JobHost(config);
host.RunAndBlock();
}
Gelijktijdige verbindingen beheren (versie 2.x)
In versie 3.x, de verbindingslimiet wordt standaard ingesteld op oneindige verbindingen. Als u deze limiet om een of andere reden moet wijzigen, kunt u de MaxConnectionsPerServer
eigenschap van de WinHttpHandler
klasse gebruiken.
In versie 2.x, u bepaalt het aantal gelijktijdige verbindingen met een host met behulp van de ServicePointManager.DefaultConnectionLimit-API . In 2.x, moet u deze waarde verhogen vanaf de standaardwaarde van 2 voordat u uw WebJobs-host start.
Alle uitgaande HTTP-aanvragen die u vanuit een functie maakt met behulp van HttpClient
stroom.ServicePointManager
Nadat u de waarde hebt bereikt die is ingesteld DefaultConnectionLimit
, ServicePointManager
begint u aanvragen in de wachtrij te plaatsen voordat u ze verzendt. Stel dat uw DefaultConnectionLimit
code is ingesteld op 2 en dat uw code 1000 HTTP-aanvragen doet. In eerste instantie zijn slechts twee aanvragen toegestaan naar het besturingssysteem. De andere 998 worden in de wachtrij geplaatst totdat er ruimte voor hen is. Dit betekent dat er HttpClient
mogelijk een time-out optreedt omdat deze de aanvraag heeft ingediend, maar de aanvraag nooit is verzonden door het besturingssysteem naar de doelserver. U ziet dus mogelijk gedrag dat niet logisch lijkt te zijn: het duurt 10 seconden voordat uw lokale HttpClient
aanvraag is voltooid, maar uw service retourneert elke aanvraag in 200 ms.
De standaardwaarde voor ASP.NET toepassingen is Int32.MaxValue
en dat werkt waarschijnlijk goed voor WebJobs die worden uitgevoerd in een Basic- of hoger App Service-plan. WebJobs hebben doorgaans de AlwaysOn-instelling nodig en dat wordt alleen ondersteund door Basic- en hogere App Service-plannen.
Als uw webtaak wordt uitgevoerd in een gratis of gedeeld App Service-plan, wordt uw toepassing beperkt door de App Service-sandbox, die momenteel een verbindingslimiet van 300 heeft. Als er een niet-afhankelijke verbindingslimiet is, ServicePointManager
is de kans groter dat de drempelwaarde voor de sandbox-verbinding wordt bereikt en de site wordt afgesloten. In dat geval kan het instellen DefaultConnectionLimit
op iets lagers, zoals 50 of 100, dit voorkomen en nog steeds voldoende doorvoer toestaan.
De instelling moet worden geconfigureerd voordat er HTTP-aanvragen worden gedaan. Daarom moet de webtaakhost de instelling niet automatisch aanpassen. Er kunnen HTTP-aanvragen zijn die plaatsvinden voordat de host wordt gestart, wat kan leiden tot onverwacht gedrag. De beste methode is om de waarde direct in uw Main
methode in te stellen voordat u initialiseert JobHost
, zoals hier wordt weergegeven:
static void Main(string[] args)
{
// Set this immediately so that it's used by all requests.
ServicePointManager.DefaultConnectionLimit = Int32.MaxValue;
var host = new JobHost();
host.RunAndBlock();
}
Triggers
WebJobs SDK ondersteunt dezelfde set triggers en bindingen die worden gebruikt door Azure Functions. Houd er rekening mee dat triggers in de WebJobs SDK functiespecifiek zijn en niet gerelateerd zijn aan het implementatietype WebJob. WebJobs met door gebeurtenissen geactiveerde functies die zijn gemaakt met behulp van de SDK, moeten altijd worden gepubliceerd als een doorlopende webtaak, waarbij Alwayson is ingeschakeld.
Functies moeten openbare methoden zijn en moeten één triggerkenmerk of het NoAutomaticTrigger
kenmerk hebben.
Automatische triggers
Automatische triggers roepen een functie aan als reactie op een gebeurtenis. Bekijk dit voorbeeld van een functie die wordt geactiveerd door een bericht dat is toegevoegd aan Azure Queue Storage. De functie reageert door een blob uit Azure Blob Storage te lezen:
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
[Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
ILogger log)
{
log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}
Het QueueTrigger
kenmerk geeft de runtime de opdracht om de functie aan te roepen wanneer er een wachtrijbericht wordt weergegeven in myqueue-items
. Het Blob
kenmerk vertelt de runtime dat het wachtrijbericht moet worden gebruikt om een blob te lezen in de container sample-workitems . De naam van het blob-item in de samples-workitems
container wordt rechtstreeks verkregen via de wachtrijtrigger als een bindingexpressie ({queueTrigger}
).
Notitie
Een web-app kan een time-out uitvoeren na 20 minuten inactiviteit en alleen aanvragen voor de werkelijke web-app kunnen de timer opnieuw instellen. De timer wordt niet gereset als de configuratie van de toepassing in de Azure-portal wordt bekeken of als aanvragen worden ingediend op de pagina met geavanceerde hulpmiddelen (https://<app_name>.scm.azurewebsites.net
). Als u de web-app instelt die als host fungeert voor het continu uitvoeren van uw taak, wordt uitgevoerd volgens een schema of gebeurtenisgestuurde triggers gebruikt, schakelt u de instelling Altijd in op de Azure-configuratiepagina van uw web-app. De instelling AlwaysOn helpt ervoor te zorgen dat dit soort webtaken betrouwbaar wordt uitgevoerd. Deze functie is alleen beschikbaar in de prijscategorieën Basic, Standard en Premium.
Handmatige triggers
Als u een functie handmatig wilt activeren, gebruikt u het NoAutomaticTrigger
kenmerk, zoals hier wordt weergegeven:
[NoAutomaticTrigger]
public static void CreateQueueMessage(
ILogger logger,
string value,
[Queue("outputqueue")] out string message)
{
message = value;
logger.LogInformation("Creating queue message: ", message);
}
Het proces voor het handmatig activeren van de functie is afhankelijk van de SDK-versie.
Versie 3.x
static async Task Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
var host = builder.Build();
using (host)
{
var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
var inputs = new Dictionary<string, object>
{
{ "value", "Hello world!" }
};
await host.StartAsync();
await jobHost.CallAsync("CreateQueueMessage", inputs);
await host.StopAsync();
}
}
Versie 2.x
static void Main(string[] args)
{
JobHost host = new JobHost();
host.Call(typeof(Program).GetMethod("CreateQueueMessage"), new { value = "Hello world!" });
}
Invoer- en uitvoerbindingen
Invoerbindingen bieden een declaratieve manier om gegevens van Azure- of services van derden beschikbaar te maken voor uw code. Uitvoerbindingen bieden een manier om gegevens bij te werken. In het artikel Aan de slag ziet u een voorbeeld van elk artikel.
U kunt een retourwaarde voor een methode gebruiken voor een uitvoerbinding door het kenmerk toe te passen op de retourwaarde van de methode. Zie het voorbeeld in De retourwaarde van De Azure-functie gebruiken.
Bindingstypen
Het proces voor het installeren en beheren van bindingstypen is afhankelijk van of u versie 3 gebruikt.x of versie 2.x van de SDK. U vindt het pakket dat moet worden geïnstalleerd voor een bepaald bindingstype in de sectie Pakketten van het Azure Functions-referentieartikel van dat bindingstype. Een uitzondering is de bestandstrigger en -binding (voor het lokale bestandssysteem), die niet wordt ondersteund door Azure Functions.
Versie 3.x
In versie 3.x, de opslagbindingen zijn opgenomen in het Microsoft.Azure.WebJobs.Extensions.Storage
pakket. Roep de AddAzureStorage
extensiemethode aan in de ConfigureWebJobs
methode, zoals hier wordt weergegeven:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Als u andere trigger- en bindingstypen wilt gebruiken, installeert u het NuGet-pakket dat deze bevat en roept u de Add<binding>
extensiemethode aan die in de extensie is geïmplementeerd. Als u bijvoorbeeld een Azure Cosmos DB-binding wilt gebruiken, installeert Microsoft.Azure.WebJobs.Extensions.CosmosDB
en roept AddCosmosDB
u deze als volgt aan:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddCosmosDB();
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Als u de timertrigger of de bestandsbinding wilt gebruiken, die deel uitmaken van kernservices, roept u de AddTimers
methoden of AddFiles
uitbreidingsmethoden aan.
Versie 2.x
Deze trigger- en bindingstypen zijn opgenomen in versie 2.x van het Microsoft.Azure.WebJobs
pakket:
- Blob-opslag
- Queue Storage
- Table Storage
Als u andere trigger- en bindingstypen wilt gebruiken, installeert u het NuGet-pakket dat deze bevat en roept u een Use<binding>
methode op het JobHostConfiguration
object aan. Als u bijvoorbeeld een timertrigger wilt gebruiken, installeert Microsoft.Azure.WebJobs.Extensions
en roept UseTimers
u deze aan in de Main
methode, zoals hier wordt weergegeven:
static void Main()
{
config = new JobHostConfiguration();
config.UseTimers();
var host = new JobHost(config);
host.RunAndBlock();
}
Als u de bestandsbinding wilt gebruiken, installeert Microsoft.Azure.WebJobs.Extensions
en roept u deze UseFiles
aan.
ExecutionContext
Met WebJobs kunt u verbinding maken met een ExecutionContext
. Met deze binding hebt u toegang tot de ExecutionContext
parameter in uw functiehandtekening. De volgende code gebruikt bijvoorbeeld het contextobject voor toegang tot de aanroep-id, die u kunt gebruiken om alle logboeken te correleren die zijn geproduceerd door een bepaalde functie-aanroep.
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("queue")] string message,
ExecutionContext executionContext,
ILogger logger)
{
logger.LogInformation($"{message}\n{executionContext.InvocationId}");
}
}
Het proces voor binding met de ExecutionContext
SDK is afhankelijk van uw SDK-versie.
Versie 3.x
Roep de AddExecutionContextBinding
extensiemethode aan in de ConfigureWebJobs
methode, zoals hier wordt weergegeven:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddExecutionContextBinding();
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Versie 2.x
Het Microsoft.Azure.WebJobs.Extensions
eerder genoemde pakket biedt ook een speciaal bindingstype dat u kunt registreren door de methode aan te UseCore
roepen. Met deze binding kunt u een ExecutionContext
parameter definiëren in uw functiehandtekening, die als volgt is ingeschakeld:
class Program
{
static void Main()
{
config = new JobHostConfiguration();
config.UseCore();
var host = new JobHost(config);
host.RunAndBlock();
}
}
Bindingsconfiguratie
U kunt het gedrag van sommige triggers en bindingen configureren. Het proces voor het configureren ervan is afhankelijk van de SDK-versie.
- Versie 3.x: Stel de configuratie in wanneer de
Add<Binding>
methode wordt aangeroepenConfigureWebJobs
. - Versie 2.x: Stel de configuratie in door eigenschappen in te stellen in een configuratieobject dat u doorgeeft.
JobHost
Deze bindingsspecifieke instellingen zijn gelijk aan instellingen in het host.json projectbestand in Azure Functions.
U kunt de volgende bindingen configureren:
- Azure Cosmos DB-trigger
- Event Hubs-trigger
- Queue Storage-trigger
- SendGrid-binding
- Service Bus-trigger
Azure Cosmos DB-triggerconfiguratie (versie 3.x)
In dit voorbeeld ziet u hoe u de Azure Cosmos DB-trigger configureert:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddCosmosDB(a =>
{
a.ConnectionMode = ConnectionMode.Gateway;
a.Protocol = Protocol.Https;
a.LeaseOptions.LeasePrefix = "prefix1";
});
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Zie het azure Cosmos DB-bindingsartikel voor meer informatie.
Event Hubs-triggerconfiguratie (versie 3.x)
In dit voorbeeld ziet u hoe u de Event Hubs-trigger configureert:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddEventHubs(a =>
{
a.BatchCheckpointFrequency = 5;
a.EventProcessorOptions.MaxBatchSize = 256;
a.EventProcessorOptions.PrefetchCount = 512;
});
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Zie het Event Hubs-bindingsartikel voor meer informatie.
Configuratie van wachtrijopslagtrigger
In de volgende voorbeelden ziet u hoe u de wachtrijopslagtrigger configureert.
Versie 3.x
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage(a => {
a.BatchSize = 8;
a.NewBatchThreshold = 4;
a.MaxDequeueCount = 4;
a.MaxPollingInterval = TimeSpan.FromSeconds(15);
});
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Zie het artikel Queue Storage Binding voor meer informatie.
Versie 2.x
static void Main(string[] args)
{
JobHostConfiguration config = new JobHostConfiguration();
config.Queues.BatchSize = 8;
config.Queues.NewBatchThreshold = 4;
config.Queues.MaxDequeueCount = 4;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(15);
JobHost host = new JobHost(config);
host.RunAndBlock();
}
Zie de naslaginformatie host.json v1.x voor meer informatie.
SendGrid-bindingsconfiguratie (versie 3.x)
In dit voorbeeld ziet u hoe u de SendGrid-uitvoerbinding configureert:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddSendGrid(a =>
{
a.FromAddress.Email = "samples@functions.com";
a.FromAddress.Name = "Azure Functions";
});
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Zie het SendGrid-bindingsartikel voor meer informatie.
Service Bus-triggerconfiguratie (versie 3.x)
In dit voorbeeld ziet u hoe u de Service Bus-trigger configureert:
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddServiceBus(sbOptions =>
{
sbOptions.MessageHandlerOptions.AutoComplete = true;
sbOptions.MessageHandlerOptions.MaxConcurrentCalls = 16;
});
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Zie het Service Bus-bindingsartikel voor meer informatie.
Configuratie voor andere bindingen
Sommige trigger- en bindingstypen definiëren hun eigen aangepaste configuratietypen. Met de bestandstrigger kunt u bijvoorbeeld het hoofdpad opgeven dat moet worden bewaakt, zoals in de volgende voorbeelden.
Versie 3.x
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddFiles(a => a.RootPath = @"c:\data\import");
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Versie 2.x
static void Main()
{
config = new JobHostConfiguration();
var filesConfig = new FilesConfiguration
{
RootPath = @"c:\data\import"
};
config.UseFiles(filesConfig);
var host = new JobHost(config);
host.RunAndBlock();
}
Bindingexpressies
In kenmerkconstructorparameters kunt u expressies gebruiken die worden omgezet in waarden uit verschillende bronnen. In de volgende code maakt het pad voor het kenmerk bijvoorbeeld een expressie met de BlobTrigger
naam filename
. Als deze wordt gebruikt voor de uitvoerbinding, filename
wordt omgezet in de naam van de triggerende blob.
public static void CreateThumbnail(
[BlobTrigger("sample-images/{filename}")] Stream image,
[Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
string filename,
ILogger logger)
{
logger.Info($"Blob trigger processing: {filename}");
// ...
}
Zie Bindingexpressies en -patronen in de Documentatie van Azure Functions voor meer informatie over bindingsexpressies.
Aangepaste bindingexpressies
Soms wilt u een wachtrijnaam, een blobnaam of container of een tabelnaam opgeven in code in plaats van deze hard te coderen. U kunt bijvoorbeeld de wachtrijnaam voor het QueueTrigger
kenmerk opgeven in een configuratiebestand of omgevingsvariabele.
U kunt dit doen door een aangepaste naamomzetting door te geven tijdens de configuratie. U neemt tijdelijke aanduidingen op in de constructorparameters voor trigger- of bindingskenmerken en de code van de resolver bevat de werkelijke waarden die moeten worden gebruikt in plaats van deze tijdelijke aanduidingen. U identificeert tijdelijke aanduidingen door deze te omringen met procenttekens (%) zoals hier wordt weergegeven:
public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
Console.WriteLine(logMessage);
}
Met deze code kunt u een wachtrij gebruiken met de naam logqueuetest
in de testomgeving en een wachtrij die in productie wordt genoemd logqueueprod
. In plaats van een in code vastgelegde wachtrijnaam geeft u de naam op van een vermelding in de appSettings
verzameling.
Er is een standaard resolver die van kracht wordt als u geen aangepaste oplossing opgeeft. De standaardwaarde haalt waarden op uit app-instellingen of omgevingsvariabelen.
Voor het ConfigurationManager
gebruik van .NET Core 3.1 is het NuGet-pakket System.Configuration.ConfigurationManager vereist. Voor het voorbeeld is de volgende using
instructie vereist:
using System.Configuration;
Uw NameResolver
klasse haalt de wachtrijnaam op uit app-instellingen, zoals hier wordt weergegeven:
public class CustomNameResolver : INameResolver
{
public string Resolve(string name)
{
return ConfigurationManager.AppSettings[name].ToString();
}
}
Versie 3.x
U configureert de resolver met behulp van afhankelijkheidsinjectie. Voor deze voorbeelden is de volgende using
instructie vereist:
using Microsoft.Extensions.DependencyInjection;
U voegt de resolver toe door de ConfigureServices
extensiemethode aan HostBuilder
te roepen, zoals in dit voorbeeld:
static async Task Main(string[] args)
{
var builder = new HostBuilder();
var resolver = new CustomNameResolver();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
});
builder.ConfigureServices(s => s.AddSingleton<INameResolver>(resolver));
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Versie 2.x
Geef uw NameResolver
klasse door aan het JobHost
object, zoals hier wordt weergegeven:
static void Main(string[] args)
{
JobHostConfiguration config = new JobHostConfiguration();
config.NameResolver = new CustomNameResolver();
JobHost host = new JobHost(config);
host.RunAndBlock();
}
Azure Functions implementeert INameResolver
om waarden op te halen uit app-instellingen, zoals wordt weergegeven in het voorbeeld. Wanneer u de WebJobs SDK rechtstreeks gebruikt, kunt u een aangepaste implementatie schrijven die tijdelijke aanduidingen voor vervangingswaarden ophaalt van de bron die u wilt gebruiken.
Binding tijdens runtime
Als u wat werk in uw functie moet uitvoeren voordat u een bindingskenmerk zoals Queue
, Blob
of Table
, gebruikt, kunt u de IBinder
interface gebruiken.
In het volgende voorbeeld wordt een bericht in de invoerwachtrij gebruikt en wordt een nieuw bericht gemaakt met dezelfde inhoud in een uitvoerwachtrij. De naam van de uitvoerwachtrij wordt ingesteld op code in de hoofdtekst van de functie.
public static void CreateQueueMessage(
[QueueTrigger("inputqueue")] string queueMessage,
IBinder binder)
{
string outputQueueName = "outputqueue" + DateTime.Now.Month.ToString();
QueueAttribute queueAttribute = new QueueAttribute(outputQueueName);
CloudQueue outputQueue = binder.Bind<CloudQueue>(queueAttribute);
outputQueue.AddMessageAsync(new CloudQueueMessage(queueMessage));
}
Zie Binding tijdens runtime in de Documentatie van Azure Functions voor meer informatie.
Referentie-informatie voor binding
De Documentatie van Azure Functions bevat naslaginformatie over elk bindingstype. U vindt de volgende informatie in elk bindingsreferentieartikel. (Dit voorbeeld is gebaseerd op opslagwachtrij.)
- Pakketten. Het pakket dat u moet installeren om ondersteuning voor de binding in een WebJobs SDK-project op te nemen.
- Voorbeelden. Codevoorbeelden. Het voorbeeld van de C#-klassebibliotheek is van toepassing op de WebJobs SDK. Laat het
FunctionName
kenmerk gewoon weg. - Kenmerken. De kenmerken die moeten worden gebruikt voor het bindingstype.
- Configuratie. Uitleg van de kenmerkeigenschappen en constructorparameters.
- Gebruik. De typen waaraan u kunt binden en informatie over hoe de binding werkt. Bijvoorbeeld: polling-algoritme, verwerking van gifwachtrijen.
Notitie
De HTTP-, Webhooks- en Event Grid-bindingen worden alleen ondersteund door Azure Functions, niet door de WebJobs SDK.
Zie Ondersteunde bindingen voor een volledige lijst met bindingen die worden ondersteund in Azure Functions Runtime.
Kenmerken voor Uitschakelen, Time-out en Singleton
Met deze kenmerken kunt u de functie activeren, annuleren en ervoor zorgen dat slechts één exemplaar van een functie wordt uitgevoerd.
Kenmerk uitschakelen
Met het Disable
kenmerk kunt u bepalen of een functie kan worden geactiveerd.
Als de app-instelling Disable_TestJob
in het volgende voorbeeld een waarde heeft van 1
of True
(niet hoofdlettergevoelig), wordt de functie niet uitgevoerd. In dat geval maakt de runtime een logboekbericht functie Functions.TestJob is uitgeschakeld.
[Disable("Disable_TestJob")]
public static void TestJob([QueueTrigger("testqueue2")] string message)
{
Console.WriteLine("Function with Disable attribute executed!");
}
Wanneer u app-instellingswaarden wijzigt in Azure Portal, wordt de webtaak opnieuw gestart om de nieuwe instelling op te halen.
Het kenmerk kan worden gedeclareerd op het niveau van de parameter, methode of klasse. De naam van de instelling kan ook bindingexpressies bevatten.
Time-outkenmerk
Het Timeout
kenmerk zorgt ervoor dat een functie wordt geannuleerd als deze niet binnen een opgegeven periode wordt voltooid. In het volgende voorbeeld wordt de functie één dag uitgevoerd zonder het kenmerk Timeout. Time-out zorgt ervoor dat de functie na 15 seconden wordt geannuleerd. Wanneer de parameter 'throwOnError' van het time-outkenmerk is ingesteld op 'true', wordt de aanroep van de functie beëindigd door een uitzondering die wordt gegenereerd door de webjobs-SDK wanneer het time-outinterval wordt overschreden. De standaardwaarde 'throwOnError' is 'false'. Wanneer het time-outkenmerk wordt gebruikt, is het standaardgedrag om de aanroep van de functie te annuleren door het annuleringstoken in te stellen terwijl de aanroep voor onbepaalde tijd kan worden uitgevoerd totdat de functiecode een uitzondering retourneert of genereert.
[Timeout("00:00:15")]
public static async Task TimeoutJob(
[QueueTrigger("testqueue2")] string message,
CancellationToken token,
TextWriter log)
{
await log.WriteLineAsync("Job starting");
await Task.Delay(TimeSpan.FromDays(1), token);
await log.WriteLineAsync("Job completed");
}
U kunt het time-outkenmerk toepassen op klasse- of methodeniveau en u kunt een globale time-out opgeven met behulp van JobHostConfiguration.FunctionTimeout
. Time-outs op klasseniveau of op methodeniveau overschrijven globale time-outs.
Kenmerk Singleton
Het Singleton
kenmerk zorgt ervoor dat slechts één exemplaar van een functie wordt uitgevoerd, zelfs wanneer er meerdere exemplaren van de hostweb-app zijn. Het kenmerk Singleton maakt gebruik van gedistribueerde vergrendelingen om ervoor te zorgen dat één exemplaar wordt uitgevoerd.
In dit voorbeeld wordt slechts één exemplaar van de ProcessImage
functie op een bepaald moment uitgevoerd:
[Singleton]
public static async Task ProcessImage([BlobTrigger("images")] Stream image)
{
// Process the image.
}
SingletonMode.Listener
Sommige triggers hebben ingebouwde ondersteuning voor gelijktijdigheidsbeheer:
- QueueTrigger. Stel
JobHostConfiguration.Queues.BatchSize
in op1
. - ServiceBusTrigger. Stel
ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls
in op1
. - FileTrigger. Stel
FileProcessor.MaxDegreeOfParallelism
in op1
.
U kunt deze instellingen gebruiken om ervoor te zorgen dat uw functie wordt uitgevoerd als een singleton op één exemplaar. Als u ervoor wilt zorgen dat slechts één exemplaar van de functie wordt uitgevoerd wanneer de web-app wordt uitgeschaald naar meerdere exemplaren, past u een singletonvergrendeling op listenerniveau toe op de functie ([Singleton(Mode = SingletonMode.Listener)]
). Listenervergrendelingen worden verkregen wanneer jobhost wordt gestart. Als drie uitgeschaalde exemplaren allemaal tegelijk beginnen, verkrijgt slechts één van de exemplaren de vergrendeling en wordt slechts één listener gestart.
Notitie
Zie deze GitHub-opslagplaats voor meer informatie over hoe de SingletonMode.Function werkt.
Bereikwaarden
U kunt een bereikexpressie/-waarde opgeven voor een singleton. De expressie/waarde zorgt ervoor dat alle uitvoeringen van de functie in een specifiek bereik worden geserialiseerd. Door op deze manier gedetailleerdere vergrendeling te implementeren, kunt u een zekere mate van parallelle uitvoering voor uw functie mogelijk maken terwijl andere aanroepen worden geserialiseerd zoals bepaald door uw vereisten. In de volgende code wordt de bereikexpressie bijvoorbeeld gekoppeld aan de Region
waarde van het binnenkomende bericht. Wanneer de wachtrij drie berichten bevat in regio's Oost, Oost en West, worden de berichten met regio Oost serieel uitgevoerd. Het bericht met regio West wordt parallel uitgevoerd met de berichten in regio Oost.
[Singleton("{Region}")]
public static async Task ProcessWorkItem([QueueTrigger("workitems")] WorkItem workItem)
{
// Process the work item.
}
public class WorkItem
{
public int ID { get; set; }
public string Region { get; set; }
public int Category { get; set; }
public string Description { get; set; }
}
SingletonScope.Host
Het standaardbereik voor een vergrendeling is SingletonScope.Function
, wat betekent dat het vergrendelingsbereik (het blob-leasepad) is gekoppeld aan de volledig gekwalificeerde functienaam. Als u functies wilt vergrendelen, geeft SingletonScope.Host
u een bereik-id-naam op die hetzelfde is voor alle functies die u niet tegelijk wilt uitvoeren. In het volgende voorbeeld wordt slechts één exemplaar tegelijk uitgevoerd of AddItem
RemoveItem
uitgevoerd:
[Singleton("ItemsLock", SingletonScope.Host)]
public static void AddItem([QueueTrigger("add-item")] string message)
{
// Perform the add operation.
}
[Singleton("ItemsLock", SingletonScope.Host)]
public static void RemoveItem([QueueTrigger("remove-item")] string message)
{
// Perform the remove operation.
}
Lease-blobs weergeven
De WebJobs SDK maakt gebruik van Azure Blob-leases onder de dekking voor het implementeren van gedistribueerde vergrendeling. De lease-blobs die door Singleton worden gebruikt, zijn te vinden in de azure-webjobs-host
container in het AzureWebJobsStorage
opslagaccount onder het pad 'vergrendelingen'. Het lease-blobpad voor het eerste ProcessImage
voorbeeld dat eerder wordt weergegeven, kan bijvoorbeeld zijn locks/061851c758f04938a4426aa9ab3869c0/WebJobs.Functions.ProcessImage
. Alle paden bevatten de JobHost-id, in dit geval 061851c758f04938a4426aa9ab3869c0.
Asynchrone functies
Zie de Documentatie van Azure Functions voor informatie over het coden van asynchrone functies.
Annuleringstokens
Zie de Documentatie van Azure Functions over annuleringstokens en het probleemloos afsluiten voor informatie over het verwerken van annuleringstokens.
Meerdere exemplaren
Als uw web-app wordt uitgevoerd op meerdere exemplaren, wordt een doorlopende webtaak uitgevoerd op elk exemplaar, waarbij wordt geluisterd naar triggers en aanroepende functies. De verschillende triggerbindingen zijn ontworpen om efficiënt werk samen te delen tussen exemplaren, zodat u kunt uitschalen naar meer exemplaren, zodat u meer belasting kunt verwerken.
Hoewel sommige triggers kunnen leiden tot dubbele verwerking, kunnen wachtrij- en blobopslagtriggers voorkomen dat een functie meer dan één keer een wachtrijbericht of blob verwerkt. Zie Ontwerpen voor identieke invoer in de Documentatie van Azure Functions voor meer informatie.
De timertrigger zorgt er automatisch voor dat slechts één exemplaar van de timer wordt uitgevoerd, zodat u niet meer dan één functie-exemplaar op een bepaald gepland tijdstip uitvoert.
Als u ervoor wilt zorgen dat slechts één exemplaar van een functie wordt uitgevoerd, zelfs wanneer er meerdere exemplaren van de hostweb-app zijn, kunt u het Singleton
kenmerk gebruiken.
Filters
Functiefilters (preview) bieden een manier om de pijplijn voor het uitvoeren van webtaken aan te passen met uw eigen logica. Filters zijn vergelijkbaar met ASP.NET Core-filters. U kunt ze implementeren als declaratieve kenmerken die worden toegepast op uw functies of klassen. Zie Functiefilters voor meer informatie.
Logboekregistratie en controle
We raden het logboekregistratieframework aan dat is ontwikkeld voor ASP.NET. In het artikel Aan de slag ziet u hoe u dit kunt gebruiken.
Logboekfiltering
Elk logboek dat door een ILogger
exemplaar wordt gemaakt, heeft een bijbehorende Category
en Level
. LogLevel
is een opsomming en de gehele code geeft het relatieve belang aan:
Logniveau | Code |
---|---|
Trace | 0 |
Fouten opsporen | 1 |
Gegevens | 2 |
Waarschuwing | 3 |
Error | 4 |
Kritiek | 5 |
Geen | 6 |
U kunt elke categorie onafhankelijk filteren op een bepaalde LogLevel
. U wilt bijvoorbeeld alle logboeken voor verwerking van blobtriggers zien, maar alleen Error
en hoger voor alle andere logboeken.
Versie 3.x
Versie 3.x van de SDK is afhankelijk van het filteren dat is ingebouwd in .NET Core. Met de LogCategories
klasse kunt u categorieën definiëren voor specifieke functies, triggers of gebruikers. Het definieert ook filters voor specifieke hoststatussen, zoals Startup
en Results
. Hiermee kunt u de uitvoer van logboekregistratie verfijnen. Als er geen overeenkomst wordt gevonden in de gedefinieerde categorieën, valt het filter terug op de waarde bij het Default
bepalen of het bericht moet worden gefilterd.
LogCategories
vereist de volgende using-instructie:
using Microsoft.Azure.WebJobs.Logging;
In het volgende voorbeeld wordt een filter samengesteld dat standaard alle logboeken op het Warning
niveau filtert. De Function
en results
categorieën (gelijk aan Host.Results
in versie 2.x) worden gefilterd op het Error
niveau. Het filter vergelijkt de huidige categorie met alle geregistreerde niveaus in het LogCategories
exemplaar en kiest de langste overeenkomst. Dit betekent dat het Debug
niveau dat is geregistreerd voor Host.Triggers
overeenkomsten Host.Triggers.Queue
of Host.Triggers.Blob
. Hierdoor kunt u bredere categorieën beheren zonder dat u elke categorie hoeft toe te voegen.
static async Task Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
});
builder.ConfigureLogging(logging =>
{
logging.SetMinimumLevel(LogLevel.Warning);
logging.AddFilter("Function", LogLevel.Error);
logging.AddFilter(LogCategories.CreateFunctionCategory("MySpecificFunctionName"),
LogLevel.Debug);
logging.AddFilter(LogCategories.Results, LogLevel.Error);
logging.AddFilter("Host.Triggers", LogLevel.Debug);
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Versie 2.x
In versie 2.x van de SDK gebruikt u de LogCategoryFilter
klasse om filteren te beheren. De LogCategoryFilter
eigenschap heeft een Default
eigenschap met een initiële waarde van Information
, wat betekent dat berichten op de Information
, Warning
, Error
of Critical
niveaus worden geregistreerd, maar berichten op de Debug
of Trace
niveaus worden weggefilterd.
Net als bij LogCategories
versie 3.x, met de CategoryLevels
eigenschap kunt u logboekniveaus opgeven voor specifieke categorieën, zodat u de uitvoer van logboekregistratie kunt verfijnen. Als er geen overeenkomst wordt gevonden in de CategoryLevels
woordenlijst, valt het filter terug op de waarde bij het Default
bepalen of het bericht moet worden gefilterd.
In het volgende voorbeeld wordt een filter samengesteld dat standaard alle logboeken op niveau Warning
filtert. De Function
categorieën en Host.Results
categorieën worden gefilterd op het Error
niveau. De LogCategoryFilter
huidige categorie wordt vergeleken met alle geregistreerde CategoryLevels
en kiest de langste overeenkomst. Debug
Het niveau waarvoor is geregistreerdHost.Triggers
, komt dus overeen Host.Triggers.Queue
met of Host.Triggers.Blob
. Hierdoor kunt u bredere categorieën beheren zonder dat u elke categorie hoeft toe te voegen.
var filter = new LogCategoryFilter();
filter.DefaultLevel = LogLevel.Warning;
filter.CategoryLevels[LogCategories.Function] = LogLevel.Error;
filter.CategoryLevels[LogCategories.Results] = LogLevel.Error;
filter.CategoryLevels["Host.Triggers"] = LogLevel.Debug;
config.LoggerFactory = new LoggerFactory()
.AddApplicationInsights(instrumentationKey, filter.Filter)
.AddConsole(filter.Filter);
Aangepaste telemetrie voor Application Insights
Het proces voor het implementeren van aangepaste telemetrie voor Application Insights is afhankelijk van de SDK-versie. Zie Application Insights-logboekregistratie toevoegen voor meer informatie over het configureren van Application Insights.
Versie 3.x
Omdat versie 3.x van de WebJobs SDK is afhankelijk van de algemene .NET Core-host. Er is geen aangepaste telemetriefactory meer beschikbaar. U kunt echter aangepaste telemetrie toevoegen aan de pijplijn met behulp van afhankelijkheidsinjectie. Voor de voorbeelden in deze sectie zijn de volgende using
instructies vereist:
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Channel;
Met de volgende aangepaste implementatie ITelemetryInitializer
kunt u uw eigen ITelemetry
toevoegen aan de standaardinstelling TelemetryConfiguration
.
internal class CustomTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
// Do something with telemetry.
}
}
Roep ConfigureServices
de opbouwfunctie aan om uw aangepaste ITelemetryInitializer
aan de pijplijn toe te voegen.
static async Task Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
});
builder.ConfigureLogging((context, b) =>
{
// Add logging providers.
b.AddConsole();
// If this key exists in any config, use it to enable Application Insights.
string appInsightsKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
if (!string.IsNullOrEmpty(appInsightsKey))
{
// This uses the options callback to explicitly set the instrumentation key.
b.AddApplicationInsights(o => o.InstrumentationKey = appInsightsKey);
}
});
builder.ConfigureServices(services =>
{
services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Wanneer de TelemetryConfiguration
constructie is uitgevoerd, worden alle geregistreerde typen ITelemetryInitializer
opgenomen. Zie Application Insights-API voor aangepaste gebeurtenissen en metrische gegevens voor meer informatie.
In versie 3.x, u hoeft de TelemetryClient
host niet meer leeg te maken wanneer de host stopt. Het .NET Core-afhankelijkheidsinjectiesysteem verwijdert automatisch het geregistreerde ApplicationInsightsLoggerProvider
systeem, waardoor de TelemetryClient
.
Versie 2.x
In versie 2.x, de TelemetryClient
intern gemaakt door de Application Insights-provider voor de WebJobs SDK gebruikt ServerTelemetryChannel
. Wanneer het Application Insights-eindpunt niet beschikbaar is of binnenkomende aanvragen beperkt, slaat dit kanaal aanvragen op in het bestandssysteem van de web-app en verzendt deze later opnieuw.
De TelemetryClient
wordt gemaakt door een klasse die implementeert ITelemetryClientFactory
. Dit is standaard de DefaultTelemetryClientFactory
.
Als u een deel van de Application Insights-pijplijn wilt wijzigen, kunt u uw eigen ITelemetryClientFactory
pijplijn opgeven en gebruikt de host uw klasse om een TelemetryClient
. Deze code overschrijft DefaultTelemetryClientFactory
bijvoorbeeld het wijzigen van een eigenschap van ServerTelemetryChannel
:
private class CustomTelemetryClientFactory : DefaultTelemetryClientFactory
{
public CustomTelemetryClientFactory(string instrumentationKey, Func<string, LogLevel, bool> filter)
: base(instrumentationKey, new SamplingPercentageEstimatorSettings(), filter)
{
}
protected override ITelemetryChannel CreateTelemetryChannel()
{
ServerTelemetryChannel channel = new ServerTelemetryChannel();
// Change the default from 30 seconds to 15 seconds.
channel.MaxTelemetryBufferDelay = TimeSpan.FromSeconds(15);
return channel;
}
}
Het SamplingPercentageEstimatorSettings
object configureert adaptieve steekproeven. Dit betekent dat in bepaalde scenario's met grote volumes Application Insights een geselecteerde subset telemetriegegevens naar de server verzendt.
Nadat u de telemetriefactory hebt gemaakt, geeft u deze door aan de Application Insights-logboekregistratieprovider:
var clientFactory = new CustomTelemetryClientFactory(instrumentationKey, filter.Filter);
config.LoggerFactory = new LoggerFactory()
.AddApplicationInsights(clientFactory);
Volgende stappen
Dit artikel bevat codefragmenten die laten zien hoe u veelvoorkomende scenario's voor het werken met de WebJobs SDK kunt afhandelen. Zie azure-webjobs-sdk-samples voor volledige voorbeelden.