środa, 3 marca 2010

Tworzenie web serwisu WCF cz. 3

W tej części kursu zajmiemy się "konsumpcją" stworzonego przez nas wcześniej serwisu opartego o WCF. Jak wcześniej wspominałem, stworzyliśmy WCF Library Application co daje nam spore możliwości odnośnie wykorzystania naszego web serwisu. Tutaj, postaram się w miarę jasno pokazać jak użyć naszej aplikacji do stworzenia prostej aplikacji ASP.NET i WinForms.

ASP.NET
Zaczniemy od aplikacji webowej. 
1. Otwieramy stworzony przez nas ostatnio projekt, klikamy prawym przyciskiem myszy i wybieramy Add New Project...
2. Wybieramy ASP.NET Web Application, nadajemy nazwę i klikamy Ok. Po zatwierdzeniu powinniśmy otrzymać taki widok naszych projektów:


Aplikację podzieliłem na 3 oddzielne podstrony:

Pierwsza będzie odpowiedzialna za dodanie nowego klienta do bazy danych. Druga pozwoli na wyświetlenie klienta o określonym Id. Ostatnia wyświetli wszystkich klientów w bazie. A więc do dzieła :)


3. Usuwamy z naszego projektu plik Default.aspx i dodajemy nowy plik: MasterPage.Master. Pozwoli nam to na stworzenie menu, które będzie na każdej podstronie naszego serwisu, bez konieczności kopiowania na wszystkie podstrony kodu odpowiedzialnego za menu.
4. Do utworzonego MasterPaga dodajemy prostą tabelkę z jednym wierszem i dwiema komórkami:


<%@ Master Language="C#" AutoEventWireup="true"  
CodeBehind="MasterPage.master.cs" Inherits="
WebPage.MasterPage" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
Transitional//EN" "http://www.w3.org/TR/xhtml1/
DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <table border="2" cellpadding="10">
    <tr align="left" valign="top">
    <!--Menu naszej strony -->
    <td>
        <asp:HyperLink ID="HyperLink1" runat=
"server">Add new customer</asp:HyperLink>
        <br />
        <asp:HyperLink ID="HyperLink2" runat=
"server">Customer information</asp:HyperLink>
        <br />
        <asp:HyperLink ID="HyperLink3" runat=
"server">Show all customer</asp:HyperLink>
    </td>
    <!-- Zawartość strony -->
    <td>
    <asp:ContentPlaceHolder runat="server"  
ID="contetnPlaceHolder"></asp:ContentPlaceHolder>
    </td>
    </tr>
    </table>
    </form>
</body>
</html>
 
Pierwsza komórka zawiera proste menu, druga resztę zawartości.
5. Dodajemy nowy plik do projektu typu WebContent Form. Po nadaniu nazwy pojawi się okienko w którym wybieramy nasz MasterPage i akceptujemy wybór.
6. Do ContentPlaceHoldera dodajemy po dwie kontrolki Label i TextBox oraz jeden przycik:

<%@ Page Title="" Language="C#" MasterPageFile=
"~/MasterPage.Master" AutoEventWireup="true" 
CodeBehind="AddNewCustomer.aspx.cs" Inherits=
"WebPage.AddNewCustomer" %>
<asp:Content ID="Content1" ContentPlaceHolderID=
"head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID=
"contetnPlaceHolder" runat="server">
    <asp:Label ID="Label1" runat="server" Text=
"Imię: "></asp:Label>
    <asp:TextBox runat="server" ID="tbFistName">
</asp:TextBox>
    <br />
    <br />
    <asp:Label runat="server" ID="Label2" Text=
"Nazwisko"></asp:Label>
    <asp:TextBox runat="server" ID="tbLastName">
</asp:TextBox>
    <br />
    <br />
    <asp:Button runat="server" ID="Submit" Text="Wyślij"/>
</asp:Content>

7. Następnie dodajemy dwie kolejne podstrony: CustomerInfo i AllCustomers tak jak w poprzednim kroku:
CustomerInfo:

<%@ Page Title="" Language="C#" MasterPageFile=
"~/MasterPage.Master" AutoEventWireup="true" 
CodeBehind="CustomerInfo.aspx.cs" Inherits=
"WebPage.CustomerInfo" %>
<asp:Content ID="Content1" ContentPlaceHolderID=
"head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID=
"contetnPlaceHolder" runat="server">
    <asp:Label ID="Label1" runat="server" Text="Id: ">
</asp:Label>
&nbsp;<asp:TextBox ID="TextBox1" runat="server" 
        ontextchanged="TextBox1_TextChanged">
</asp:TextBox>
    <br />
    <asp:Button ID="BShow" runat="server"  
Text="Pokaż" />
    <br />
    <asp:Label ID="LId" runat="server"></asp:Label>
    <br />
    <asp:Label ID="LFirstName" runat="server">
</asp:Label>
    <br />
    <asp:Label ID="LLastName" runat="server">
</asp:Label>
    <br />
</asp:Content>
 
AllCustomers:

<%@ Page Title="" Language="C#" MasterPageFile=
"~/MasterPage.Master" AutoEventWireup="true"  
CodeBehind="AllCustomers.aspx.cs" Inherits=
"WebPage.AllCustomers" %>
<asp:Content ID="Content1" ContentPlaceHolderID=
"head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID=
"contetnPlaceHolder" runat="server">
    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
