{"id":18838231,"url":"https://github.com/jonahandersson/serverless-azure-durable-function-chaining-dotnet-template","last_synced_at":"2025-07-22T10:38:03.753Z","repository":{"id":55191344,"uuid":"420075847","full_name":"jonahandersson/serverless-azure-durable-function-chaining-dotnet-template","owner":"jonahandersson","description":"Starter template for a mini hands-on lab created with Azure Durable Functions with Function Chaining application pattern and with example integration with Azure Storage, Azure Service Bus, Sendgrid API and Twilio API ","archived":false,"fork":false,"pushed_at":"2022-11-29T20:48:58.000Z","size":90,"stargazers_count":13,"open_issues_count":3,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-14T05:30:16.728Z","etag":null,"topics":["azure","azure-functions","azure-storage","azurefunctions","dotnet","durable-functions","serverless"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonahandersson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-10-22T11:38:25.000Z","updated_at":"2025-01-04T04:33:44.000Z","dependencies_parsed_at":"2023-01-22T02:15:14.381Z","dependency_job_id":null,"html_url":"https://github.com/jonahandersson/serverless-azure-durable-function-chaining-dotnet-template","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/jonahandersson/serverless-azure-durable-function-chaining-dotnet-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonahandersson","download_url":"https://codeload.github.com/jonahandersson/serverless-azure-durable-function-chaining-dotnet-template/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266477152,"owners_count":23935390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure","azure-functions","azure-storage","azurefunctions","dotnet","durable-functions","serverless"],"created_at":"2024-11-08T02:38:26.651Z","updated_at":"2025-07-22T10:38:03.723Z","avatar_url":"https://github.com/jonahandersson.png","language":"C#","readme":"# Azure Durable Functions (Function Chaining Example) in C# .NET (Starter Template)\n##### Starter Template for Azure Serverless Durable Functions .NET Core \n*Author: \u003ca href=\"https://jonahandersson.tech/\" target=\"_blank\"\u003eJonah Andersson\u003c/a\u003e*\n\n#### DESCRIPTION:\n\nThis is a starter template for Serverless deveöpment with Azure Durable Functions available to those you wants to try it out.\nA hands-on lab created with Azure Durable Functions with [Function Chaining](https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-sequence?tabs=csharp) application pattern. \n\n\u003cimg src=\"https://docs.microsoft.com/en-us/azure/azure-functions/durable/media/durable-functions-concepts/function-chaining.png\" width=\"600\" alt=\"Function chaining - Azure Durable Functions\"\u003e\n\nThis template is prepared as starter template that allows you to develop Azure Functions (Durable Functions) serverless workflow with integration to other APIs such as Twilio API and Sendgrid API and Azure services - Azure Storage, ServiceBus etc. \n\n#### OVERVIEW OF WORKFLOW \n\n\u003cimg src=\"https://jonahsstorage.blob.core.windows.net/jcaphotos/jonahandersson-serverlessdemo-functionchaining.PNG\" width=\"600\"\u003e\nAzure Durable Functions - Function Chaining Example with Azure Service Bus, Twilio API, Sendgrid API and Azure BLOB Storage \n\n### EXPECTED RESULTS \n\n- Orchestration get trigged by an image or BLOB uploaded to the Azure Storage\n- Chain 1 - Sends queue message to Azure Service Bus\n- Chain 2 - Send SMS or make call using Twilio API\n- Chain 3 - Send email to configured email address using SendGrid API \n- Chain 4 - Lab Exercise to send to Azure Cosmos DB etc. (Guide: \u003ca href=\"https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-blob-triggered-function\" href=\"_blank\"\u003eHow to create Azure Cosmos DB Trigger\u003c/a\u003e)\n               \n#### PREREQUISITES AND LAB ENVIRONMENT SETUP \n\n* Basics concepts of \u003ca href=\"https://azure.microsoft.com/en-us/overview/serverless-computing/\" target=\"_blank\"\u003eAzure Serverless Computing\u003c/a\u003e, \u003ca href=\"https://azure.microsoft.com/en-us/services/functions/\" target=\"_blank\"\u003e Azure Functions\u003c/a\u003e and \u003ca href=\"https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview?tabs=csharp\" target=\"_blank\"\u003eDurable Functions\u003c/a\u003e  \u003cbr\u003e \n (*If you are a student of Forefront's Serverless course, great. Otherwise, check *Recommended Learning*  below*)\n* Microsoft Azure account - Private or Organization subscription account \u003cbr\u003e \n (*If you don't have any Azure Account, sign up https://azure.microsoft.com/en-us/free/*)\n* Latest version of [Visual Studio](https://visualstudio.microsoft.com/) or [VS Code](https://code.visualstudio.com/)\n* Azure Storage Explorer (https://azure.microsoft.com/en-us/features/storage-explorer/)\n* Programming Language C# .NET (You can code in other supported languages as well - see supported languages) \n* Install latest .NET Core 3.1 (LTS) or latest supported like .NET 6 https://dotnet.microsoft.com/download \n* Install [Azure Functions Core Tools](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=v3%2Cwindows%2Ccsharp%2Cportal%2Cbash%2Ckeda)\n* If you are using .NET Core 3.1 it will not  be supported by the end of 2022 and you need to upgrade to functions version 4.0 \n* Postman for HTTP Requests/Triggers\n* DEVELOPMENT LOCALLY use file local.settings.json with your own configuration strings, API keys \n\n#### local.settings.json (Local Development Only) \n*RECOMMENDATION:* Use [Azure Key Vault](https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references?tabs=azure-cli?WT.mc_id=AZ-MVP-5004251) and Managed Identities to secure your function application for Azure Durable Functions \n\n```yaml\n{\n   \"IsEncrypted\": false,\n    \"Values\": {\n    \"AzureWebJobsStorage\": \"\u003cPUT YOUR AZUREWEBJOBSSTORAGE CONNECTION STRING HERE\u003e\"\n    \"FUNCTIONS_WORKER_RUNTIME\": \"dotnet\",  \n    \"StorageConnectionString\": \"\u003cYOUR AZURE STORAGE CONNECTION STRING HERE\u003e\"\n    \"AzureServiceBusConnectionString\": \"\u003cPUT YOUR AZURE SERVICE BUS CONNECTION STRING HERE\u003e\",\n    \"ServiceBusQueueName\": \"blobstoragenotifierqueue\",\n    \"Twilio_SID\": \"\u003cYOUR TWILIO API SID\u003e\",\n    \"Twilio_Secret\": \"\u003cYOUR TWILIO API SECRET KEY\u003e\",\n    \"Admin_Email\": \"\u003cEMAIL ADDRESS TO RECEIVE EMAIL FOR SENDGRID EMAILS\",\n    \"Admin_Name\": \"\u003cYOUR NAME OR DUMMY NAME\u003e\",\n    \"Admin_Mobile\": \"\u003cYOUR TEST MOBILE WITH COUNTRY CODE TO RECEIVE TWILIO API SMS \u0026 CALL\u003e\",\n    \"Twilio_Verified_Number\": \"\u003cTHE REGISTERED TWILIO API TRIAL ACCOUNT MOBILE NUMBER HERE\u003e\",   \n    \"SendGridAPIKey\": \"\u003cYOUR SENDGRID API KEY HERE\u003e\",\n    \"CosmosDBEndPointUri\": \"\u003cYOUR AZURE COSMOS DB ENDPOINT URI HERE\",\n    \"CosmosDBKey\": \"\u003cYOUR AZURE COSMOS DB KEY HERE\u003e\"\n}\n\n```\n\n### REQUIRED AZURE SERVICES AND API INTEGRATIONS\n\n- Azure Storage Account for Azure Function App and a BLOB container to upload image files and for the Blob Storage Trigger \n   - \u003ca href=\"https://docs.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal\" target=\"_blank\"\u003eHow to create an Azure Storage Account\u003c/a\u003e\n   - \u003ca href=\"https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-container-create?tabs=dotnet\" target=\"_blank\"\u003eHow to create a Azure Blob Storage Container\u003c/a\u003e \n   - \u003ca href=\"https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-blob-triggered-function\" target=\"_blank\"\u003eHow to create a Azure Blob Storage Trigger\u003c/a\u003e \n \n- Azure Service Bus Namespace with a queue name that matches the queue name of your app configuration \n  - \u003ca href=\"https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues\" target=\"_blank\"\u003eHow to create a queue in an Azure Service Bus Namespace\u003c/a\u003e\n- Twilio API Account -  API Keys and Secret are used to code the logic to send SMS and make call from the function app  \n  - \u003ca href=\"https://www.twilio.com/docs/sms/quickstart/csharp-dotnet-framework\" target=\"_blank\"\u003eInstructions for TwilioAPI\u003c/a\u003e \n-  SendGrid API Account -  API Keys and Secret are used to code logic in sending email \n  - \u003ca href=\"https://docs.sendgrid.com/for-developers/sending-email/api-getting-started\" target=\"_blank\"\u003eInstructions for SendGrid\u003c/a\u003e \n\n\n### WHEN DEBUGGING AND DEVELOPING LOCALLY\n\nWhen developing Azure Functions locally using this project. You should see similar like this when it is finished.\nIt logs what is happening with your orchestration. You may also check on \n\n\u003cimg src=\"https://durablestoragefunctionss.blob.core.windows.net/photoscontainer/ServerlessLab_RunningFunctions%20Locally.PNG\" width=\"700\"\u003e\n\n### TALKS -  Azure Durable Functions at NDC Oslo Developer Conference 2021 \u003cbr\u003e\nClick on the image below to watch the recording of my talk for this session at the NDC Olso Conferene \u003cbr\u003e\n\u003cimg src=\"https://pbs.twimg.com/media/FMwNCHcXMAANGaj?format=jpg\u0026name=medium\" width=\"500\"\u003e \u003cbr\u003e\n\nWatch session on YouTube https://www.youtube.com/watch?v=C199S4R7cy8 \n\n####  RECOMMENDED LEARNING AND HANDS-ON RESOURCES \n \n- [Azure Durable Functions Documentation](https://docs.microsoft.com/en-us/azure/azure-functions/durable?WT.mc_id=AZ-MVP-5004251) \u003cbr\u003e\n- [Microsoft Learn](https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-create-first-csharp?pivots=code-editor-vscode?WT.mc_id=AZ-MVP-5004251)\u003cbr\u003e\n- [Azure Functions University on YouTube by Marc Duiker](https://www.youtube.com/channel/UCmoWqg6T-c8zEGm4sZdnwbA) \u003cbr\u003e\n- [Azure Functions University Lessons on GitHub by Marc Duiker and Community](https://github.com/marcduiker/azure-functions-university) \u003cbr\u003e\n- [My article about Azure Durable Functions at DEV Community Blog](https://dev.to/jonahandersson/azure-durable-functions-developing-serverless-stateful-workflow-4787)\u003cbr\u003e\n- [Serverless .NET Development with Azure Durable Functions by Jonah Andersson at Philippine .NET User Group (PHINUG)](https://www.youtube.com/watch?v=zByq3wB7fIQ\u0026t=31s)\u003cbr\u003e\n- [Azure Durable Functions Fundamentals at Azure User Group Sundsvall by Jonah Andersson](https://www.youtube.com/watch?v=fDej9n-kzNM)\u003cbr\u003e\n- [Azure Serverless Community Library](https://serverlesslibrary.net/)\u003cbr\u003e\n- [Azure Storage Account](https://docs.microsoft.com/en-us/azure/storage/common/storage-account-overview)\u003cbr\u003e\n- [SendGrid with Azure Functions](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-sendgrid?tabs=in-process%2Cfunctionsv2\u0026pivots=programming-language-csharp)\u003cbr\u003e\n\n  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonahandersson%2Fserverless-azure-durable-function-chaining-dotnet-template/lists"}