Azure WebJob에서이 오류가 발생합니다. 어떤 아이디어가 원인 일 수 있습니까?Microsoft.Azure.WebJobs.Host.FunctionInvocationException
저는 Azure WebJobs 콘솔 앱에서 DI를 처리하기 위해 Ninject를 사용하고 있습니다.
모든 서비스에 대해 Bind 문을 이미 설정했습니다. 서비스 호출 리포지토리. 리포지토리도 바인딩해야합니까?
WebJob을 실행하면 대기열에서 메시지를 가져 오지만 다음 메시지와 함께 실패합니다. 나는 이것이 Ninject와 관련이 있다고 생각한다. 기능 실행 중 예외 :
는 Microsoft.Azure.WebJobs.Host.FunctionInvocationException : 는 Microsoft.Azure.WebJobs.Host.FunctionInvocationException Functions.ProcessQueueMessage --->를 System.MissingMethodException는 없음 매개 변수가 생성자 정의되지 이 개체에 대한. System.RuntimeTypeHandle.CreateInstance에서 (RuntimeType이 유형 부울 publicOnly 부울 NOCHECK 부울 & canBeCached, RuntimeMethodHandleInternal & ctor에 부울 & bNeedSecurityCheck) System.RuntimeType.CreateInstanceSlow (부울 publicOnly에서, 부울 skipCheckThis 부울 fillCache, StackCrawlMark Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.Cre에서 System.Activator.CreateInstanceT에서 System.RuntimeType.CreateInstanceDefaultCtor에서 & stackMark) (부울 publicOnly, 부울 skipCheckThis 부울 fillCache, StackCrawlMark & stackMark) System.Runtime.CompilerServices.TaskAwaiter에서 Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory
1.Create() at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker
1.d__0.MoveNext에서 ateInstanceT () --- 예외가 발생 된 이전 위치에서 스택 추적의 끝 --- System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 .ThrowForNonSuccess (작업 작업) Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__31.MoveNext에서 (작업 작업)() --- 스택 추적의 끝 예외가 throw 된 이전 위치에서 --- 에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) 에서 System.Ru nt.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__2c.MoveNext() --- 예외가 throw 된 이전 위치에서 스택 추적 끝 ---에서 마이크로 소프트 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) (작업 작업). Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext() --- 내부 예외 스택 추적 끝 ---의 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()에서 발생합니다.Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext() --- 예외가 throw 된 이전 위치의 스택 추적 끝 --- 에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 ) 작업)에서 System.Runtime.CompilerServices.TaskAwaiter.class Program { static readonly IKernel Kernel = new StandardKernel(); static JobHostConfiguration config; static void Main() { BootStrapIoc(); var host = new JobHost(); // The following code ensures that the WebJob will be running continuously host.RunAndBlock(); } private static void BootStrapIoc() { Kernel.Load(Assembly.GetExecutingAssembly()); config = new JobHostConfiguration { JobActivator = new MyJobActivator(Kernel) }; } }
여기
MyJobActivator 입니다 : Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__1.MoveNext()public class BrmJobActivator : IJobActivator { private readonly IKernel _container; public MyJobActivator(IKernel container) { _container = container; } public T CreateInstance<T>() { return _container.Get<T>(); } }
에서 HandleNonSuccessAndDebuggerNotification (작업 작업) 다음은 프로그램 클래스의
다음은 Ninject 바인딩입니다.
public class NinjectBindings : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IConfiguration>().ToMethod(ctx => {
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
IConfigurationRoot Configuration = builder.Build();
return Configuration;
});
Bind<IAccountsServices>().To<AccountsServices>();
Bind<IBlogServices>().To<BlogServices>();
// Bind<IAccountsRepository>().To<AccountsRepository>();
// Bind<IBlogsRepository>().To<BlogsRepository>();
}
}
일반 레포에 바인딩합니까? 도움이된다면 Ninject (http://stackoverflow.com/documentation/azure-webjobs/2662/azure-webjobs-sdk/16701/dependency-injection-using-ninject#t=)를 사용하여 webjob을 부트 스트랩하는 문서를 작성했습니다. 201702012246130333719) – lopezbertoni
아니오, 일반적인 것이 아닙니다. 내가 만든 맞춤 repo입니다. 나는 Ninject를 사용하는 전체 목적이 하나씩 물건을 수작업으로 연결하는 것이 아니라고 생각한다. 그래서 서비스를 바인딩하고 있다고 생각한다. 인터페이스는 repos가 서비스 내에서 참조되기 때문에 충분해야한다. 그래서 Ninject가이를 선택할 수 있어야한다. 그러나 나는 그 질문을 게시했는지 확신 할 수 없었다. – Sam
의미가 있습니다. 각 repo를 하나씩 부트 스트랩해야한다고 생각합니다. – lopezbertoni