background image

Projektowanie systemu workflow przy 

użyciu narzędzia BizAgi Studio 

 

Część 5 

Stworzeni aplikacji zewnętrznej w 

ASP.NET 

 

Instytut Systemów Informatycznych, Wydział Cybernetyki, Wojskowa Akademia Techniczna  

Paweł Mieteo, Jarosław Koszela 

Spis treści 

Wprowadzenie .................................................................................................................................... 2 

Stworzeni aplikacji zewnętrznej w ASP.NET ........................................................................................ 2 

 

 

 

background image

Wprowadzenie 

 

 W dzisiejszych czasach jedną z podstawowych funkcji każdego oprogramowania jest możliwośd 
integracji z systemami zewnętrznymi. BizAgi studio jest narzędziem, które posiada mechanizmy 
integracyjne. Po pierwsze posiada API w postaci WebService, które pozwala zdalnie koordynowad 
proces oraz daje możliwośd manipulowania danymi. Z drugiej strony aplikacja stworzona w BizAgi 
Studio pozwala wywoływad metody z zewnętrznych WebService’ów lub pozwala synchronizowad 
dane z zewnętrznymi bazami danych. 

 

Stworzeni aplikacji zewnętrznej w ASP.NET 

 

W celu stworzenia interakcji tworzonego procesu z systemem zewnętrznym zbudujemy namiastkę 
serwisu internetowego. Przyjmiemy, że aplikacja ta będzie dostarczała procesowi informacji o 
studencie oraz w aplikacji tej będzie możliwośd potwierdzenia wpłaty pieniędzy przez studenta.  

Na zadaniu „Pobranie informacji o studencie” BizAgi odwoła się do wystawionego serwisu i pobierze 
ilośd punktów ECTS studenta. Kolejnym punktem interakcji będzie wpłata pieniędzy. BizAgi po 
uaktywnieniu zdarzenia „Wpłynięcie pieniędzy” wyśle do serwisu zewnętrznego komunikat, że 
oczekuje na potwierdzenie wpłaty. W systemie internetowym zostanie zapisana informacja o 
oczekującym zdarzeniu, oraz zostanie zaimplementowana możliwośd potwierdzenia wpłaty. Tym 
razem to aplikacja zewnętrzna wywoła odpowiednią metodę na WebSerwice systemu workflow, tak 
aby zdalnie wywoład zdarzenie przejścia na kolejny krok procesu. 

Do stworzenia aplikacji internetowej użyjemy technologii ASP.NET. Będziemy posługiwad się 
Microsoft Visual Studio 2010 oraz bazą danych MS SQL. 

background image

 

Rysunek 1. Utworzenie nowego projektu 

W celu utworzenia nowego projektu wybieramy opcję File->New->Project… . 

 

 

 

background image

 

Rysunek 2. Wybranei typu projektu 

Naszym oczom pokaże się okno gdzie będziemy mogli wybrad typ projektu, nadad mu nazwę oraz 
wskazad lokalizację. Wybieramy ASP. NET Web Application, nazwę wpiszmy 
TutorialBizAgi.ExternalSystem oraz zostawmy domyślną lokalizację. W celu potwierdzenia wciskamy 
przycisk OK. 

VS(Visual Studio) utworzy nam domyślny szkielet aplikacji.  

Po prawej stronie mamy okienko o nazwie Solution Explorer, gdzie możemy przejrzed aktualne pliki 
projektu.  

 

background image

 

Rysunek 3. Konfiguracja serwera do uruchamiania aplikacji 

Do uruchamiania aplikacji możemy użyd serwera deweloperskiego, w tym celu na solution należy 
wybrad opcję właściwości(properties) i w zakładce Web zaznaczyd opcję „Use Visual Studio 
Development Server” oraz „Specific port”, co spowoduje, że nasz aplikacja za każdym razem będzie 
uruchamiała się na tym samym porcie. Jest to konieczne, ponieważ w BizAgi Studio musimy podad 
adres serwera, a więc nie może on się zmieniad. Po wprowadzeni zmian należy wcisnąd Carl+S, co 
zapisze ustawienia.  

W celu odpalenia aplikacji należy wcisnąd Ctrl+F5, Visual Studio automatycznie odpali serwer 
deweloperski pod zdefiniowanym portem oraz otworzy przeglądarkę internetową 
(

http://localhost:53229/

). 

 

Kolejnym krokiem jest utworzenie projektu, który będzie pełnił funkcję warstwy dostępu do danych. 
W tym celu w oknie Solution Explorer na węźle Solution wybieramy opcję Add->New Project… . 

