Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

WCF – partea 2-a

     Ce mi-am propus in acest articol? As vrea sa creez un serviciu WCF pe care sa il accesez de pe un dispozitiv Windows Mobile. Serviciul nu o sa fie de o complexitate mare, ci mai degraba trivial: vom introduce numele unui utilizator, iar serviciul “ii va raspunde” cu un “salut”. Sa incepem:

     Vom avea nevoie ca solutia noastra din Visual Studio sa contina 3 proiecte:

1. WCF Library – proiect care va contine efectiv implementarea serviciului WCF.

WCFProject

2. Console Application – proiect care va gazdui serviciul WCF. Va fi de tip “self-hosted”  (nu gazduit in IIS).  (IIS,  mai scriu)

ConsoleHostService

3. Windows Mobile – proiect care constituie clientul de pe care vom apela minunatul nostru serviciu. :)

WindowsMobileClient

Continuam si alegem aplicatia destinata Windows Mobile Professional.

WindowsMobileClient2

In aplicatie, vom avea nevoie doar de un textbox, unde utilizatorul isi va introduce numele si un label care va afisa raspunsul.

     Revenim la proiectul WCF.

     Observam ca in Solution Explorer, se vor crea doua fisiere .cs (Service1.cs si IService1.cs) si un fisier de configuare al aplicatiei (App.config). Redenumim cele doua fisiere in IServiceHello.cs si ServiceHello.cs.

     Cunoscand teoria prezentata in primul articol despre WCF, vom defini contractul si il vom implementa In cazul nostru, acesta este reprezentat de interfata IServiceHello.

 [ServiceContract]
    public interface IServiceHello
    {
        [OperationContract]
        string Hello(string name);

    }

Codul pentru implementarea membrului interfetei este:

    public class ServiceHello : IServiceHello
    {
        public string Hello(string name)
        {
            if(string.IsNullOrEmpty(name))
            {
                Console.WriteLine("Introduceti numele");
                throw new InvalidOperationException("Introduceti numele");

            }

            string s = string.Format("Salut " + name);
            Console.WriteLine(s);
            return s;
        }
    }

     Urmatorul pas in construirea unui serviciu Wcf este configurarea endpoint-urilor pentru serviciu, configurarea binding-ului si a comportamentului serviciului la runtime.

     Vom alege sa configuram endpoint-urile in App.config. Acestea pot fi scrise si in cod.Singura cerinta este ca sa expunem endpoint-uri bazate http compatibile cu clientul mobile.

     Cum .Net Compact Framework nu suporta decat binding-ul basicHttpBinding, vom face modificarea necesara.

     Vom avea grija chiar de acum ca in tagul baseAddresses din host sa modifica localhost cu ip-ul masinii care gazduieste serviciul. Aceasta modificare se datoareaza faptului ca dispozitivele mobile nu stiu sa traduca “localhost” in adresa IP corecta unde serviciul va fi gazduit.

     Un simplu ipconfig /all in cmd, ne va returna toate informatiile necesare, inclusiv DNS. Fisierul de configurare ar trebuie sa arate asa:

appConfig

    In acest moment, daca rulam solutia, putem testa daca serviciul functioneaza prin copierea adresei din App.config in browser. Rezultatul va fi:

testWcf

     Stim ca un serviciu WCF, de regula, este gazduit in Internet Information Services pe Windows Server 2003, Windows Server 2008, Windows Process Activation Services (WAS) sau self-host, intr-un serviciu Windows.

     Pentru simplitatea exemplului, il voi gazdui in proiectul de tip Console, pe care l-am adaugat mai devreme in solutie.

     Navigam la proiectul de tip Consola.

Initializarea serviciului se poate face cu urmatorul cod, in metoda Main:

            ServiceHost host = new ServiceHost(typeof (ServiceHello));
            try
            {
                host.Open();
                Console.ReadLine();
            }
            finally
            {
                if(host.State == CommunicationState.Faulted)
                {
                    host.Abort();
                }
                else
                {
                    host.Close();
                }
            }

Atentie ca va trebui sa folosim o referinta catre System.ServiceModel pentru a folosi ServiceHost si o referinta catre proiectul WCF (Add Reference – Projects – WCFServiceHello).

     Navigam la proiectul client Windows Mobile, pentru a apela serviciul.

     In mod normal, am fi folosit Add Service Reference din Solution Explorer in Visual Studio sau apelul SvcUtil.exe (SvcUtil) pentru generarea unui proxy pentru aplicatiile client WCF. Problema e ca in cazul proiectelor de tip Device Application nu este o functie disponibila Add Service Reference si nici nu putem folosi SvcUtil pentru ca viitorul cod generat nu va fi compatibil cu subsetul de functionalitati WCF pentru dispozitivele mobile cu .Net Compact Framework.

     Solutia este data de Power Toys pentru .NET Compact Framework 3.5 care se poate descarca de aici. Acesta include un echivalent pentrnu SvcUtil pentru Compact Framwork (NetCFSvcUtil). Il instalam..

     In linia de comanda, vom naviga la locatia in care se gaseste executabilul si ii vom da ca parametru numele serviciului. Rezultatul va fi:

