MS Azure — зависимость проекта C# WebJob

Я новичок в Azure WJ. У меня есть 2 проекта в одном решении: фактический веб-сайт — проект 2 и веб-задание — проект 1. Единственная задача WJ — вызвать открытый метод из открытого класса проекта 2 в запланированное время.

При создании WJ классы и методы Проекта 2 — веб-сайт были добавлены в качестве ссылки на решение в Проект 1 — веб-задание для сделать их доступными.

У меня проблема:

Когда WebJob собирается, он компилирует все зависимости в данный момент времени. Когда окончательный ZIP-файл будет загружен на портал Azure WebJob, веб-задание будет выполняться с скомпилированной версией кода. Это означает, что любые новые изменения в Project 2 – веб-сайт не вступят в силу до тех пор, пока WJ не будет перестроен с обновленными зависимостями Project 2 – веб-сайт и архивом .zip. загружено.

Есть ли способ создать WJ (как проект 1), который вызывал бы определенный открытый метод из проекта 2 и не обращал бы внимания на изменения в проекте 2, пока присутствует вызываемый метод?

Пример:

Код веб-задания (проект 1):

namespace SecondProject
{
    class Program
    {
        static void Main()
        {
            var client = new WebClient();
            secondProjectMethod();
        }
    }
}

Код веб-сайта (проект 2):

namespace firstProject
{
    public class someClass
    {
        public void secondProjectMethod()
        {
            // I want to make any code changes I want inside this 
            // method anytime and the WbJob should not care
            // about these changes as long as this method name exist.
            // Because all it should care about is that it should
            // call this  method name.
        }
    }
}

person Milan    schedule 07.12.2015    source источник
comment
Поскольку вы используете веб-сайт, вы можете предоставить метод из Proj2 как API и заставить веб-задание вызывать API (вместо метода) через запланированный интервал времени. Таким образом, даже если вы измените метод в Proj2, пока открытый API вызывает обновленный метод, веб-задание будет независимым.   -  person Pratik Bhattacharya    schedule 08.12.2015
comment
Да, это кажется наиболее логичным решением. Хотелось бы, чтобы было больше примеров кода API. Спасибо.   -  person Milan    schedule 08.12.2015


Ответы (3)


Поскольку вы используете веб-сайт, вы можете предоставить метод из Proj2 как API и заставить веб-задание вызывать API (вместо метода) через запланированный интервал времени. Таким образом, даже если вы измените метод в Proj2, пока открытый API вызывает обновленный метод, веб-задание будет независимым.
Вы можете взглянуть на это ссылка для создания базового API.

person Pratik Bhattacharya    schedule 08.12.2015
comment
спасибо за эту ссылку, это именно то, что я был после. - person Milan; 10.12.2015

мне в голову приходят как минимум два варианта:

Варианты 1: ваш проект WJ не ссылается напрямую на ваш проект веб-сайта, вместо этого используйте отражение для загрузки dll веб-сайта во время выполнения. и используйте отражение для вызова функции, которую вы хотите вызвать (предположим, что подпись никогда не изменится)

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

Вариант 2: поскольку это веб-сайт, почему бы не предоставить функцию, которую вы хотите вызвать, как REST API, поэтому вашему WJ просто нужно сделать HTTP-вызов

person Xiaomin Wu    schedule 11.12.2015
comment
... да, это то, что я в итоге сделал, однако я не в восторге от использования HTTP-вызова в приложении, которое должно иметь возможность вызывать методы внутри. Не говоря уже о том, что это невозможно, но требуется больше, чем строка кода. - person Milan; 12.12.2015
comment
@Milan, если вы все еще хотите вызывать метод внутри, возможно, запустите еще одно веб-задание на стороне и посмотрите на файловую систему, если файл изменится, скопируйте dll из проекта вашего веб-сайта в ваш проект веб-задания. (но независимо от того, каким путем вы пойдете, это будет не просто одна строка кода.) Я предложу подход HTTP-запроса, поскольку он проще, единственная проблема заключается в том, что REST API может быть обнаружен внешним пользователем. вы можете сделать дополнительную проверку, чтобы убедиться, что он звонит с той же машины в целях безопасности (если это вызывает беспокойство) - person Xiaomin Wu; 12.12.2015

Вопрос, похоже, не относится к конкретной веб-работе, но в любом случае...

Если вам нужно, чтобы два проекта были независимыми, вам не следует использовать ссылки на проекты.

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

В качестве альтернативы вы можете иметь папку для своих dll, например «Общие библиотеки», и ссылаться на Project2 из этого места вместо проекта, чтобы изолировать изменения в вашем веб-задании от вашей ссылки на проект.

person Aram    schedule 07.12.2015
comment
..да я вижу. Итак, когда вы говорите, что вопрос, похоже, не связан с веб-заданием ... вы имеете в виду, что это относится к любым межпроектным зависимостям? Если это так, то я должен уточнить, что все, что я пытаюсь сделать, — это создать простую и надежную запланированную задачу через Azure WebJob. То, о чем вы бы не подумали дважды, если вы работаете на выделенном сервере и у вас есть запланированные задачи. - person Milan; 07.12.2015
comment
Хорошо, я думаю, если ваша логика достаточно проста, возможно, вы можете просто продублировать код, и веб-задание будет иметь свою собственную версию кода... - person Aram; 08.12.2015
comment
что я имел в виду, так это то, что кажется, что нужно перепрыгнуть через множество обручей, чтобы создать простое запланированное задание. Разве нет простого решения? - person Milan; 08.12.2015
comment
... Да, и именно здесь я сталкиваюсь с этой проблемой, поскольку веб-сайт представляет собой довольно большой проект, и изменения вносятся постоянно. - person Milan; 08.12.2015
comment
В зависимости от задания вы можете использовать различные средства, такие как Планировщик Azure: azure.microsoft.com/en-us/documentation/articles/ или, может быть, даже автоматизация Azure... - person Aram; 08.12.2015
comment
Вы также можете использовать Azure Logic Apps azure.microsoft.com/en-us/documentation/articles/ - person Aram; 08.12.2015
comment
да, это сработает, но похоже, что это платные услуги - person Milan; 08.12.2015