background image

 

Rysunek 4. Dodanie nowego projektu do Solution 

 

 

Rysunek 5. Wybranie typu projektu 

Z listy projektów wybieramy Class Library oraz nadajemy nazwę 
TutorialBizAgi.ExternalSystem.Entities. 

Warstwę dostępu do danych zrealizujemy wykorzystując bibliotekę ORM Entity Framework.  

background image

 

Rysunek 6. Dodanie modelu danych 

W tym celu do nowo utworzonego projektu dodajemy element ADO.NET Entity Data Model nadając 
mu nazwę Model. VS uruchomi kreator tworzenia modelu. 

background image

 

Rysunek 7. Kreator tworzenia modelu danych 

Entity Framework daje nam możliwośd automatycznego utworzenia modelu na podstawie istniejącej 
bazy danych. Drugą możliwością jest utworzenie pustego modelu, ręczne zbudowanie struktury 
danych oraz wygenerowanie bazy danych na podstawie modelu. To drugie podejście nazywa się 
Model First i niego właśnie skorzystamy, a więc wybieramy opcję Empty model i wciskamy guzik 
Finish. 

DO przechowywania danych będziemy używad bazy danych MS SQL Server. Aby wygenerowad 
strukturę bazy danych musimy, uprzednio utworzyd pustą bazę na SQL serwerze. W tym celu 
otwórzmy okno Server Explorer(Główne menu VS->View->Server Explorer). 

background image

 

Rysunek 8. Solution Explorer - Utworzenie nowej bazy danych 

Na węźle Data Connections wybieramy opcję Create New SQL Server Database… . 

 

Rysunek 9. Konfiguracja połączenia oraz nadanie nazwy dla bazy 

Należy wskazad instancje SQL Serwera oraz podad sposób logowania. W moim przypadku SQL Serwer, 
który będzie używany jest instancją domyślną więc wystarczy że podam nazwę MOJEGO 
komputera(WDEVPMI).  Wybieram opcję autentykacji Windows Authentication oraz wpisuję nazwę 
bazy danych TutorialBizAgiDB. Po stworzeniu pustej bazy danych przystąpmy do zamodelowania 
struktury danych. Należy otworzyd plik Model.edmx, VS otworzy go w narzędziu do modelowania.  

 

 

background image

 

Rysunek 10. Model struktury danych 

 

Na nasze potrzeby dodamy do modelu encję student gdzie będzie przechowywana informacja o ilości 
punktów ECTS. Do studenta będzie przypisana dowolna ilośd opłat. Dodatkowo dodamy encję 
przedmiot, gdzie będzie lista przedmiotów, na które student będzie mógł zdawad ponownie. Tabela 
ta będzie podłączona do systemu work flow.  

 

 

Rysunek 11. Generacja skryptów tworzących bazę danych 

Po zamodelowaniu struktury danych korzystając z menu kontekstowego  wybieramy opcję „Generate 
Database from Model”. 

background image

 

Rysunek 12. Wybieranie połączenia do bazy danych 

Kreator tworzenia skryptu tworzącego poprosi o wybranie połączenia do bazy danych. Wybieramy 
uprzednio stworzoną bazę oraz zaznaczamy opcję „Save entity connection setting In App.Config as”.  

 

background image

 

Rysunek 13. Podgląd wygenerowanego skryptu 

W ostatnim kroku podajemy nazwę pliku, do którego zostanie zapisany skrypt DLL. NA tym samym 
oknie istnieje możliwośd zweryfikowania otrzymanego rezultatu. Po wciśnięciu przycisku Finish skrypt 
zostanie zapisany, a plik zostanie otwarty w VS. 

 

Rysunek 14. Uruchomienie skryptu DLL 

background image

Używając menu kontekstowego i opcji „Execute SQL”, należy uruchomid skrypt. 

 

Rysunek 15. Łączenie do bazy danych 

W oknie należy podad nazwę serwera oraz dane dostępu.  Po wciśnięciu przycisku Connect zostanie 
nawiązane połączenie oraz wykonany skrypt tworzący bazę danych. 

 

 

Rysunek 16. Definicja połączenia do bazy danych 

W projekcie Entities można znaleźd plik App.Config, w którym będzie zdefiniowane połączenie do 
bazy danych. Aby nasza aplikacja również używała takich danych konfiguracyjnych należy je 
skopiowad do apliku Web.Coinfig w głównym projekcie. 

Po przygotowaniu projektu pełniącego funkcję warstwy bazy danych, należy dołączyd go do projektu 
głównego. Takie połączenie nazywa się referencją.  

 

 

 

 

