Search code examples
azureazure-functions.net-8.0azure-functions-isolatedazure-durable-entity

Unable to receive DurableClient in dotnet-isolated Function For Durable Entity Processing


In a .NET 8.0 Azure Function V4, I am unable to acquire a valid instance of an IDurableClient. Why?

[Function("ProcessFunction")]
public async Task<IActionResult> 
    Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req, 
        [DurableClient] IDurableClient context)
{
    var mycontext = context; // Null
    // ...
}

Adding in a call to services.AddDurableClientFactory(); has no effect.


CSProject

<PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>FunctionApp.Durable.Isolated._2</RootNamespace>
</PropertyGroup>
<ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
...

Package References

"Microsoft.Azure.Functions.Worker" Version="1.22.0" />

"Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.2.0" />
"Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.3.1" />
"Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" />
"Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />


"Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.1.4" />
"Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.13.4" />
"Microsoft.DurableTask.Client" Version="1.2.4" />

Solution

  • In .net 8 Isolated one needs to use DurableTaskClient to get the Durable Client. To avoid namespace collisions with the non Isolated attribute, use the isolated specific package of Microsoft.Azure.Functions.Worker.Extensions.DurableTask.

    Below is the code which worked for me:

    Function1.cs:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    using Microsoft.DurableTask.Client;
    using Microsoft.Azure.Functions.Worker.Http;
    
    namespace FunctionApp184
    {
        public class Function1
        {
            private readonly ILogger<Function1> ri_log;
            public Function1(ILogger<Function1> logger)
            {
                ri_log = logger;
            }
            [Function("Function1")]
            public async Task<IActionResult> 
               Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData       
                 , [DurableClient] DurableTaskClient rc)
            {
                ri_log.LogInformation("Hello Rithwik Bojja, the function started");
                var rith_out = rc;
                ri_log.LogInformation($"The Client is : {rith_out}");
                return new OkObjectResult(rith_out);
            }
        }
    }
    

    My packages in csproj:

    <ItemGroup>
      <FrameworkReference Include="Microsoft.AspNetCore.App" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
      <PackageReference Include="Microsoft.DurableTask.Client" Version="1.2.4" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.1.0" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.1.1" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
    </ItemGroup>
    

    Output:

    enter image description here