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
中正确配置了DI容器?我承认我对Azure持久函数不太熟悉-但在.NET中,通常DI只为构造函数而不是静态方法设置-尽管有些环境允许对静态方法参数使用DIConfigureServices
[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
?