background image

 

 

 

 

 

 

Rysunek 17. Dodanie referencji 

W celu dodania referencji należy wybrad opcję „Add Reference” z menu kontekstowego na węźle 
References. 

 

 

Rysunek 18. Dodawanie referencji do projektu 

background image

Po uruchomieniu okna z dostępnymi elementami należy wybrad zakładkę Projects oraz wskazad 
projekt Entities i zatwierdzid przyciskiem OK. 

 

Rysunek 19. Dodanie referencji do biblioteki DLL 

.Net Fremework jest zbiorem bibliotek. Aby w projekcie głównym móc skorzystad z Entity 
Framework’a należy dodad referencje do biblioteki System.Data.Entity. W tym celu na oknie wyboru 
referencji należy przejśd na zakładkę .NET i wybrad odpowiednią bibliotekę. 

Nasza aplikacja musi dad możliwośd zdalnego uruchamiania metod, tak aby workflow mógł 
komunikowad się z nią. W tym celu zastosujemy technologii WebServices, która za pomocą protokołu 
komunikacyjnego http pozwala wywoływad zdalnie metody. Jest to metoda uniwersalna, mająca 
wsparcie praktycznie w każdym liczącym się środowisku programistyczny. 

background image

 

Rysunek 20. Dodanie nowego elementu do projektu 

Do projektu dodamy WebService, w tym celu na głównym węźle projektu posługując się menu 
kontekstowym wybieramy opcję Add->New Item… . 

background image

 

Rysunek 21.Wybór typu elementu 

Wybieramy typ elementu Web Service, nadajemy mu nazwę WebService i potwierdzamy wciskając 
przycisk Add. Do projektu doda się plik o nazwie WebService.asmx. Klikając dwukrotnie otworzymy 
plik implementujący metody web serwisu. Dodamy do niego następujące dwie metody: 

