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

Аз съм нов в Azure WJs. Имам 2 проекта в едно решение: действителният уебсайт - Проект 2 и WebJob - Проект 1. Единствената задача, която WJ има, е да извика открит метод от публичния клас на проект 2 по време на планираното време.

Когато WJ беше създаден, класовете и методите на Проект 2 - уебсайт бяха добавени като препратка към решение към Проект 1 - WebJob към направи ги достъпни.

Проблемът, който имам е:

Когато WebJob е изграден, той компилира всички зависимости в дадения момент. Когато окончателният .zip се качи в портала на Azure WebJob, уеб заданието ще се изпълни с версията на компилирания код. Това означава, че всички нови промени в Проект 2 - уебсайт не влизат в сила, докато WJ не бъде изграден отново с актуализираните зависимости на Проект 2 - уебсайт и повторното .zip качен.

Има ли начин да се създаде WJ (като проект 1), който да извика конкретен изложен метод от проект 2 и да не обръща внимание на промените в проект 2 докато извиканият метод е наличен?

Пример:

Код на WebJob (проект 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 и да накарате WebJob да извиква API (вместо метода) в планирания от вас интервал. Така че дори ако промените метода в Proj2, докато откритият API извиква актуализирания метод, WebJob ще бъде независим.   -  person Pratik Bhattacharya    schedule 08.12.2015
comment
Да, това изглежда най-логичното решение. Иска ми се да има повече примери за API код. Мерси.   -  person Milan    schedule 08.12.2015


Отговори (3)


Тъй като използвате уебсайт, можете да изложите метода от Proj2 като API и да накарате WebJob да извиква API (вместо метода) в планирания от вас интервал. Така че дори ако промените метода в Proj2, докато откритият API извиква актуализирания метод, WebJob ще бъде независим.
Можете да погледнете това връзка за създаване на основен 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 няма да засегнат вашето WebJob до момента, в който публикувате нов 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 Scheduler: azure.microsoft.com/en-us/documentation/articles/ или може би дори Azure Automation ... - person Aram; 08.12.2015
comment
Може да можете да използвате и приложенията на Azure Logic azure.microsoft.com/en-us/documentation/articles/ - person Aram; 08.12.2015
comment
да, това ще свърши работа, но изглежда, че това са платени услуги - person Milan; 08.12.2015