netCFSvcUtil

     Atunci cand se foloseste NetCFSvcUtil pentru generarea unui proxy, se va inspecta configurarea endpoint-ului serviciului si a metadelor pentru a se asigura compatibilitatea pentru mobile.

     Dupa rularea comenzii, vor fi generate doua fisiere cod-sursa ServiceHello.cs  si CFClientBase.cs care vor fi salvate in acelasi director de unde am rulat comanda.  Este important sa stim locul unde au fost generate pentru ca va fi nevoie de adaugarea lor in proiect. Asadar, in Solution Explorer, Add Existing Item, si aducem fisierele in proiectul de Windows Mobile.

     Pentru ca dispozitivele mobile nu suporta fisiere de configurare ale aplicatiei (anumite clase lipsesc in System.Configuration), aplicatiile .Net Compact Framework nu pot procesa sectiunea <system.ServiceModel> si astfel NetCFSvcUtil va genera cod pentru a produce adresa endpoint-ului si binding-ul. Nu vom intra in detalii si vom spune ca metoda statica CreateDefaultBinding pe care o vom folosi va returna o reprezentarea  a binding-ului la runtime.

Codul necesar apelarii serviciului din aplicatie, pe care l-am scris intr-o metoda ce va fi apelata la apasarea left soft key-ului, este:

        private void CallService()
        {
           var binding = ServiceHelloClient.CreateDefaultBinding();

           string address = ServiceHelloClient.EndpointAddress.Uri.ToString();

            ServiceHelloClient proxy = new ServiceHelloClient(binding, new EndpointAddress(address));
            lblResponse.Text = proxy.Hello(txtName.Text).ToString();
        }

Atentie ca si la proiectul de Windows Mobile va trebui sa adaugam referinta pentru System.ServiceModel.

     Va trebuie sa adaugam referinta si System.Runtime.Serialization datorita fisielor adauga care folosesc acest namespace.

     Vom seta proiectul Windows Mobile ca Startup Project.

CTRL-SHIFT-B – build succeeded.  :D

     Sa recapitulam ce am facut pana acum: am creat un serviciu WCF, l-am gazduit, am creat o aplicatie mobila simpla, am generat un proxy folosind NetCFSvcUtil si am scris codul pentru apelarea serviciului.

     Rulam solutia, selectam emulatorul dorit.

     Ultimul pas este conectarea emulatorului la internet, lucru pe care l-am explicat mai in amanunt in articolul Conectarea la retea. Pe scurt, in Device Emulator Manager, in meniul Tools, gasim emulatorul folosit si apasam Craddle.

     Dupa afisarea mesajelor cum ca dispozitivul a fost conectat la retea, serviciu Wcf a fost gazduit cu success, il apelam.

Messages

     La apelarea serviciului, vom primi raspunsul asteptat.:)

HelloSuccess

     In cazul in care doriti sa mergeti mai departe cu un deployment al serviciului, trebuie sa aveti instalate pe dispozitiv:

  1. .Net Compact Framework v3.5 (Windows Mobile 6.5 in ROM are instalata versiunea 2.0)
  2. Daylight Savings Time Update for Windows Mobile pentru evitarea exceptiilor legate de timpul clientului si al serverului.
  3. fisierele certificatelor de securitate

     Astept eventuale probleme pe care le-ati intampinat in realizarea acestui serviciu WCF. Daca apar “ciudatenii”, incercati de exemplu, sa opriti firewall-ul definitiv, macar pana la fixarea ulterioara a unei reguli pentru serviciu. Daca lucrati in Vista/Windows 7, probleme nedorite ar putea cauza si UAC.

     O sa continuam seria de articole Windows Mobile cu Threading in .Net Compact Framework.

Category: Uncategorized
  • Ion Valentin says:

    Super . Iti multumesc prietene .Astept si alte serii de WCF ! Asa da tutoriale ! Tutorialele tale sunt o lectie despre arta de a invata . Cu respect , Valentin

    November 28, 2011 at 3:38 pm
  • Vlad says:

    Iti multumesc mult pentru toata munca depusa!

    April 15, 2013 at 3:28 pm

Your email address will not be published. Required fields are marked *

*