Postpartum-genushyacinthus29/dotnet-skills/skills/dotnet-azure-functions/SKILL.md
dotnet-azure-functions
Build, review, or migrate Azure Functions in .NET with correct execution model, isolated worker setup, bindings, DI, and Durable Functions patterns.
- Source repository stars
- 9
- Declared platforms
- 0
- Static risk flags
- 0
- Last source update
- 2026-08-23
- Source checked
- 2026-08-25
Decision brief
What it does: where it fits
Build, review, or migrate Azure Functions in . NET with correct execution model, isolated worker setup, bindings, DI, and Durable Functions patterns.
Not for
- Tasks that require unconfirmed production actions or broad system permissions.
- Environments where the pinned source and install steps cannot be inspected.
Compatibility matrix
Platform support, with evidence labels
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
Inspect first. Install second.
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-azure-functions"Inspect the Agent Skill "dotnet-azure-functions" from https://github.com/Postpartum-genushyacinthus29/dotnet-skills/blob/f9c1a213bc25d95641adc3a59f8048cb5656741c/skills/dotnet-azure-functions/SKILL.md at commit f9c1a213bc25d95641adc3a59f8048cb5656741c. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
What the source asks the agent to do
- 01
Workflow
1. Use isolated worker model for all new work: - In-process model reaches end of support on November 10, 2026 - Runtime v1.x ends support on September 14, 2026 - Target .NET 8+ for longest support window
Use isolated worker model for all new work:In-process model reaches end of support on November 10, 2026Runtime v1.x ends support on September 14, 2026 - 02
Isolated Worker Model Setup
Review the “Isolated Worker Model Setup” section in the pinned source before continuing.
Review and apply the “Isolated Worker Model Setup” source section. - 03
Trigger On
working on Azure Functions in .NET
working on Azure Functions in .NETmigrating from the in-process model to the isolated worker modeladding Durable Functions, bindings, or host configuration - 04
Documentation
Guide for running C Azure Functions in an isolated worker process
Guide for running C Azure Functions in an isolated worker processDifferences between in-process and isolated worker processMigrate C app from in-process to isolated worker model - 05
Basic Function with DI
Review the “Basic Function with DI” section in the pinned source before continuing.
Review and apply the “Basic Function with DI” source section.
Permission review
Static risk signals and limitations
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
Why each signal appears
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 97/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 9 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Provenance and original SKILL.md
- Repository
- Postpartum-genushyacinthus29/dotnet-skills
- Skill path
- skills/dotnet-azure-functions/SKILL.md
- Commit
- f9c1a213bc25d95641adc3a59f8048cb5656741c
- License
- MIT
- Collected
- 2026-08-25
- Default branch
- main
View the original SKILL.md
Azure Functions for .NET
Trigger On
- working on Azure Functions in .NET
- migrating from the in-process model to the isolated worker model
- adding Durable Functions, bindings, or host configuration
Documentation
- Guide for running C# Azure Functions in an isolated worker process
- Differences between in-process and isolated worker process
- Migrate C# app from in-process to isolated worker model
- Durable Functions overview
- Durable Functions best practices and diagnostic tools
References
- Patterns - Isolated worker patterns, Durable Functions patterns, advanced binding patterns
- Anti-Patterns - Common Azure Functions mistakes and how to avoid them
Workflow
-
Use isolated worker model for all new work:
- In-process model reaches end of support on November 10, 2026
- Runtime v1.x ends support on September 14, 2026
- Target .NET 8+ for longest support window
-
Detect current project shape:
- Target framework and runtime version
- Worker model (isolated vs in-process)
- Binding packages and host configuration
-
Use standard .NET patterns in isolated model:
- Normal dependency injection
- Middleware pipeline
IOptions<T>for configurationILogger<T>for logging
-
For Durable Functions:
- Validate orchestration determinism constraints
- Handle replay behavior correctly
- Use typed activity patterns
-
Verify both local and deployment behavior.
Isolated Worker Model Setup
Basic Function with DI
// Program.cs
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.AddSingleton<IMyService, MyService>();
})
.Build();
host.Run();
HTTP Trigger Function
public 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);
}
}
Queue Trigger with Options
public 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
}
}
Middleware Pattern
Custom Middleware
// 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);
}
}
Durable Functions Patterns
Function Chaining
[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})";
Fan-Out/Fan-In
[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;
}
Human Interaction Pattern
[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";
}
Best Practices
- Use isolated worker model for new development - Full .NET ecosystem access, middleware support, and longer support lifecycle
- Inject dependencies via constructor - Use
ILogger<T>and service interfaces for testability - Keep orchestrator code deterministic - No I/O, random, DateTime.Now, or Guid.NewGuid() in orchestrators
- Handle sensitive data in activities - Fetch secrets from Key Vault in activity functions, never in orchestrators
- Use unique task hub names - Prevent accidental sharing when multiple apps use the same storage
- Avoid large inputs/outputs - Serialize to blob storage for large payloads to prevent history bloat
- Configure concurrency limits - Set appropriate limits in host.json for resource-intensive functions
- Keep SDK and extensions updated - Latest versions include performance improvements and bug fixes
Anti-Patterns to Avoid
| 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 |
Deployment Considerations
Linux Consumption Plan Limitations
.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.
host.json Configuration
{
"version": "2.0",
"extensions": {
"durableTask": {
"hubName": "MyUniqueTaskHub",
"maxConcurrentActivityFunctions": 10,
"maxConcurrentOrchestratorFunctions": 5
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
}
}
Deliver
- correct Functions project setup for the isolated worker model
- clear binding and host configuration
- middleware for cross-cutting concerns
- Durable Functions with proper orchestration patterns
- migration-safe guidance when upgrading execution models
Validate
- execution model guidance is consistent (isolated only for new work)
- orchestrator code is deterministic
- bindings and host settings match the target runtime
- large payloads are externalized to blob storage
- retry policies are configured for transient failures
- local and deployment behavior are both verified
Frequently asked questions
What to verify before installation and use
What does the dotnet-azure-functions source document cover?
Build, review, or migrate Azure Functions in . NET with correct execution model, isolated worker setup, bindings, DI, and Durable Functions patterns.
How do I install dotnet-azure-functions?
The source record exposes this install command: npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-azure-functions". Inspect the command and pinned source before running it.
Alternatives
Compare before choosing
Postpartum-genushyacinthus29/dotnet-skills
dotnet-worker-services
Build long-running .NET background services with `BackgroundService`, Generic Host, graceful shutdown, configuration, logging, and deployment patterns suited to workers and daemons.
vasilyu1983/AI-Agents-public
research-git
Scans public GitHub repos for agent skills, dev practices, and code patterns. Use when enriching skills, setting team policy, or researching a build domain.
huggingface/skills
huggingface-lora-space-builder
Build and publish a Gradio demo on Hugging Face Spaces for a user-provided LoRA. Use when someone asks to create, generate, ship, or publish a Space, demo, Gradio app, or playground for a LoRA — including LoRAs for Qwen-Image, Qwen-Image-Edit, LTX-Video, Wan, FLUX, SDXL, or other diffusion base models. Also triggers when someone describes a LoRA they trained or hosts on the Hub and wants to share it. Covers picking the right base pipeline and `diffusers` inference recipe, designing a UI tailored
open-edge-platform/edge-ai-libraries
chatqna-helm-deploy
Deploy Chat Question-and-Answer Core to Kubernetes using Helm (OpenVINO CPU, OpenVINO GPU, or Ollama), including values.yaml configuration, helm install/upgrade, deployment verification, uninstall, and translation from Docker Compose setup_env.sh variables into Helm override values. Use this skill when the user says "deploy chatqna core to kubernetes", "helm install chatqna-core", "configure values.yaml", "convert compose config to helm", or "translate setup_env.sh to chart values".