2
votes

I have a project that is using dependency injection via constructor and MS Logging from ASP.NET Core with Azure Function 2.0, which was working under 2.0.12333 locally and on Azure, and now have two issues below:

1) Exception thrown for dependency injection via constructor, which was working before.

2) Logging is no longer writing to a text file, which was working before.

Below is a sample code that demos the issue 1 above.

1) Exception thrown for dependency injection via constructor

Excepton below followed by sample code:

2019-03-15T01:28:45.311 [Error] Executed 'Test' (Failed, Id=6bdb0e8e-2353-4ed2-83ce-2a5288fd124d)
System.InvalidOperationException : Unable to resolve service for type 'ICar' while attempting to activate 'TestFunctions'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)
   at lambda_method(Closure ,IServiceProvider ,Object[] )
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IServiceProvider serviceProvider) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 42
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 32
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.<>c__DisplayClass1_1.<.ctor>b__0(IFunctionInstanceEx i) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 20
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.Create(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 26
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.CreateInstance(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs : 44
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ParameterHelper.Initialize() at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 845
   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.TryExecuteAsyncCore(IFunctionInstanceEx functionInstance,CancellationToken cancellationToken) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 116

Sample code below:

 public class TestFunctions
    {
        private readonly ICar _car;
        private readonly ILogger _log;
        private const string RouteTemplate = "";

        public TestFunctions(
            ICar car, 
            ILoggerFactory loggerFactor)
        {
            _car = car;
            _log = loggerFactor.CreateLogger<TestFunctions>();

        }

        [FunctionName(nameof(Test))]
        public IActionResult Test(
            [HttpTrigger(AuthorizationLevel.Anonymous,"Get","post", Route = RouteTemplate + nameof(Test))]
            HttpRequest httpRequest, ExecutionContext context)
        {
            _log.LogInformation($"{nameof(Test)} started processing the request.");
            return new ContentResult { StatusCode = 200, Content = $"OK" };
        }

    }

    public interface ICar
    {
        string Name { get; }
    }

    public class Car : ICar
    {
        public string Name { get => "car name"; }
    }

[assembly: WebJobsStartup(typeof(WebJobsStartup))]
    public class WebJobsStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            builder.Services.AddHttpClient();
            builder.Services.AddSingleton<ICar, Car>();
            builder.Services.AddLogging();            


        }
    }

host.json

{
  "version": "2.0",
  "extensions": {
    "http": {
      "routePrefix": "api/v1"
    }
  },
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information"
    }

  }
}

2) Logging is no longer writing to a text file

When dependency injection via constructor, TestFunctions, is removed, the Test method is invoked. However, the logging within the Test method is not writing content to file.

Again, both DI and logging were working before.

 public TestFunctions(
            //ICar car, 
            ILoggerFactory loggerFactor)
        {}

LogInformation within Test method

_log.LogInformation($"{nameof(Test)} started processing the request.");

the logging within the Test method is not writing content to file.

2019-03-15T01:34:56.360 [Information] Initializing Host. 2019-03-15T01:34:56.371 [Information] Host initialization: ConsecutiveErrors=0, StartupCount=1 2019-03-15T01:34:56.440 [Information] ApplicationInsightsLoggerOptions {   "SamplingSettings": {
    "EvaluationInterval": "00:00:15",
    "InitialSamplingPercentage": 100.0,
    "MaxSamplingPercentage": 100.0,
    "MaxTelemetryItemsPerSecond": 5.0,
    "MinSamplingPercentage": 0.1,
    "MovingAverageRatio": 0.25,
    "SamplingPercentageDecreaseTimeout": "00:02:00",
    "SamplingPercentageIncreaseTimeout": "00:15:00"   },   "SnapshotConfiguration": null } 2019-03-15T01:34:56.441 [Information] LoggerFilterOptions {   "MinLevel": "None",   "Rules": [
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": "Information",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": "None",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider",
      "CategoryName": null,
      "LogLevel": "Trace",
      "Filter": null
    }   ] } 2019-03-15T01:34:56.441 [Information] LoggerFilterOptions {   "MinLevel": "None",   "Rules": [
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": "Information",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": "None",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider",
      "CategoryName": null,
      "LogLevel": "Trace",
      "Filter": null
    }   ] } 
2019-03-15T01:34:56.441 [Information] FunctionResultAggregatorOptions
{
  "BatchSize": 1000,
  "FlushTimeout": "00:00:30",
  "IsEnabled": true
}
2019-03-15T01:34:56.441 [Information] SingletonOptions
{
  "LockPeriod": "00:00:15",
  "ListenerLockPeriod": "00:00:15",
  "LockAcquisitionTimeout": "10675199.02:48:05.4775807",
  "LockAcquisitionPollingInterval": "00:00:05",
  "ListenerLockRecoveryPollingInterval": "00:01:00"
}
2019-03-15T01:34:56.448 [Information] Starting JobHost
2019-03-15T01:34:56.451 [Information] Starting Host (HostId=My-azureportal, InstanceId=id, Version=2.0.12353.0, ProcessId=5772, AppDomainId=1, InDebugMode=True, InDiagnosticMode=False, FunctionsExtensionVersion=~2)
2019-03-15T01:34:56.488 [Information] Loading functions metadata
2019-03-15T01:34:56.645 [Information] 1 functions loaded
2019-03-15T01:34:56.810 [Information] Generating 1 job function(s)
2019-03-15T01:34:56.868 [Information] Found the following functions:
TestFunctions.Test
2019-03-15T01:34:56.868 [Information] Host initialized (410ms)
2019-03-15T01:34:56.877 [Information] Host started (418ms)
2019-03-15T01:34:56.877 [Information] Job host started
2019-03-15T01:34:57.324 [Information] Executing 'Test' (Reason='This function was programmatically called via the host APIs.', Id=my id)
2019-03-15T01:34:57.370 [Information] Executed 'Test' (Succeeded, Id=my id)
2019-03-15T01:35:02.019 [Information] Host lock lease acquired by instance ID 'id'.

VS 2017

Azure Functions 2.x

1

1 Answers

2
votes

To fix the runtime issue with local Azure Functions, see Setting Azure Functions Runtime Version for local dev with Visual Studio 2017

Solution

The current version of Azure Functions Runtime 2.0.12353 causes the issue.

https://github.com/Azure/azure-functions-host/releases

Other version like 2.0.12342.0 works

Under Functions App Settings, set below

FUNCTIONS_EXTENSION_VERSION = 2.0.12342.0