-
Notifications
You must be signed in to change notification settings - Fork 483
Description
Using an appsetting placeholder value for any binding (as documented here) doesn't work for isolated functions hosted on a dedicated Linux App Service.
The placeholder works as expected for in-process functions and when using environment variables.
Investigative information
- Timestamp: 2026-03-18T12:56:18
- Function App version: 4.1047.100.0
- Invocation ID: 6e92eedc-2ae0-4738-b8ee-d87e995d481f (last working invocation before update from in-process to isolated)
- Region: West Europe
Repro steps
Create a function with the following syntax to load the timer CRON expression from the appsettings:
[Function("CleanupTrigger")]
public async Task RunAsync(
[TimerTrigger("%CleanupSchedule%")] TimerInfo timer,
CancellationToken cancellationToken) {}appsettings.json:
{
"CleanupSchedule": "0 0 18 * * 1-5"
}Program.cs:
Host.CreateDefaultBuilder(args)
.ConfigureFunctionsWebApplication()
.ConfigureServices(
services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
}).Build().Run();Deploy the function on a dedicated Linux App Service and attempt to start it.
Various other startup variants suggested on StackOverflow resulted in the same behavior.
The issue is also reproducable with various other triggers that accept string parameters.
Expected behavior
The function should be invoked every workday at 6 pm UTC.
Actual behavior
The function fails to start:
2026-03-18T12:56:30.646 [Error] Error indexing method 'Functions.CleanupTrigger'
Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException : Error indexing method 'Functions.CleanupTrigger' ---> System.InvalidOperationException : '%CleanupSchedule%' does not resolve to a value.
at Microsoft.Azure.WebJobs.Host.NameResolverExtensions.ResolveWholeStringCore(INameResolver resolver,String resolve,Boolean throwOnFailure) at /_/src/Microsoft.Azure.WebJobs.Host/NameResolverExtensions.cs : 96
at Microsoft.Azure.WebJobs.Extensions.Timers.TimerSchedule.Create(TimerTriggerAttribute attribute,INameResolver nameResolver,ILogger logger) at /_/src/WebJobs.Extensions/Extensions/Timers/Scheduling/TimerSchedule.cs : 67
at Microsoft.Azure.WebJobs.Extensions.Timers.Bindings.TimerTriggerAttributeBindingProvider.TryCreateAsync(TriggerBindingProviderContext context) at /_/src/WebJobs.Extensions/Extensions/Timers/Bindings/TimerTriggerAttributeBindingProvider.cs : 50
at async Microsoft.Azure.WebJobs.Host.Triggers.CompositeTriggerBindingProvider.TryCreateAsync(TriggerBindingProviderContext context) at /_/src/Microsoft.Azure.WebJobs.Host/Triggers/CompositeTriggerBindingProvider.cs : 20
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexer.IndexMethodAsyncCore(MethodInfo method,IFunctionIndexCollector index,CancellationToken cancellationToken) at /_/src/Microsoft.Azure.WebJobs.Host/Indexers/FunctionIndexer.cs : 172
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexer.IndexMethodAsync(MethodInfo method,IFunctionIndexCollector index,CancellationToken cancellationToken) at /_/src/Microsoft.Azure.WebJobs.Host/Indexers/FunctionIndexer.cs : 149
End of inner exception
at async Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexer.IndexMethodAsync(MethodInfo method,IFunctionIndexCollector index,CancellationToken cancellationToken) at /_/src/Microsoft.Azure.WebJobs.Host/Indexers/FunctionIndexer.cs : 157
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexer.IndexTypeAsync(Type type,IFunctionIndexCollector index,CancellationToken cancellationToken) at /_/src/Microsoft.Azure.WebJobs.Host/Indexers/FunctionIndexer.cs : 85
Known workarounds
Set the desired value in the function's environment variables (instead of the appsettings file).
Related information
- Programming language used: C#
- Bindings used: TimerTrigger