4
votes

Dependency Injection fails to initialize for me even though it seems to work for my team members. To test this, I've created a bare bones project that includes dependency injection (using this guide) and it still fails.

FunctionApp3.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

Startup.cs

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using FunctionApp3;
[assembly: FunctionsStartup(typeof(Startup))]
namespace FunctionApp3
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IClass1, Class1>();
        }
    }
}

Class1.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace FunctionApp3
{
    public interface IClass1
    {
        string Name { get; set; }
    }
    class Class1 : IClass1
    {
        public string Name { get; set; }
    }
}

Function1.cs

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace FunctionApp3
{
    public class Function1
    {
        public Function1(IClass1 class1)
        {
        }

        [FunctionName("Function1")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {

            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return (ActionResult)new OkObjectResult($"Hello, {name}");
        }
    }
}

The function starts up OK, with the following log:


                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

Azure Functions Core Tools (2.7.1505 Commit hash: eb8182995562240ca83dd0e0e3394586cf5fdfa3)
Function Runtime Version: 2.0.12590.0
[8/12/2019 6:38:30 AM] Building host: startup suppressed:False, configuration suppressed: False
[8/12/2019 6:38:31 AM] Initializing Host.
[8/12/2019 6:38:31 AM] Host initialization: ConsecutiveErrors=0, StartupCount=1
[8/12/2019 6:38:31 AM] LoggerFilterOptions
[8/12/2019 6:38:31 AM] {
[8/12/2019 6:38:31 AM]   "MinLevel": "None",
[8/12/2019 6:38:31 AM]   "Rules": [
[8/12/2019 6:38:31 AM]     {
[8/12/2019 6:38:31 AM]       "ProviderName": null,
[8/12/2019 6:38:31 AM]       "CategoryName": null,
[8/12/2019 6:38:31 AM]       "LogLevel": null,
[8/12/2019 6:38:31 AM]       "Filter": "<AddFilter>b__0"
[8/12/2019 6:38:31 AM]     },
[8/12/2019 6:38:31 AM]     {
[8/12/2019 6:38:31 AM]       "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
[8/12/2019 6:38:31 AM]       "CategoryName": null,
[8/12/2019 6:38:31 AM]       "LogLevel": "None",
[8/12/2019 6:38:31 AM]       "Filter": null
[8/12/2019 6:38:31 AM]     },
[8/12/2019 6:38:31 AM]     {
[8/12/2019 6:38:31 AM]       "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
[8/12/2019 6:38:31 AM]       "CategoryName": null,
[8/12/2019 6:38:31 AM]       "LogLevel": null,
[8/12/2019 6:38:31 AM]       "Filter": "<AddFilter>b__0"
[8/12/2019 6:38:31 AM]     }
[8/12/2019 6:38:31 AM]   ]
[8/12/2019 6:38:31 AM] }
[8/12/2019 6:38:31 AM] FunctionResultAggregatorOptions
[8/12/2019 6:38:31 AM] {
[8/12/2019 6:38:31 AM]   "BatchSize": 1000,
[8/12/2019 6:38:31 AM]   "FlushTimeout": "00:00:30",
[8/12/2019 6:38:31 AM]   "IsEnabled": true
[8/12/2019 6:38:31 AM] }
[8/12/2019 6:38:31 AM] SingletonOptions
[8/12/2019 6:38:31 AM] {
[8/12/2019 6:38:31 AM]   "LockPeriod": "00:00:15",
[8/12/2019 6:38:31 AM]   "ListenerLockPeriod": "00:00:15",
[8/12/2019 6:38:31 AM]   "LockAcquisitionTimeout": "10675199.02:48:05.4775807",
[8/12/2019 6:38:31 AM]   "LockAcquisitionPollingInterval": "00:00:05",
[8/12/2019 6:38:31 AM]   "ListenerLockRecoveryPollingInterval": "00:01:00"
[8/12/2019 6:38:31 AM] }
[8/12/2019 6:38:31 AM] Starting JobHost
[8/12/2019 6:38:31 AM] Starting Host (HostId=hatch0000299-876386545, InstanceId=59950e48-2bcb-4bdc-b803-555c91e0f068, Version=2.0.12590.0, ProcessId=31024, AppDomainId=1, InDebugMode=False, InDiagnosticMode=False, FunctionsExtensionVersion=)
[8/12/2019 6:38:31 AM] Loading functions metadata
[8/12/2019 6:38:32 AM] 1 functions loaded
[8/12/2019 6:38:32 AM] Generating 1 job function(s)
[8/12/2019 6:38:32 AM] Found the following functions:
[8/12/2019 6:38:32 AM] FunctionApp3.Function1.Run
[8/12/2019 6:38:32 AM]
[8/12/2019 6:38:32 AM] Host initialized (718ms)
[8/12/2019 6:38:32 AM] Host started (739ms)
[8/12/2019 6:38:32 AM] Job host started
Hosting environment: Production
Content root path: C:\Users\alan90960\source\repos\FunctionApp3\FunctionApp3\bin\Debug\netcoreapp2.2
Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.

Http Functions:

        Function1: [GET,POST] http://localhost:7071/api/Function1

[8/12/2019 6:38:37 AM] Host lock lease acquired by instance ID '000000000000000000000000BC4F0480'.

But then fails when I trigger the function:

[8/12/2019 6:38:39 AM] Executing HTTP request: {
[8/12/2019 6:38:39 AM]   "requestId": "9ba771f2-0d4d-4773-9d83-eef9ccb849c3",
[8/12/2019 6:38:39 AM]   "method": "GET",
[8/12/2019 6:38:39 AM]   "uri": "/api/Function1"
[8/12/2019 6:38:39 AM] }
[8/12/2019 6:38:40 AM] Executed 'Function1' (Failed, Id=64a341ca-b9ea-40f8-b158-fbef015d7da6)
[8/12/2019 6:38:40 AM] Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'FunctionApp3.IClass1' while attempting to activate 'FunctionApp3.Function1'.
[8/12/2019 6:38:40 AM] An unhandled host error has occurred.
[8/12/2019 6:38:40 AM] Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'FunctionApp3.IClass1' while attempting to activate 'FunctionApp3.Function1'.
[8/12/2019 6:38:40 AM] Executed HTTP request: {
[8/12/2019 6:38:40 AM]   "requestId": "9ba771f2-0d4d-4773-9d83-eef9ccb849c3",
[8/12/2019 6:38:40 AM]   "method": "GET",
[8/12/2019 6:38:41 AM]   "uri": "/api/Function1",
[8/12/2019 6:38:41 AM]   "identities": [
[8/12/2019 6:38:41 AM]     {
[8/12/2019 6:38:41 AM]       "type": "WebJobsAuthLevel",
[8/12/2019 6:38:41 AM]       "level": "Admin"
[8/12/2019 6:38:41 AM]     }
[8/12/2019 6:38:41 AM]   ],
[8/12/2019 6:38:41 AM]   "status": 500,
[8/12/2019 6:38:41 AM]   "duration": 1592
[8/12/2019 6:38:41 AM] }

I've tried setting a breakpoint in Startup.cs and it doesn't get hit. If I don't use dependency injections, a breakpoint does get hit in the function.

I've tried using netcoreapp2.2 and netcoreapp2.1 and also repaired Visual Studio. Please help.

4
I've tried re-creating this, but it works for meHariHaran
Are you running with the same versions of netcoreapp2.2, Azure Functions Core Tools, and Function Runtime?Casper Alant
Yes I am on the sameHariHaran
I am getting the same problem. Any resolution for this?Eric Grover
I've spent the day again trying to figure this out and trying all the solutions posted here. I can't get it to work. I'm confident this is related to my environment, since the code runs for HariHaran above, and also for my colleagues. Yet, I've uninstalled and reinstalled the azure-functions-core-tools and dotnet SDKs, with no success. I am defeated.Casper Alant

4 Answers

10
votes

enter image description hereI've found that startup attribute stops working if the project has reference to user secrets id, in your NameOfYourProject.csproj try removing it.

<UserSecretsId>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</UserSecretsId>
3
votes

For using .NET Core Version 2.2 you need to reference the nuget package for Microsoft.NET.Sdk.Functions v1.0.29.

Version v1.0.26 was not hitting the break point for me.

2
votes

You need to use the fully qualified name of the startup class in the assembly attribute.

[assembly: FunctionsStartup(typeof(FunctionsApp3.Startup))]

https://ikethe.dev/azure-functions-adds-dependency-injection/

0
votes

I got this problem after upgrading my Azure Functions Core Tools and after upgrading the nuget packages i.e. Microsoft.NET.Sdk.Functions and Microsoft.Azure.Functions.Extensions.

I resolved it by deleting the obj and bin folders on the project and recompiling.