[

WebMethod

public

 

int

 PobierzPunktyEcts(

int

 numerIndeksu) 


    

int

? punktyEcts = 

null

    

using

 (Entities.

ModelContainer

 dbContext = 

new

 Entities.

ModelContainer

()) 

    { 
        punktyEcts = dbContext.Studenci.Where(s => s.NumerIndeksu == numerIndeksu) 
                .Select(s => (

int

?)s.PunktyEcts).FirstOrDefault(); 

 
        

if

 (!punktyEcts.HasValue) 

        { 
            

throw

 

new

 

Exception

(

"Nie istnieje student o podanym numerze indeksu"

); 

        } 
 
    } 
    

return

 punktyEcts.Value; 


 
 
[

WebMethod

public

 

void

 DodajNowaOplate(

int

 caseId, 

int

 numerIndeksu) 


    

using

 (Entities.

ModelContainer

 dbContext = 

new

 Entities.

ModelContainer

()) 

    { 
        

var

 student = dbContext.Studenci.Where(s => s.NumerIndeksu == numerIndeksu) 

            .FirstOrDefault(); 

background image

 
        

if

 (student == 

null

        { 
            

throw

 

new

 

Exception

(

"Nie istnieje student o podanym numerze indeksu"

); 

        } 
 
        

var

 oplata = 

new

 Entities.

Oplata

(); 

        oplata.CaseId = caseId; 
        oplata.Student = student; 
 
        dbContext.SaveChanges(); 
    } 

 

Metoda o nazwie 

PobierzPunktyEcts

 pobierze na wejściu numer indeksu studenta i zwróci jego 

punkty ECTS. W przypadku jeśli w bazie danych nie zostanie znaleziony student o zadanym numerze 
indeksu zostanie wyrzucony wyjątek.  

Jeśli w procesie składania wniosku workflow uaktywni zdarzenie pośrednie „Wpłynięcie pieniędzy” to 
w naszym systemie odpali się metoda 

DodajNowaOplate

 z numerem indeksu studenta oraz z 

identyfikatorem tego kroku procesu. Metoda doda do bazy danych nową opłatę przypisując do niej 
przekazany identyfikator. Jest to potrzebne ze względu, na to że z poziomu strony damy możliwośd 
„odpalenia” tego zdarzenia. Dzięki identyfikatorowi workflow będzie jednoznacznie wiedział, o które 
zdarzenie nam chodzi. 

W powyższych metodach użyliśmy LINQ i Entity Framework w celu odczytu i zapisanie danych do 
bazy. 

 

Kolejnym krokiem jest stworzenie interfejsu użytkownika i metody, która pozwoli uruchomid 
zdarzenie pośrednie „Wpłynięcie pieniędzy” z poziomu naszej aplikacji zewnętrznej. 

 

Rysunek 22. Interfejs potwierdzania wpłat 

Na interfejsie użytkownika w liście rozwijanej będzie można wybrad wpłatę do potwierdzenia a 
następnie za pomocą przycisku „Potwierdź wpłatę” wyślemy do workflow odpowiedni komunikat, 
który uruchomi zdarzenie. Aby utworzyd taki interfejs otwórz plik Default.aspx i przełącz go w tryb 
Design, używając przycisku w lewym dolnym rogu okna. 

background image

 

Rysunek 23. Tryb Design i okno ToolBox 

Korzystając z metody drag and drop, przenieś element Button i DropDownList z okna Toolbox na 
okno główne. Korzystając z menu kontekstowego wyświetl właściwości listy rozwijanej i zmieniamy 
jej nazwę na Wplaty. W drugiej kolejności otwieramy właściwości przycisku i zmieo tekst wyświetlany 
na „Potwierdź wpłatę”. Następnie kliknij dwukrotnie na przycisk. VS automatycznie utworzy 
zdarzenie dla przycisku oraz otworzy kodem strony. W kodzie strony zaimplementuj następujące 
dwie metody: 

protected

 

void

 Button1_Click(

object

 sender, 

EventArgs

 e) 


    

using

 (Entities.

ModelContainer

 dbContext = 

new

 Entities.

ModelContainer

()) 

    { 
        

int

 oplataId = 

int

.Parse(Wplaty.SelectedValue); 

        

var

 oplata = dbContext.Oplaty.Where(o => o.Id == oplataId) 

            .FirstOrDefault(); 
 
        

string

 sXml = 

"<BizAgiWSParam>"

        sXml += 

"<ActivityData>"

        sXml += 

"<idCase>"

 + oplata.CaseId + 

"</idCase>"

        sXml += 

"<taskName>WpYniCiePieniDzy</taskName>"

        sXml += 

"</ActivityData>"

        sXml += 

"</BizAgiWSParam>"

 
        

XmlDocument

 xDoc = 

new

 

XmlDocument

(); 

        xDoc.LoadXml(sXml); 
 
        WorkflowEngineSOA.

WorkflowEngineSOA

 ws = 

new

 

WorkflowEngineSOA.

WorkflowEngineSOA

(); 

 
        

XmlNode

 xn = ws.performActivity(xDoc); 

        

var

 t = xn.SelectSingleNode(

"process/processError/errorMessage"

); 

 
        oplata.CzyDokonana = 

true

        dbContext.SaveChanges(); 
    } 

 

protected

 

override

 

void

 OnPreRender(

EventArgs

 e) 


    

using

 (Entities.

ModelContainer

 dbContext = 

new

 Entities.

ModelContainer

()) 

    { 
        Wplaty.DataSource = dbContext.Oplaty 

background image

            .Where(o => o.CzyDokonana == 

false

            .Select(o => 

new

 

            { 
                Opis = o.Student.Imie + 

" "

 + o.Student.Nazwisko + 

" - CaseID: "

 + 

SqlFunctions

.StringConvert((

decimal

)o.CaseId), 

                Id = o.Id 
            }).ToList(); 
        Wplaty.DataBind(); 
    } 

 

Metoda 

Button1_Click

 to automatycznie wygenerowane zdarzenie, w którym odwołamy się do 

workflow.  W tym celu do naszej aplikacji musimy dodad Web Referencje do WebSerwisu który jest 
wystawiany przez workflow. Na głównym projekcie z menu kontekstowego wybieramy opcję „Add 
Web Reference…”. 

 

Rysunek 24. Dodawanie referencji do usługi sieciowej 

W pole URL wpisujemy adres serwisu naszego workflowa 
(

http://localhost:1024/TutorialBizAgi/webservices/WorkflowEngineSOA.asmx

i wciskamy zieloną 

strzałkę. VS wyświetli listę dostępnych metod. W polu „Web reference  name” wpisujemy 
WorkflowEngineSOA i wciskamy przycisk “Add Reference”. 

background image

 

Rysunek 25. Podgląd dodanych referencji do usług sieciowych 

Powracając do implementacji metody 

Button1_Click,

 możemy zobaczyd tam przykład skorzystania z 

dodanej usługi.  

Drugą metodą w kodzie strony jest 

OnPreRender,

 w której jest zaimplementowane dodanie opłat do 

listy rozwijanej. Jest to nadpisanie metody z klasy bazowej, która to metoda jest zawsze odpalana 
przy wyświetlaniu strony.