4
votes

L'injection de dépendances ne fonctionne pas dans la fonction Azure locale

L'injection de dépendances ne parvient pas à s'initialiser pour moi même si cela semble fonctionner pour les membres de mon équipe. Pour tester cela, j'ai créé un projet simple qui inclut l'injection de dépendances (en utilisant ce guide ) et il échoue toujours.

FunctionApp3.csproj

[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] }

Startup.cs

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

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'.

Classe1.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}");
        }
    }
}

Fonction1.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; }
    }
}

La fonction démarre OK, avec le journal suivant:

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>();
        }
    }
}

Mais échoue ensuite lorsque je déclenche la fonction:

<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>

J'ai essayé de définir un point d'arrêt dans Startup.cs et il n'est pas touché. Si je n'utilise pas d'injections de dépendances, un point d'arrêt est atteint dans la fonction.

J'ai essayé d'utiliser netcoreapp2.2 et netcoreapp2.1 et j'ai également réparé Visual Studio. Veuillez aider.


7 commentaires

J'ai essayé de recréer ça, mais ça marche pour moi


Utilisez-vous les mêmes versions de netcoreapp2.2, Azure Functions Core Tools et Function Runtime?


Oui je suis sur le même


J'ai le même problème. Une résolution pour ça?


J'ai de nouveau passé la journée à essayer de comprendre cela et à essayer toutes les solutions affichées ici. Je n'arrive pas à le faire marcher. Je suis convaincu que cela est lié à mon environnement, puisque le code fonctionne pour HariHaran ci-dessus, et aussi pour mes collègues. Pourtant, j'ai désinstallé et réinstallé les SDK azure-functions-core-tools et dotnet, sans succès. Je suis vaincu.


@CasperAlant avez-vous réussi à résoudre ce problème?


Nan. J'ai finalement eu un nouvel ordinateur portable de travail et le même code a fonctionné sur le nouvel ordinateur portable.


4 Réponses :


2
votes

Vous devez utiliser le nom qualifié complet de la classe de démarrage dans l'attribut d'assembly.

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

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


0 commentaires

3
votes

Pour utiliser .NET Core version 2.2, vous devez référencer le package nuget pour Microsoft.NET.Sdk.Functions v1.0.29.

La version v1.0.26 n'atteignait pas le point de rupture pour moi.


0 commentaires

7
votes

entrez la description de l'image ici J'ai trouvé que l'attribut de démarrage cesse de fonctionner si le projet fait référence à l'identifiant des secrets de l'utilisateur, dans votre NameOfYourProject.csproj essayez de le supprimer.

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


0 commentaires

0
votes

J'ai eu ce problème après la mise à niveau de mes outils de base Azure Functions et après la mise à niveau des packages nuget, à savoir Microsoft.NET.Sdk.Functions et Microsoft.Azure.Functions.Extensions.

Je l'ai résolu en supprimant les dossiers obj et bin du projet et en recompilant.


0 commentaires