Azure functions &引用;值不能为null。(参数&x27;记录器&x27;)";-持久功能活动

Azure functions &引用;值不能为null。(参数&x27;记录器&x27;)";-持久功能活动,azure-functions,azure-durable-functions,Azure Functions,Azure Durable Functions,我有以下活动功能: [FunctionName("LoadSubscriptionAnalytics_Activity")] public static async Task<IActionResult> RunActivity([ActivityTrigger] ILogger log ) { log.LogInformation

我有以下活动功能:

 [FunctionName("LoadSubscriptionAnalytics_Activity")]
        public static async Task<IActionResult> RunActivity([ActivityTrigger] ILogger log
        )
        {                              
            log.LogInformation("Activity function");
        }
 [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;
        }
[FunctionName(“LoadSubscriptionAnalytics\u活动”)]
公共静态异步任务RunActivity([ActivityTrigger]ILogger日志
)
{                              
日志信息(“活动功能”);
}
Log.LogInformation失败,错误为:值不能为null。(参数“记录器”)

记录器在我的orchestrator功能中工作:

 [FunctionName("LoadSubscriptionAnalytics_Activity")]
        public static async Task<IActionResult> RunActivity([ActivityTrigger] ILogger log
        )
        {                              
            log.LogInformation("Activity function");
        }
 [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;
        }
[FunctionName(“LoadSubscriptionAnalytics\u Orchestrator”)]
公共静态异步任务RunOrchestrator(
[OrchestrationTrigger]IDurableCorchestrationContext,ILogger日志)
{
变量输出=新列表();
日志信息(“编排器功能”);
Add(wait context.CallActivityAsync(“LoadSubscriptionAnalytics_Activity”,null));
返回输出;
}
为什么这种依赖注入不起作用? 我正在使用带有.Net Core 3.1的V2函数
  • LogInformation
    ILogger
    的扩展方法,在
    Microsoft.Extensions.Logging.Abstractions.dll
    中定义

  • 因为它是一个扩展方法而不是一个实际实例方法,所以当调用它时,它与
    静态方法调用相同,并且.NET运行时不会检查subject/instance引用是否为
    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(“活动函数”)运行时,
    RunActivity
    log
    参数为
    null

  • 我假设
    log
    是可选的-因此使用
    ?。
    绕过它-或者如果需要,则抛出您自己的
    ArgumentNullException
    异常:

  • [FunctionName(“LoadSubscriptionAnalytics\u活动”)]
    公共静态异步任务RunActivity([ActivityTrigger]ILogger日志)
    {
    日志?.LogInformation(“活动功能”);
    }
    [函数名(“LoadSubscriptionAnalytics_活动”)]
    公共静态异步任务RunActivity([ActivityTrigger]ILogger日志)
    {
    如果(log为null)抛出新的ArgumentNullException(nameof(log));
    日志信息(“活动功能”);
    }
    
    • 至于为什么
      log
      参数的参数首先是
      null
      ,您是否在
      ConfigureServices
      中正确配置了DI容器?我承认我对Azure持久函数不太熟悉-但在.NET中,通常DI只为构造函数而不是静态方法设置-尽管有些环境允许对静态方法参数使用DI

    我设法解决了它,必须从orchestrator传递一个上下文对象-IDurableCorchestrationContext,以便activity函数可以将其作为参数检测。我的代码是:

    编曲者

    [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\u Orchestrator”)]
    公共静态异步任务RunOrchestrator(
    [OrchestrationTrigger]IDurableCorchestrationContext,ILogger日志)
    {
    变量输出=新列表();
    log=context.createReplaySafeloger(日志);
    log.LogInformation(“调用LoadSubscriptionAnalytics_活动”);
    Add(wait context.CallActivityAsync(“LoadSubscriptionAnalytics_Activity”,context));
    log.LogInformation(“完成!”);
    返回输出;
    }
    
    活动

    [FunctionName("LoadSubscriptionAnalytics_Activity")]
            public static async Task<IActionResult> RunActivity([ActivityTrigger] IDurableActivityContext activityContext, ILogger log
            )
            {
                //This works               
                log.LogInformation("Activity function");
            }
    
    [FunctionName(“LoadSubscriptionAnalytics\u活动”)]
    公共静态异步任务RunActivity([ActivityTrigger]IDurableActivityContext activityContext,ILogger日志
    )
    {
    //这很有效
    日志信息(“活动功能”);
    }
    

    谢谢

    异常的堆栈跟踪是什么?什么代码正在调用您的
    RunActivity
    方法并负责传递
    log:null