Create your first durable function in C#

Durable Functions is an extension of Azure Functions that lets you write stateful functions in a serverless environment. The extension manages state, checkpoints, and restarts for you.

In this article, you learn how to use the Visual Studio 2019 to locally create and test a "hello world" durable function. This function orchestrates and chains-together calls to other functions. You then publish the function code to Azure. These tools are available as part of the Azure development workload in Visual Studio 2019.

Running durable function in Azure


To complete this tutorial:

  • Install Visual Studio 2019. Make sure that the Azure development workload is also installed. Visual Studio 2017 also supports Durable Functions development, but the UI and steps differ.

  • Verify you have the Azure Storage Emulator installed and running.

If you don't have an Azure subscription, create a free account before you begin.

Create a function app project

The Azure Functions template creates a project that can be published to a function app in Azure. A function app lets you group functions as a logical unit for management, deployment, and sharing of resources.

  1. In Visual Studio, select New > Project from the File menu.

  2. In the Add a new project dialog, search for functions, choose the Azure Functions template, and select Next.

    New project dialog to create a function in Visual Studio

  3. Type a Project name for your project, and select OK. The project name must be valid as a C# namespace, so don't use underscores, hyphens, or any other nonalphanumeric characters.

  4. In Create a new Azure Functions Application, use the settings specified in the table that follows the image.

    Create a new Azure Functions Application dialog in Visual Studio

    Setting Suggested value Description
    Version Azure Functions 2.x
    (.NET Core)
    Creates a function project that uses the version 2.x runtime of Azure Functions, which supports .NET Core. Azure Functions 1.x supports the .NET Framework. For more information, see How to target Azure Functions runtime version.
    Template Empty Creates an empty function app.
    Storage account Storage Emulator A storage account is required for durable function state management.
  5. Select Create to create an empty function project. This project has the basic configuration files needed to run your functions.

Add functions to the app

The following steps use a template to create the durable function code in your project.

  1. Right-click the project in Visual Studio and select Add > New Azure Function.

    Add new function

  2. Verify Azure Function is selected from the add menu, type a name for your C# file, and then select Add.

  3. Select the Durable Functions Orchestration template and then select Ok

    Select durable template

A new durable function is added to the app. Open the new .cs file to view the contents. This durable function is a simple function chaining example with the following methods:

Method FunctionName Description
RunOrchestrator <file-name> Manages the durable orchestration. In this case, the orchestration starts, creates a list, and adds the result of three functions calls to the list. When the three function calls are complete, it returns the list.
SayHello <file-name>_Hello The function returns a hello. This is the function that contains the business logic that is being orchestrated.
HttpStart <file-name>_HttpStart An HTTP-triggered function that starts an instance of the orchestration and returns a check status response.

Now that you've created your function project and a durable function, you can test it on your local computer.

Test the function locally

Azure Functions Core Tools lets you run an Azure Functions project on your local development computer. You are prompted to install these tools the first time you start a function from Visual Studio.

  1. To test your function, press F5. If prompted, accept the request from Visual Studio to download and install Azure Functions Core (CLI) tools. You may also need to enable a firewall exception so that the tools can handle HTTP requests.

  2. Copy the URL of your function from the Azure Functions runtime output.

    Azure local runtime

  3. Paste the URL for the HTTP request into your browser's address bar and execute the request. The following shows the response in the browser to the local GET request returned by the function:

    Function localhost response in the browser

    The response is the initial result from the HTTP function letting us know the durable orchestration has started successfully. It is not yet the end result of the orchestration. The response includes a few useful URLs. For now, let's query the status of the orchestration.

  4. Copy the URL value for statusQueryGetUri and pasting it in the browser's address bar and execute the request.

    The request will query the orchestration instance for the status. You should get an eventual response that looks like the following. This shows us the instance has completed, and includes the outputs or results of the durable function.

        "instanceId": "d495cb0ac10d4e13b22729c37e335190",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "Hello Tokyo!",
            "Hello Seattle!",
            "Hello London!"
        "createdTime": "2018-11-08T07:07:40Z",
        "lastUpdatedTime": "2018-11-08T07:07:52Z"
  5. To stop debugging, press Shift + F5.

After you have verified that the function runs correctly on your local computer, it's time to publish the project to Azure.

Publish the project to Azure

You must have a function app in your Azure subscription before you can publish your project. You can create a function app right from Visual Studio.

  1. In Solution Explorer, right-click the project and select Publish.

  2. In the Pick a publish target dialog, use the publish options as specified in the table below the image:

    Pick a publish target

    Option Description
    Azure Functions Consumption plan When you publish your project to a function app that runs in a Consumption plan, you only pay for executions of your functions app. Other hosting plans incur higher costs. To learn more, see Azure Functions scale and hosting.
    Create new A new function app, with related resources, is created in Azure. When you choose Select Existing, all files in the existing function app in Azure are overwritten by files from the local project. Only use this option when republishing updates to an existing function app.
    Run from package file Your function app is deployed using Zip Deploy with Run-From-Package mode enabled. This is the recommended way of running your functions, which results in better performance. When not using this option, make sure to stop your function app project from running locally before you publish to Azure.
  3. Select Publish. If you haven't already signed-in to your Azure account from Visual Studio, select Sign-in. You can also create a free Azure account.

  4. In the App Service: Create new dialog, use the Hosting settings as specified in the table below the image:

    Create App Service dialog

    Setting Suggested value Description
    Name Globally unique name Name that uniquely identifies your new function app. Valid characters are a-z, 0-9, and -.
    Subscription Choose your subscription The Azure subscription to use.
    Resource Group myResourceGroup Name of the resource group in which to create your function app. Choose New to create a new resource group.
    Hosting Plan Consumption plan Make sure to choose the Consumption under Size after you select New to create a serverless plan. Also, choose a Location in a region near you or near other services your functions access. When you run in a plan other than Consumption, you must manage the scaling of your function app.
    Azure Storage General-purpose storage account An Azure storage account is required by the Functions runtime. Select New to create a general-purpose storage account. You can also use an existing account that meets the storage account requirements.
  5. Select Create to create a function app and related resources in Azure with these settings and deploy your function project code.

  6. After the deployment is complete, make a note of the Site URL value, which is the address of your function app in Azure.

    Publish success message

Test your function in Azure

  1. Copy the base URL of the function app from the Publish profile page. Replace the localhost:port portion of the URL you used when testing the function locally with the new base URL.

    The URL that calls your durable function HTTP trigger should be in the following format:

  2. Paste this new URL for the HTTP request into your browser's address bar. You should get the same status response as before when using the published app.

Next steps

You have used Visual Studio to create and publish a C# durable function app.