Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build, review, or migrate Azure Functions in .NET with correct execution model, isolated worker setup, bindings, DI, and Durable Functions patterns. USE FOR: working on Azure Functions in .NET; migrating from the in-process model to the isolated worker model; adding Durable Functions, bindings, or host configuration. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test,
.claude/skills/managedcode-azure-functions/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 96% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 51% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 486% | 0% |
| case-11 | ✓→✓ | = Same ✓ | 73% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 391% | 0% |
IOptions<T> for configurationILogger<T> for loggingcsharp// Program.cs var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); services.AddSingleton<IMyService, MyService>(); }) .Build(); host.Run();
csharppublic class HttpFunctions(ILogger<HttpFunctions> logger, IMyService myService) { [Function("GetItems")] public async Task<IActionResult> GetItems( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "items")] HttpRequest req) { logger.LogInformation("Processing GetItems request"); var items = await myService.GetItemsAsync(); return new OkObjectResult(items); } }
csharppublic class QueueFunctions(ILogger<QueueFunctions> logger, IOptions<ProcessingOptions> options) { [Function("ProcessMessage")] public async Task ProcessMessage( [QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string message) { logger.LogInformation("Processing message: {Message}", message); // Process with retry policy from options } }
csharp// Program.cs var host = new HostBuilder() .ConfigureFunctionsWebApplication(builder => { builder.UseMiddleware<ExceptionHandlingMiddleware>(); builder.UseMiddleware<CorrelationIdMiddleware>(); }) .Build(); // CorrelationIdMiddleware.cs public class CorrelationIdMiddleware : IFunctionsWorkerMiddleware { public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { var correlationId = context.Features.Get<IHttpRequestFeature>()?.Headers["X-Correlation-Id"] ?? Guid.NewGuid().ToString(); context.Items["CorrelationId"] = correlationId; await next(context); } }
csharp[Function(nameof(ChainOrchestrator))] public static async Task<string> ChainOrchestrator( [OrchestrationTrigger] TaskOrchestrationContext context) { var result1 = await context.CallActivityAsync<string>(nameof(Step1), "input"); var result2 = await context.CallActivityAsync<string>(nameof(Step2), result1); var result3 = await context.CallActivityAsync<string>(nameof(Step3), result2); return result3; } [Function(nameof(Step1))] public static string Step1([ActivityTrigger] string input) => $"Step1({input})"; [Function(nameof(Step2))] public static string Step2([ActivityTrigger] string input) => $"Step2({input})"; [Function(nameof(Step3))] public static string Step3([ActivityTrigger] string input) => $"Step3({input})";
csharp[Function(nameof(FanOutFanInOrchestrator))] public static async Task<int[]> FanOutFanInOrchestrator( [OrchestrationTrigger] TaskOrchestrationContext context) { var workItems = await context.CallActivityAsync<string[]>(nameof(GetWorkItems), null); // Fan out - process all items in parallel var tasks = workItems.Select(item => context.CallActivityAsync<int>(nameof(ProcessWorkItem), item)); // Fan in - wait for all to complete var results = await Task.WhenAll(tasks); return results; } [Function(nameof(ProcessWorkItem))] public static int ProcessWorkItem([ActivityTrigger] string item) { // Process item and return result return item.Length; }
csharp[Function(nameof(ApprovalOrchestrator))] public static async Task<string> ApprovalOrchestrator( [OrchestrationTrigger] TaskOrchestrationContext context) { var request = context.GetInput<ApprovalRequest>(); // Send notification await context.CallActivityAsync(nameof(SendApprovalRequest), request); // Wait for external event with timeout using var cts = new CancellationTokenSource(); var approvalTask = context.WaitForExternalEvent<bool>("ApprovalEvent"); var timeoutTask = context.CreateTimer(context.CurrentUtcDateTime.AddDays(7), cts.Token); var winner = await Task.WhenAny(approvalTask, timeoutTask); if (winner == approvalTask) { cts.Cancel(); return approvalTask.Result ? "Approved" : "Rejected"; } return "Timed out"; }
ILogger<T> and service interfaces for testability| Anti-Pattern | Why It's Bad | Better Approach | |--------------|--------------|-----------------| | Mixing in-process and isolated guidance | Incompatible APIs and patterns | Choose one model consistently | | Non-deterministic orchestrator code | Replay failures, stuck orchestrations | Use context.CurrentUtcDateTime, no I/O | | Large orchestrator inputs/outputs | History bloat, memory issues | Store large data in blob storage | | Shared task hub names | Message conflicts, stuck orchestrations | Use unique names per app | | Secrets in orchestrator history | Security risk, exposed in logs | Fetch secrets in activity functions | | Blocking calls in async functions | Thread pool exhaustion | Use await throughout | | Missing retry policies | Transient failures cause job loss | Configure retry in bindings or code | | Ignoring execution model migration | EOL November 2026 for in-process | Migrate to isolated worker model |
.NET 10+ apps cannot run on Linux Consumption plan.
Use Flex Consumption plan or App Service for .NET 10+.
.NET 9 is the last version supported on Linux Consumption.json{ "version": "2.0", "extensions": { "durableTask": { "hubName": "MyUniqueTaskHub", "maxConcurrentActivityFunctions": 10, "maxConcurrentOrchestratorFunctions": 5 } }, "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } } }
Other measured skills in the registry, with their headline benchmark lift.