 
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
 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. 
 
Rysunek 1. Utworzenie nowego projektu
W celu utworzenia nowego projektu wybieramy opcję File->New->Project… .
 
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.  
 
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ą 
(
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… . 
 
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.
 
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. 
 
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). 
 
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.  
 
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”. 
 
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”.  
 
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
 
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ą.  
 
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
 
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. 
 
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… . 
 
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();
 
 
        
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. 
 
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 
 
.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”. 
 
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.