Azure/azure-iot-sdk-csharp

[Technical Question] Develop and Deploy C# Azure Function, custom IoT Edge Module in .NET SDK 6

shivatyagi313 opened this issue · 10 comments

When I create a C# Azure Function IoT Edge Module, by default the target framework is netstandard2.0. The .csproj file of the module looks like this :

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AzureFunctionsVersion></AzureFunctionsVersion>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netcoreapp3.1|AnyCPU'">
    <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
    <TreatSpecificWarningsAsErrors />
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.EdgeHub" Version="1.0.7" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.13" />
    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.2.3" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

and the Dockerfile.amd64 looks like this :

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/azure-functions/dotnet:3.0

ENV AzureWebJobsScriptRoot=/app

ENV AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY --from=build-env /app/out /app

This azure function requires .net SDK 3 to Build and Push. The function triggers and works fine when a new message is received.

I want the module to be build in .NET 6, so in order to do that I manually changed the target framework of the module to .net 6 upgraded all the nuGet packages, updated the Dockerfile.amd64 to .net sdk 6, so the module was build successfully but now it is not triggering when a new message is received.

Is is possible to upgrade the C# Azure function IoT edge module to work in .net6 framework? if yes, then what could be a good approach to make the module work in .net 6, as the way I tried is not working and does not looks like a good approach.

@shivatyagi313 Is there any update on this?

From functions runtime docs I see that it needs an upgrade of the runtime to 4.x and there are some breaking changes between 3.x and 4.x
https://learn.microsoft.com/en-us/azure/azure-functions/functions-versions?tabs=v4&pivots=programming-language-csharp#languages

From functions runtime docs I see that it needs an upgrade of the runtime to 4.x and there are some breaking changes between 3.x and 4.x https://learn.microsoft.com/en-us/azure/azure-functions/functions-versions?tabs=v4&pivots=programming-language-csharp#languages

Yes @ancaantochi , I tried updating the runtime from 3.0 to 4.0, and I was able to build the module as well, but the problem is that, it is not triggering, on arrival of new messages, after changing the target framework and runtime.

@shivatyagi313 Is there any update on this?

No updates yet @smondalgithub. Can you please check on this?

@ancaantochi can you please review this?

@shivatyagi313
Did you also update the edgehub binding (Microsoft.Azure.WebJobs.Extensions.EdgeHub) ? That also needs to be updated as it uses Microsoft.Azure.WebJobs 3.0.36. I see that 4.x version is Microsoft.Azure.WebJobs.Extensions, this package includes Microsoft.Azure.WebJobs: https://learn.microsoft.com/en-us/azure/app-service/webjobs-sdk-get-started#install-webjobs-nuget-packages

Microsoft.Azure.WebJobs.Extensions.EdgeHub
@ancaantochi , thanks for the reply,
Yes I have updated all the nuget packages as per version 4.x. Still the modules are not triggering. Please help!

Do you have a fork where you made the changes, can you please send me a link? Also can you send the functions module logs?

Hi @ancaantochi ,
Thanks, but I don't see any errors when the modules are deployed and running, its just it doesn't trigger when it receives any new messages.

Only able to see the below in Iot hub -> module -> troubleshoot logs
Hosting environment: Production Content root path: /azure-functions-host Now listening on: http://[::]:80 Application started. Press Ctrl+C to shut down.

It sounds like this is more a question of edgehub behavior, so feel free to re-open this thread in that repo if you are still running into issues here.