Я запускаю 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
Еще один важный момент: у меня есть файл 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;
}
}
}
Я очень ценю ваш ответ. Я только что обновил исходное сообщение, чтобы показать вам почти весь код, который у меня есть в этом WebJob. У меня было больше всего того, что вы предлагаете, но добавил недостающие части. Опять же, приложение работает локально нормально, но на Azure он взрывается с тем же сообщением об ошибке. – Sam
Возможно, это проблема с платформой .NET, потому что я нацелен на 4.6.2? Я не смог найти ответ о том, поддерживает ли WebJobs .NET 4.6.2 или нет. – Sam
Мой проект 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', чтобы проверить поддерживаемую версию. –