2017-02-02 7 views
0

Я запускаю WebJob локально - все еще подключаюсь к той же службе хранения на Azure, но когда я публикую ее на Azure, она терпит неудачу.WebJob не работает на Azure, но локально работает Fine

Он также терпел неудачу локально с той же ошибкой, но я смог исправить ситуацию и отлично ее запустить на своей локальной машине для разработчиков. Любая идея, почему она может потерпеть неудачу на Azure ?.

Чтобы повторить этот вопрос, хотя он работает локально, он все еще подключается к той же очереди и учетной записи хранилища на Azure. Итак, единственное, что работает локально, это код.

Вот ошибка я получаю на Azure Portal под бревнами WebJob:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Исключение при выполнении функции : Functions.ProcessQueueMessage ---> System.MissingMethodException: для этого объекта не определен конструктор без параметров . на System.RuntimeTypeHandle.CreateInstance (типа RuntimeType, Boolean publicOnly, булева NOCHECK, булева & canBeCached, RuntimeMethodHandleInternal & т е р, булева & bNeedSecurityCheck) при System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, булевы skipCheckThis, булева fillCache, StackCrawlMark & stackMark) при System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Логическое skipCheckThis, булева fillCache, StackCrawlMark & stackMark) в System.Activator.CreateInstanceT на Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.Cre ateInstanceT в Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory 1.Create() at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker 1.d__0.MoveNext() --- Конец трассировки стека из предыдущего места, где был брошен исключение --- на System.Runtime.CompilerServices.TaskAwaiter .ThrowForNonSuccess (Целевая задача ) при System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Целевая задача ) при Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__31.MoveNext() --- Конец трассировки стека из предыдущего места, где было исключено исключение - на System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задача) на System.Ru ntime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача task) в Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__2c.MoveNext() --- Конец трассировки стека из предыдущего места, где было выбрано исключение --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задача) на System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задач) в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Task задача) на Microsoft. Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext() --- Конец внутренней трассировки стека исключений --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext() --- Конец трассировки стека из предыдущего места, где было выбрано исключение --- на System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задача) на Система.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Целевая задача ) при Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__1.MoveNext()

P.S. Я создал WebJob в VS 2015 Cloud -> Azure WebJob. Кроме того, он нацелен на .NET Framework 4.6.2 enter image description here

Еще один важный момент: у меня есть файл appsettings.json, содержащий некоторую информацию о настройке. Это находится в каталоге bin. Я читаю этот файл и получаю некоторые настройки, которые используются в моем коде. Когда я FTP'ed в каталог WebJobs, я вижу файл appsettings.json. Не уверен, что проблема может быть связана с этим.

UPDATE: Вот Main:

class Program 
{ 
    static readonly IKernel Kernel = new StandardKernel(); 
    static JobHostConfiguration config; 

    static void Main() 
    { 
     BootStrapIoc(); 

     var host = new JobHost(config); 
     host.RunAndBlock(); 
    } 

    private static void BootStrapIoc() 
    { 
     Kernel.Load(Assembly.GetExecutingAssembly()); 
     config = new JobHostConfiguration 
     { 
     JobActivator = new MyJobActivator(Kernel) 
     }; 
    } 
} 

Вот MyJobActivator:

public class MyJobActivator : IJobActivator 
{ 
    private readonly IKernel _container; 

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

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

Вот мой Ninject Наручники класс

public class NinjectBindings : Ninject.Modules.NinjectModule 
{ 
    IConfiguration Configuration; 

    public override void Load() 
    { 

     Bind<IConfiguration>().ToMethod(ctx => { 
      var builder = new ConfigurationBuilder(); 
      builder.SetBasePath(Directory.GetCurrentDirectory()); 
      builder.AddJsonFile("appsettings.json"); 
      Configuration = builder.Build(); 
       return Configuration; 
      }); 

     // Bind clients 
     var docDbClient = new Clients.DocumentDb.DocumentDbClient(Configuration); 

     // Bind Services 
     Bind<ISomeService>().To<SomeService>(); 

     // Bind Repositories 
     Bind<ISomeRepository>().To<SomeRepository>(); 
    } 
} 

Класс функции выглядит следующим образом:

public class Functions 
{ 
    private ISomeService _someService; 

    public Functions(ISomeService someService) 
    { 
     _someService = someService; 
    } 

    public async Task ProcessQueueMessage([QueueTrigger("my-queue")] MyMessageObject message, TextWriter log) 
    { 
     switch(message.typeId) 
     { 
     case MyEnum.TypeA: 
      _someService.FunctionA(message); 
      break; 
     case MyEnum.TypeB: 
      _someService.FunctionB(message); 
      break; 
     } 
    } 
} 

ответ

0

Microsoft.Azure.WebJobs.Host.FunctionInvocationExc eption: Исключение при выполнении функции: Functions.ProcessQueueMessage ---> System.MissingMethodException: для объекта нет конструктора без параметров.

Согласно вашему описанию, я протестировал эту проблему на своей стороне, и я мог столкнуться с той же ошибкой, что и на вашем коде. После некоторых испытаний я мог бы заставить его работать, как ожидалось, на моей стороне и в Лазуре. Вот некоторые возможные причины, вы можете обратиться к ним:

Program.cs> Главной

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

//Initializes a new instance of the Microsoft.Azure.WebJobs.JobHost class using the configuration provided. 
var host = new JobHost(config); 
host.RunAndBlock(); 

Для загрузки файла appsettings.json, вы можете настроить картограф следующим образом:

Bind<IConfiguration>().ToMethod(ctx => 
{ 
    var builder = new ConfigurationBuilder(); 

    //set base path to the current working directory of your application 
    builder.SetBasePath(Directory.GetCurrentDirectory()); 
    builder.AddJsonFile("appsettings.json"); 
    IConfigurationRoot Configuration = builder.Build(); 
    return Configuration; 
}); 

Примечание: Убедитесь, что appsettings.json находится под корневым каталогом вашего проекта и установите «Копировать в выходной каталог» как Copy always.

Мой результат теста:

+0

Я очень ценю ваш ответ. Я только что обновил исходное сообщение, чтобы показать вам почти весь код, который у меня есть в этом WebJob. У меня было больше всего того, что вы предлагаете, но добавил недостающие части. Опять же, приложение работает локально нормально, но на Azure он взрывается с тем же сообщением об ошибке. – Sam

+0

Возможно, это проблема с платформой .NET, потому что я нацелен на 4.6.2? Я не смог найти ответ о том, поддерживает ли WebJobs .NET 4.6.2 или нет. – Sam

+0

Мой проект WebJobs ('не NetCore') также предназначен для .NET 4.6.2. Веб-приложение поддерживает эту версию, вы можете войти в систему с помощью [KUDU] (https://blogs.msdn.microsoft.com/benjaminperkins/2014/03/24/using-kudu-with-windows-azure-web-sites/), нажмите «Отладка консоли> CMD», запустите эту команду 'cd D: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework', чтобы проверить поддерживаемую версию. –

0

Исключение вы получаете для

Нет без параметров конструктора, определенные для этого объекта

Объект реализует свой метод обработки очереди должен иметь конструктор без параметров, чтобы для JobHost, чтобы иметь возможность создать (извините, это лучший указатель, который я могу дать, не видя пример кода)

+0

Просто добавил обновление исходное сообщение, которое показывает, что мой класс функции выглядит следующим образом. Просто хочу понять это ясно. Я думаю, вы говорите, что класс функций должен иметь конструктор без параметров, это правильно? Во-вторых, почему он работает нормально локально? Если служба, которую я передаю конструктору, вызывает проблему, не следует ли ее локально не работать? – Sam