2017-02-01 6 views
-1

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) 
     }; 
    } 
} 

여기

public class BrmJobActivator : IJobActivator 
{ 
    private readonly IKernel _container; 

    public MyJobActivator(IKernel container) 
    { 
     _container = container; 
    } 

    public T CreateInstance<T>() 
    { 
     return _container.Get<T>(); 
    } 
} 
MyJobActivator

입니다 : Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__1.MoveNext()

에서 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>(); 
     } 
    } 
+0

일반 레포에 바인딩합니까? 도움이된다면 Ninject (http://stackoverflow.com/documentation/azure-webjobs/2662/azure-webjobs-sdk/16701/dependency-injection-using-ninject#t=)를 사용하여 webjob을 부트 스트랩하는 문서를 작성했습니다. 201702012246130333719) – lopezbertoni

+0

아니오, 일반적인 것이 아닙니다. 내가 만든 맞춤 repo입니다. 나는 Ninject를 사용하는 전체 목적이 하나씩 물건을 수작업으로 연결하는 것이 아니라고 생각한다. 그래서 서비스를 바인딩하고 있다고 생각한다. 인터페이스는 repos가 서비스 내에서 참조되기 때문에 충분해야한다. 그래서 Ninject가이를 선택할 수 있어야한다. 그러나 나는 그 질문을 게시했는지 확신 할 수 없었다. – Sam

+0

의미가 있습니다. 각 repo를 하나씩 부트 스트랩해야한다고 생각합니다. – lopezbertoni

답변

0

오류 메시지 "System.MissingMethodException: No parameterless constructor defined for this object"에 따르면 주 기능에서 JobHost를 초기화하는 매개 변수 구성이 누락 된 것으로 보입니다.

이 경우 주 기능에 다음 코드를 사용하십시오. 그것은 올바르게 작동합니다.

JobHost host = new JobHost(config) 

동안 JobHost 초기화하는 매개 변수 config하지 않고는 내가 같은 오류 메시지를 받았습니다.

IKernel Kernel = new StandardKernel(); 
Kernel.Load(Assembly.GetExecutingAssembly()); 
var config = new JobHostConfiguration 
{ 
     JobActivator = new MyJobActivator(Kernel) 
}; 
var host = new JobHost(config); 
host.RunAndBlock(); 

내가 코드 제공 및 변경 클래스 이름 와 데모를 만들 : 다음과 같은 코드를 변경, 주요 기능에

:

enter image description here

다음

내 세부 단계입니다 BrmJobActivator
to MyJobActivator. NinJect Bindings.cs로드 함수에서는 다음 코드를 그대로 사용하십시오.

Bind<IAccountsServices>().To<AccountsServices>(); 
    Bind<IBlogServices>().To<BlogServices>(); 

그러면 올바르게 작동합니다.

enter image description here

+0

Tom, 정말로 감사드립니다. 나는 당신이 옳다고 생각하고 나의 코드에서 당신이 제안하는 것을 가지고 있지만 Azure에서 여전히 똑같은 오류를 내고있다. 여기에 내 WebJob에있는 모든 코드를 게시 ... http://stackoverflow.com/questions/41995465/webjob-failing-on-azure-but-locally-running-fine – Sam