Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u kunt werken met de Azure WebJobs SDK. Zie Aan de slag met de Azure WebJobs SDK om snel aan de slag te gaan met WebJobs.
WebJobs SDK-versies
De belangrijkste verschillen tussen versie 3. x en versie 2. x van de WebJobs SDK zijn:
- 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 voor meer informatie.
Sommige voorbeelden in dit artikel worden geleverd voor zowel WebJobs versie 3.x als WebJobs versie 2.x.
Azure Functions is gebouwd 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 de WebJobs SDK gebruiken 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-gastheer
De WebJobs-host is een runtimecontainer voor functies. De host luistert naar triggers en roept functies aan. 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.
Deze architectuurwijziging 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. U kunt de host niet aanpassen door code te schrijven. In Azure Functions past u het hostgedrag aan 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. De WebJobs SDK vereist standaard een opslagverbinding met de naam AzureWebJobsStorage
.
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. Deze methode is handig voor het configureren van op identiteit gebaseerde verbindingen. U kunt omgevingsvariabelen behandelen als een verzameling met behulp van een gedeeld voorvoegsel dat eindigt op dubbele onderstrepingstekens (__
). Vervolgens kunt u naar de groep verwijzen door de verbindingsnaam in te stellen op dit voorvoegsel.
De eigenschap voor een Azure Blob Storage-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.
In het volgende voorbeeld ziet u 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.42" />
<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-exemplaar, moet u ervoor zorgen dat u een aanroep naar AddAzureStorageCoreServices
toevoegt. Met deze aanroep kunnen AzureWebJobsStorage
en andere opslagtriggers en bindingen de identiteit gebruiken.
Hier volgt een voorbeeld:
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
// Other configurations...
});
Vervolgens kunt u de AzureWebJobsStorage
verbinding configureren door omgevingsvariabelen (of toepassingsinstellingen in te stellen wanneer uw code wordt gehost in Azure App Service):
Omgevingsvariabele | Beschrijving | Voorbeeldwaarde |
---|---|---|
AzureWebJobsStorage__blobServiceUri |
De gegevensvlak-URI van de blobservice van het opslagaccount. Het maakt gebruik van het HTTPS-schema. | <https://storage_account_name.blob.core.windows.net> |
AzureWebJobsStorage__queueServiceUri |
De gegevensvlak-URI van de wachtrijservice van het opslagaccount. Het maakt gebruik van het HTTPS-schema. | <https://storage_account_name.queue.core.windows.net> |
Als u uw configuratie op een andere manier dan omgevingsvariabelen opgeeft, zoals in een appsettings.json
configuratiebestand, 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, is het de standaardinstelling om uw ontwikkelaarsidentiteit te gebruiken zoals beschreven voor DefaultAzureCredential
.
Wanneer uw code wordt gehost in App Service, wordt de configuratie in het voorgaande voorbeeld 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 eigenschappen voor uw verbinding toevoegen om op te geven 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 een gestructureerde configuratie zou het volledige object vergelijkbaar zijn met dit voorbeeld:
{
"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 AzureWebJobsStorage
wordt gebruikt, moet roltoewijzingen hebben die het de rollen Opslagblobgegevenseigenaar, Bijdrager voor opslagwachtrijgegevens en Bijdrager voor opslagaccount verlenen. U kunt de rollen Inzender voor opslagwachtrijgegevens en Inzender voor opslagaccounts weglaten als u geen blobtriggers wilt gebruiken.
In de volgende tabel ziet u vooraf gedefinieerde rollen die wij aanraden wanneer u triggers gebruikt in bindingen bij normaal gebruik. Uw toepassing vereist mogelijk meer machtigingen, afhankelijk van de code die u schrijft.
Bindend | Voorbeeld van ingebouwde rollen |
---|---|
Blobtrigger |
Eigenaarvan opslagblobgegevens enInzender voor opslagwachtrijgegevens Zie ook de voorgaande vereisten voor AzureWebJobsStorage . |
Blob (invoer) | Gegevenslezer voor opslagblobs |
Blob (uitvoer) | Storage Blob Data-eigenaar |
Wachtrijtrigger | Storage Queue Data Reader, Storage Queue Data Message Processor |
Wachtrij (uitvoer) | Bijdrager voor opslagwachtrijgegevens, Berichtverzender voor opslagwachtrijgegevens |
Servicebus-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, stellen de Service Bus-abonnementsresource niet beschikbaar als scope voor roltoewijzing. In deze scenario's kunt u in plaats daarvan de Azure CLI gebruiken. 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 voor verbindingsreeksen. In versie 2. x, u kunt uw eigen namen gebruiken voor deze verbindingsreeksen en u kunt ze elders opslaan. U kunt namen in code instellen met behulp van JobHostConfiguration
, zoals in dit voorbeeld:
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 bestaat geen API om namen van verbindingsreeksen te wijzigen. Zie Webjobs ontwikkelen en implementeren met behulp van Visual Studio voor meer informatie.
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 draait:
Eigendom | Ontwikkelomgeving |
---|---|
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
In versie 3. x gebruikt u de standaard-ASP.NET Core-API's om de hostomgeving te wijzigen. 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. Stel config.IsDevelopment
zo in dat het true
retourneert wanneer het lokaal wordt uitgevoerd, door een lokale omgevingsvariabele met de naam AzureWebJobsEnv
in te stellen die de waarde Development
heeft.
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
eigenschap. 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, stromen door HttpClient
met behulp van ServicePointManager
. Nadat u de waarde hebt bereikt die is ingesteld in DefaultConnectionLimit
, begint ServicePointManager
aanvragen in de wachtrij te plaatsen voordat ze worden verzonden. Stel dat uw DefaultConnectionLimit
code is ingesteld op 2
en dat uw code 1000 HTTP-aanvragen doet. In eerste instantie zijn slechts 2 aanvragen toegestaan voor het besturingssysteem. De andere 998 aanvragen worden in de wachtrij geplaatst totdat er ruimte voor hen is. Uw HttpClient
kan een time-out krijgen omdat het lijkt alsof het de aanvraag heeft gedaan, maar de aanvraag is nooit door het besturingssysteem naar de bestemmingsserver verzonden. Mogelijk ziet u gedrag dat niet logisch lijkt: 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 die wordt alleen ondersteund door Basic- en hogere App Service-abonnementen.
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 600 heeft. Als u een niet-afhankelijke verbindingslimiet ServicePointManager
hebt, is de kans groter dat de drempelwaarde voor de sandbox-verbinding is bereikt en de site wordt afgesloten. In dat geval kan het instellen DefaultConnectionLimit
op iets lagers, zoals 200, voorkomen dat dit scenario optreedt en nog steeds voldoende doorvoer toestaat.
De instelling moet worden geconfigureerd voordat er HTTP-aanvragen worden gedaan. Daarom moet de WebJobs-host de instelling niet automatisch aanpassen. Er kunnen HTTP-aanvragen optreden 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 wordt weergegeven in dit voorbeeld:
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();
}
Aanleidingen
De WebJobs SDK ondersteunt dezelfde set triggers en binding die door Azure Functions wordt gebruikt. In de WebJobs SDK zijn triggers functiespecifiek en niet gerelateerd 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 ze 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 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 in de sample-workitems
container te lezen. 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. Als u de configuratie van de app in Azure Portal bekijkt of aanvragen indient naar de site met geavanceerde hulpprogramma's, wordt de timer niet opnieuw ingesteld. 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 in het deelvenster Azure-configuratie van uw web-app. Met de instelling AlwaysOn kunt u ervoor zorgen dat dit soort webtaken betrouwbaar worden 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:
[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 hierop is de bestandstrigger en -binding (voor het lokale bestandssysteem), die azure Functions niet ondersteunt.
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:
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, installeer Microsoft.Azure.WebJobs.Extensions.CosmosDB
en roep AddCosmosDB
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
- Wachtrijopslag
- Tabelopslag
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, installeer Microsoft.Azure.WebJobs.Extensions
en roep UseTimers
aan in de Main
methode:
static void Main()
{
config = new JobHostConfiguration();
config.UseTimers();
var host = new JobHost(config);
host.RunAndBlock();
}
Als u de bestandsbinding wilt gebruiken, installeert u Microsoft.Azure.WebJobs.Extensions
en roept u UseFiles
aan.
Uitvoeringscontext
In WebJobs kunt u verbinding maken met een ExecutionContext
exemplaar. Met deze binding kunt u toegang hebben tot ExecutionContext
als een parameter in uw functiesignatuur. 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 aan ExecutionContext
hangt af van uw SDK-versie.
Versie 3.x
Roep de AddExecutionContextBinding
extensiemethode aan in de ConfigureWebJobs
methode:
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. U kunt de binding gebruiken om een ExecutionContext
parameter in uw functiehandtekening te definiëren:
class Program
{
static void Main()
{
config = new JobHostConfiguration();
config.UseCore();
var host = new JobHost(config);
host.RunAndBlock();
}
}
Bindconfiguratie
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
- Wachtrijopslag-trigger
- SendGrid-koppeling
- Service Bus-trigger
Azure Cosmos DB-trigger-configuratie (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 Azure Cosmos DB-binding voor meer informatie.
Azure 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 Event Hubs-binding voor meer informatie.
Configuratie van trigger voor wachtrijopslag
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 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 host.json
v1.x-verwijzing 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 voor meer informatie SendGrid
binding.
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();
}
}
Voor meer informatie, zie Service Bus-binding.
Configuratie voor andere bindingen
Sommige trigger- en bindingstypen definiëren hun eigen aangepaste configuratietypen. U kunt bijvoorbeeld de bestandstrigger gebruiken om het hoofdpad op te geven 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. Bijvoorbeeld, in de volgende code creëert het pad voor het BlobTrigger
-attribuut een expressie met de 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 bindingsuitdrukkingen
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 een wachtrijnaam toewijzen aan het kenmerk door tijdens de configuratie een aangepaste naamresolver door te geven. 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 (%
):
public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
Console.WriteLine(logMessage);
}
In deze code gebruikt u een wachtrij met de naam logqueuetest
in de testomgeving en een wachtrij met de naam logqueueprod
in productie. In plaats van een in code vastgelegde wachtrijnaam geeft u de naam op van een vermelding in de appSettings
verzameling.
Een standaard resolver wordt van kracht als u geen aangepaste oplossing opgeeft. De standaardwaarde haalt waarden op uit app-instellingen of omgevingsvariabelen.
Vanaf .NET Core 3.1 is voor het ConfigurationManager
exemplaar dat u gebruikt het System.Configuration.ConfigurationManager
NuGet-pakket vereist. Voor het voorbeeld is de volgende using
instructie vereist:
using System.Configuration;
Uw NameResolver
klasse haalt de wachtrijnaam op uit app-instellingen:
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:
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 vervangingswaarden voor tijdelijke aanduidingen ophaalt uit de gewenste bron.
Binding tijdens uitvoeringstijd
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 invoerwachtrijbericht gebruikt en wordt een nieuw bericht gemaakt met dezelfde inhoud in een uitvoerwachtrij. De naam van de uitvoerwachtrij wordt door de code in het lichaam van de functie ingesteld.
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.
Informatie voor binding van referenties
De Documentatie van Azure Functions bevat naslaginformatie over elk bindingstype. De volgende informatie vindt u in elk bindingsreferentieartikel. (Dit voorbeeld is gebaseerd op een 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 een polling-algoritme of gifwachtrijverwerking.
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 de Azure Functions-runtime.
Kenmerken: Uitschakelen, time-out en Singleton
U kunt deze kenmerken gebruiken om functies te activeren, te annuleren en ervoor te zorgen dat slechts één exemplaar van een functie wordt uitgevoerd.
Kenmerk uitschakelen
Gebruik het Disable
kenmerk om te 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 specifiek), wordt de functie niet uitgevoerd. In dat scenario creëert de runtime het logbericht 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.
Timeoutkenmerk
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 Timeout
kenmerk. Time-out zorgt ervoor dat de functie na 15 seconden wordt geannuleerd. Wanneer het kenmerk Timeout
en de parameter throwOnError
is ingesteld op true
, wordt de functieaanroep beëindigd door een uitzondering die wordt gegooid door de WebJobs SDK wanneer het timeout-interval wordt overschreden. De standaardwaarde van throwOnError
is false
. Wanneer het Timeout
kenmerk wordt gebruikt, is het standaardgedrag het annuleren van de functieaanroep 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 Timeout
kenmerk toepassen op klasseniveau of op 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.
Singleton-attribuut
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 Singleton
kenmerk maakt gebruik van gedistribueerde vergrendeling om ervoor te zorgen dat slechts éé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 instantie. 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 de JobHost wordt gestart. Als drie uitgeschaalde exemplaren allemaal tegelijk beginnen, krijgt slechts één van de exemplaren de vergrendeling en wordt slechts één listener gestart.
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
. Het vergrendelingsbereik (het blob-leasepad) is gekoppeld aan de volledige functienaam. Als u wilt vergrendelen over functies heen, specificeer SingletonScope.Host
en gebruik een bereik-id-naam die hetzelfde is voor alle functies die u niet gelijktijdig wilt uitvoeren. In het volgende voorbeeld wordt slechts één exemplaar tegelijk uitgevoerd: AddItem
of RemoveItem
.
[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 om gedistribueerde vergrendelingen te implementeren. 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.
Annuleringstoken
Zie de Documentatie van Azure Functions over annuleringstokens en het probleemloos afsluiten voor informatie over het verwerken van annuleringstokens.
Meerdere gevallen
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 en in samenwerking werk te delen tussen exemplaren, zodat u door uitschaling naar meer exemplaren meer belasting kunt verwerken.
Hoewel sommige triggers kunnen leiden tot dubbele verwerking, voorkomen wachtrij- en blobopslagtriggers automatisch dat een functie een wachtrijbericht of blob meer dan één keer 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.
Filteren
Functiefilters (preview) bieden een manier om de pijplijn voor het uitvoeren van webtaken aan te passen met behulp van uw eigen logica. Deze 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
U wordt aangeraden het logboekregistratieframework te gebruiken 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 is gemaakt, heeft bijbehorende Category
en Level
waarden.
LogLevel
is een opsomming en de gehele code geeft het relatieve belang aan:
Logniveau | Code |
---|---|
Spoor | 0 |
Fouten opsporen | 1 |
Gegevens | 2 |
Waarschuwing | 3 |
Fout | 4 |
Kritisch | 5 |
Geen | 6 |
U kunt elke categorie onafhankelijk filteren op een bepaalde LogLevel
waarde. U wilt bijvoorbeeld alle logboeken voor de 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 filter dat is ingebouwd in .NET Core. Gebruik de LogCategories
klasse om categorieën te definiëren voor specifieke functies, triggers of gebruikers. De LogCategories
klasse definieert ook filters voor specifieke hoststatussen, zoals Startup
en Results
, zodat u de uitvoer van logboekregistratie kunt 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. Dus het Debug
niveau dat geregistreerd is voor Host.Triggers
overeenkomsten Host.Triggers.Queue
of Host.Triggers.Blob
. U kunt 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 Default
waarde bij het bepalen van 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
vergelijkt de huidige categorie met alle geregistreerde CategoryLevels
en kiest de langste overeenkomst. Dus het Debug
niveau dat geregistreerd is voor Host.Triggers
overeenkomsten Host.Triggers.Queue
of Host.Triggers.Blob
. U kunt 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 afhankelijk is van de generieke .NET Core-host, is een aangepaste telemetriefactory niet langer 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;
U kunt de volgende aangepaste implementatie ITelemetryInitializer
gebruiken om uw eigen ITelemetry
exemplaar toe te voegen aan de standaardinstelling TelemetryConfiguration
.
internal class CustomTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
// Do something with telemetry.
}
}
Gebruik ConfigureServices
in de bouwer om een aangepaste instantie ITelemetryInitializer
toe te voegen aan de pijplijn.
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 code 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 TelemetryConfiguration
wordt samengesteld, worden alle geregistreerde typen ITelemetryInitializer
opgenomen. Zie Application Insights-API voor aangepaste gebeurtenissen en metrische gegevens voor meer informatie.
In versie 3.x hoeft u TelemetryClient
niet leeg te spoelen wanneer de host stopt. Het .NET Core-afhankelijkheidsinjectiesysteem ruimt automatisch het geregistreerde ApplicationInsightsLoggerProvider
exemplaar op, waarmee het TelemetryClient
wordt leeggemaakt.
Versie 2.x
In versie 2.x, het TelemetryClient
exemplaar dat intern is 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.
TelemetryClient
wordt gemaakt door een klasse die ITelemetryClientFactory
implementeert. Deze klasse is DefaultTelemetryClientFactory
standaard .
Als u een deel van de pijplijn van Application Insights wilt wijzigen, kunt u een eigen exemplaar van ITelemetryClientFactory
gebruiken. De host gebruikt vervolgens uw klasse om te bouwen TelemetryClient
. Deze code overschrijft DefaultTelemetryClientFactory
om een eigenschap van ServerTelemetryChannel
te wijzigen:
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. In dit scenario verzendt Applications Insights in bepaalde scenario's met grote volumes een geselecteerde subset telemetriegegevens naar de server.
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);
Verwante inhoud
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.