“值不能为空参数'logger'”-持久功能活动

问题描述

我具有以下活动功能

 [FunctionName("LoadSubscriptionAnalytics_Activity")]
        public static async Task<IActionResult> RunActivity([ActivityTrigger] ILogger log
        )
        {                              
            log.Loginformation("Activity function");
        }

Log.Loginformation失败,并出现错误:值不能为null。 (参数“记录器”)

记录器可用于我的协调器功能

 [FunctionName("LoadSubscriptionAnalytics_orchestrator")]
        public static async Task<List<Task<IActionResult>>> Runorchestrator(
            [orchestrationTrigger] IDurableorchestrationContext context,ILogger log)
        {
            var outputs = new List<Task<IActionResult>>();
         
            log.Loginformation("orchestrator function");
            
            outputs.Add(await context.CallActivityAsync<Task<IActionResult>>("LoadSubscriptionAnalytics_Activity",null));          
           
            return outputs;
        }

为什么此依赖项注入无效? 我正在使用带有.Net Core 3.1的Functions V2

解决方法

  • LogInformationILogger中定义的Microsoft.Extensions.Logging.Abstractions.dll的扩展方法。

  • 因为它是扩展方法而不是 real 实例方法,所以在调用它时,它与static方法调用相同,并且.NET运行时将不检查主题/实例引用是否为null-因此您不要得到NullReferenceException

    • 可能有用,实际上-我有自己的实用程序库,具有String.IsNullOrWhiteSpace语法上简洁的扩展方法:

      // Declaration:
      public static Boolean IsSet( this String str ) => !String.IsNullOrWhiteSpace( str ):
      
      // Usage:
      String x = null;
      Console.WriteLine( x.IsSet() ); // Prints "false" with no NullReferenceException
      
  • 因此,在您的情况下,运行log.LogInformation("Activity function");时,log的{​​{1}}参数为RunActivity

  • 我假设null是可选的-因此请使用log绕行它-或如果需要,则抛出自己的?.异常:

ArgumentNullException
  • 至于为什么[FunctionName("LoadSubscriptionAnalytics_Activity")] public static async Task<IActionResult> RunActivity( [ActivityTrigger] ILogger log ) { log?.LogInformation("Activity function"); } [FunctionName("LoadSubscriptionAnalytics_Activity")] public static async Task<IActionResult> RunActivity( [ActivityTrigger] ILogger log ) { if( log is null ) throw new ArgumentNullException( nameof(log) ); log.LogInformation("Activity function"); } 参数的参数首先是log-您是否在null中正确配置了DI容器?我承认我不太熟悉Azure耐用函数-但在.NET中,一般来说,DI仅针对构造函数而不是静态方法进行设置-尽管某些环境允许DI用于静态方法参数。
,

我设法解决它,不得不从协调器传递一个上下文对象-IDurableOrchestrationContext上下文,以便活动功能可以将其检测为参数。我的代码是:

编排器

[FunctionName("LoadSubscriptionAnalytics_Orchestrator")]
        public static async Task<List<Task<IActionResult>>> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,ILogger log)
        {
            var outputs = new List<Task<IActionResult>>();

            log = context.CreateReplaySafeLogger(log);
            log.LogInformation("Calling LoadSubscriptionAnalytics_Activity");
            outputs.Add(await context.CallActivityAsync<Task<IActionResult>>("LoadSubscriptionAnalytics_Activity",context));

            log.LogInformation("Done !");
           
            return outputs;
        }

活动

[FunctionName("LoadSubscriptionAnalytics_Activity")]
        public static async Task<IActionResult> RunActivity([ActivityTrigger] IDurableActivityContext activityContext,ILogger log
        )
        {
            //This works               
            log.LogInformation("Activity function");
        }

谢谢