</asp:Content>
8. Kolejnym krokiem jest dodanie referencji do naszego web serwisu. Klikamy prawym klawiszem na naszym projekcie ASP.NET i wybieramy opcje Add Service Reference. Pojawi się nowe okienko w którym klikamy na przycisk Discover. Po tej czynności powinniśmy ujrzeć następujący ekran:

Wprowadzamy wartość Namespace np. MyService i akceptujemy. Do naszego projektu zostanie dodana tzw. klasa Proxy która zajmie się zarządzaniem przesyłania danych pomiędzy web serwisem a naszą aplikacją. 
9. Przechodzimy do naszej pierwszej podstrony, dotyczącej dodawania nowego użytkownika i dodajemy nowe zdarzenie do przycisku Wyślij:

        protected void Submit_Click(object sender, 
EventArgs e)
        {
            MyService.Customer cust = 
new WebPage.MyService.Customer();
            cust.FirstName = tbFistName.Text;
            cust._lastName = tbLastName.Text;
            MyService.CustomerServiceClient client = 
new WebPage.MyService.CustomerServiceClient();
            client.AddNewCustomer(cust);
        }
 
Następnie kod przycisku pokaż dla strony CustomerInfo:

        protected void BShow_Click(object sender,  
EventArgs e)
        {
            MyService.CustomerServiceClient client = 
new WebPage.MyService.CustomerServiceClient();
            MyService.Customer c = 
client.GetCustomerById(int.Parse(tbId.Text));
            LFirstName.Text = c.FirstName;
            LLastName.Text = c._lastName;
            LId.Text = c.ID.ToString();
        }
 
Oraz kod wyświetlający wszystkich klientów:

        protected void Page_Load(object sender,  
EventArgs e)
        {
            MyService.CustomerServiceClient client = 
new WebPage.MyService.CustomerServiceClient();
            GridView1.DataSource = 
client.GetAllCustomers();
            GridView1.DataBind();
        }

9. Jeśli dodaliśmy już potrzebny kod czas na przetestowanie naszej aplikacji. Odpalamy nasz projekt i próbujemy dodać nową osobę. Po przeładowaniu strony, jeśli wcześniej nie pojawi się żaden błąd, nowa osoba zostanie dodana do bazy. Także podczas pobierania informacji o nowej osobie nie powinniśmy mieć żadnych problemów:

10. Przejdźmy do wyświetlenia informacji o wszystkich  klientach. Klikamy na Show all customer i otrzymujemy piękny błąd:


Błąd jest spowodowany tym, że domyślnie nasz web serwis ma ustawione aby maksymalna paczka przesyłana do naszej aplikacji miała 64kb. Ponieważ w bazie jest duża ilość klientów, 64kb to trochę za mało aby ich wszystkich na raz przesłać. Istnieje kilka sposób na poradzenie sobie z tym problemem:
1. CustomPaging w GridView i pobieranie tylko wierszy o wskazanym Id
2. Zwiększenie maksymalnej wielkości przesyłanej od serwisu do naszej aplikacji.
 Tutaj opiszę 2 możliwość, gdyż jest bezpośrednio związana z naszym web serwisem.

Klikamy prawym klawiszem na App.Config w web serwisie i wybieramy EditWCF configuration...
Przechodzimy do części Bindings, wybieramy New Binding Configuration...
Z listy wybieramy pasujący do naszego punktu końcowego format (wsHttpBinding) 
Edytujemy kolejno wartości: MaxBufferPoolSize oraz MaxRecivedMessageSize. Zwiększymy obie wartości do np. 10 MB: 10485760:


Teraz dopisujemy konfigurację do naszego punktu końcowego:


Po tym zabiegu nasz serwis nadal nie będzie działać jeszcze poprawnie. Dzieje się tak dlatego, że wielkość paczki należy ustawić po obu stronach: klienta i serwera. Po stronie serwera mamy już sprawę załatwioną. Czas na klienta:
Tak jak poprzednio klikamy prawym klawiszem myszki na Web.Config i edytujemy właściwości WCF. Tutaj już jednak w Bindingu mamy na gotowe plik konfiguracyjny. Wystarczy tylko zwiększyć poprzednio pokazane wartości. Po zaakceptowaniu zmian możemy uruchomić ponownie nasz projekt.
Po ponownym odpaleniu projektu i wybraniu podstrony wyświetlającej wszystkich klientów otrzymamy ich całą listę:
Tak więc cel został osiągnięty :)


WinForms
1. Do projektu dodajemy nowy projekt WindowsForms.
2. Dodajemy TabControl do formatki: 
3. Dodajemy kontrolki do każdej zakładki oraz referencję do serwisu:
4.  Teraz do każdego przycisku odpowiedni kod (analogicznie jak dla wersji ASP.NET)
5. Zmieniamy wielkość przesyłanych danych do 10 MB po stronie klienta (plik app.config)
6. Kompilujemy i odpalamy naszą aplikację:

 Jak widać tworzenie serwisów w WCF nie jest skomplikowane a niesie za sobą wiele korzyści. WCF jest bardzo elastyczną technologią i skazaną na swój rynkowy sukces.

Brak komentarzy:

Prześlij komentarz