Веб-задание не работает в Azure, но локально работает нормально

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

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

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

Вот ошибка, которую я получаю на портале Azure в журналах веб-заданий:

P.S. Я создал WebJob в VS 2015 Cloud -> Azure WebJob. Кроме того, он нацелен на .NET Framework 4.6.2  введите описание изображения здесь

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

ОБНОВЛЕНИЕ: вот главное:

Вот MyJobActivator:

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

Вот мой класс Ninject Bindings

public class MyJobActivator : IJobActivator
{
   private readonly IKernel _container;

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

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

Класс Functions выглядит так:

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

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

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

person Sam    schedule 02.02.2017    source источник


Ответы (2)


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

Program.cs> Main

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

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 находится в корневом каталоге вашего проекта, и установите для параметра «Копировать в выходной каталог» значение Copy always.

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

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

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

person Bruce Chen    schedule 02.02.2017
comment
Может ли это быть проблемой с .NET framework, потому что я нацелен на 4.6.2? Мне не удалось найти ответ, поддерживают ли WebJobs .NET 4.6.2 или нет. - person Sam; 02.02.2017
comment
Мой проект WebJobs (_1_) также нацелен на .NET 4.6.2. Веб-приложение поддерживает эту версию, вы можете войти в систему с помощью KUDU, щелкните Консоль отладки› CMD, запустите эту команду _2_, чтобы проверить поддерживаемую версию. - person Sam; 02.02.2017
comment
Вы проверили, могут ли ваши веб-задания запускаться успешно? И эта ошибка выдается только когда новое сообщение ставится в очередь? После внесения изменений, если вы по-прежнему получаете ту же ошибку not NetCore, я предполагал, что вам нужно следовать этому руководство для cd D:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework ваших веб-заданий. - person Bruce Chen; 03.02.2017
comment
Я только что заставил его работать. Мне пришлось удалить веб-задание и опубликовать его заново. Поскольку я обновлял его так много раз, каким-то образом, должно быть, остались какие-то остатки от старых версий кода. Свежая публикация и предложенные здесь изменения устранили проблему! Это действительно расстраивало. Большое спасибо за Вашу помощь! - person Bruce Chen; 03.02.2017
comment
Просто добавил обновление к исходному сообщению, которое показывает, как выглядит мой класс Functions. Просто хочу понять это ясно. Я думаю, вы говорите, что класс Functions должен иметь конструктор без параметров, верно? Во-вторых, почему тогда он отлично работает локально? Если служба, которую я передаю конструктору, вызывает проблему, не должна ли она тоже выходить из строя локально? - person Sam; 03.02.2017

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

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

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

person EranG    schedule 02.02.2017
comment
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: исключение при выполнении функции: Functions.ProcessQueueMessage ---> System.MissingMethodException: для этого объекта не определен конструктор без параметров. на System.RuntimeTypeHandle.CreateInstance (типа RuntimeType, Boolean, Boolean publicOnly NOCHECK, Boolean & canBeCached, RuntimeMethodHandleInternal & CTOR, Boolean & bNeedSecurityCheck) в System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, булевой skipCheckThis, булевой fillCache, StackCrawlMark & ​​stackMark) в System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark и stackMark) в System.Activator.CreateInstanceT в Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance.Host.Fost.Executors.DefaultJobActivator.CreateInstance.Nost. ) --- Конец трассировки стека из предыдущего места, в котором возникло исключение --- в 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.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__2c.MoveNext () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (задача задачи) в Microsoft.Azure.WebJobs.oveNo.Executors.Function.d__Executor внутренняя трассировка стека исключений --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext () --- Конец трассировки стека из предыдущего местоположения в месте возникновения исключения --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft. Azure.WebJobs.Host.Executors.FunctionExecutor.d__1.MoveNext () - person Sam; 02.02.2017