[c#] deklarowanie danych w WCF

0

Witam. Mam problem, poniewaz przejzalem kilka tutoriali, ale nie bardzo ogarniam jednej rzeczy.
Pisze aplikacje sieciowa (a raczej ucze sie pisac) typu klient - server

po zdefiniowaniu prostej klasy w serverze - mniejwiecej tak

[ServiceContract]
    class klasaBazowa
    {
      [OperationContract]
      string powitanie()
      {
        return ("Witam");
      }
    }

wg dostepnych mi opisow wywolanie w kliencie powinno wygladac po prostu tak:

klasaBazowa obiekt = new klasaBazowa();
Console.WriteLine(obiekt.powitanie());

jednak na pierwszy rzut oka widac, ze cos nie tak, bo klienta definiuje przecieŻ jako osobny program ?
no wiec nie ma dostepu do klasy "klasaBazowa" i zgodnie z przewidywaniami wywala mi blad.
Doczytalem ze nalezy udostepnic klientowi metadane, gdzies w pliku konfiguracyjnym serwera. Jednak nie bardzo rozumiem co to zmienia, gdyz klient na poziomie kompilacji nie ma przecieŻ zadnego dostepu do aplikacji serwera ? poza tym opisane jest to gdy endpointy definiuje sie w pliku konfiguracyjnym, a ja endpointy dodaje w kodzie programu.

jak rozwiazac taki problem?
Pozdrawiam :)

0
  1. Klient nie ma dostępu (poza pewnymi wyjątkami) do implementacji klasy, która obsługuje serwis. Zamiast tego, klient tworzy swoją klasę proxy, która implementuje metody OperationContract. Wywołanie tych metod powoduje wysłanie zapytania, deserializację odpowiedzi i wykonanie odpowiedniego zdarzenia (Async mode) lub po prostu odpowiedź.

  2. Zamiast powyższego lepiej przygotować interfejs (i jemu nadać atrybuty ServiceContract, OperationContract). Później tylko dziedziczyć po interfejsie dla konkretnego serwisu (implementacji serwisu!). WCF jest sprytnie podzielony na warstwy- zobacz: ABC (Address, Binding, Contract).

  3. Konfiguracje ABC możesz zrobić na 2 sposoby - poprzez plik web.config, lub ręcznie jeśli w kodzie, manualnie odpalasz swój serwis.

4... również zapytania do serwisu mogą być zrobione na 2 sposoby:
a) użycie Service Reference / odpowiedni wpis w app/web.config
b) użycie wspólnego interfejsu oraz ChannelFactory<T> - wtedy niepotrzebny jest Service Reference

0

znalazlem taki przyklad na ktorym sie wczesniej wzorowalem wiec wkleje go takim jakim byl od poczatku


Przykładowy kod implementacji usługi w C#

  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.ServiceModel;

  namespace HelloService
  {
    class Program
    {
      static void Main(string[] args)
      {

        Uri baseURI = new Uri(http://localhost/hello);
        ServiceHost HService = new ServiceHost(typeof(HelloService), baseURI);
        HService.AddServiceEndpoint(typeof(HelloService), new BasicHttpBinding(),baseURI);

        HService.Open();
        Console.WriteLine("Usługa jest gotowa.");
        Console.ReadKey();
        HService.Close();
      }
  }

    [ServiceContract]
    class HelloService
    {
      [OperationContract]
      string sayHi()
      {
        return ("Hi!");
      }
    }
  } 

Do początku stronyDo początku strony
Przykładowy kod implementacji klienta w C#

  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.ServiceModel;

  namespace HelloClient
  {
    class Program
    {
      static void Main(string[] args)
      {
        HelloServiceProxy p = new HelloServiceProxy();
        Console.WriteLine(p.sayHi());
      }
    }
  }

czy z tego co napisales w pierwszym punkcie wynika ze wystarczy tylko wywolac metode serwera, bo program sam sobie zserializuje dane, pytanie tylko czy

  • wywolanie metody nalezy opatrzyc jakims atrybutem [] ?
  • czy nalezy dolaczyc jakas biblioteke lub referencje
  • czy po prostu utworzyc definicje interfejsu bez deklaracji ?
  • czy jeszcze jakis inny sposob ?
0

Zamiast powyższego lepiej przygotować interfejs (i jemu nadać atrybuty ServiceContract, OperationContract). Później tylko dziedziczyć po interfejsie dla konkretnego serwisu (implementacji serwisu!). WCF jest sprytnie podzielony na warstwy- zobacz: ABC (Address, Binding, Contract).

I w dodatku kreator webserwisów w Visualu sam tworzy ten szkielet, wybierz tylko odpowiedni typ projektu -WCF Service Library. Później taką dll-kę możesz podpiąć pod IIS-a albo napisać hosta, co jest trywialne.

wywolanie metody nalezy opatrzyc jakims atrybutem [] ?

Nie

czy nalezy dolaczyc jakas biblioteke lub referencje

Należy dołączyć referencję do webserwisu (wsdl-a)

Zajrzyj na stronę w moim podpisie - kiedyś zacząłem pisać jakiś tutorial na ten temat, ale nie chciało mi się go kończyć.

0

wlasnie nie mam visuala, korzystam z c# express a tam nie ma czegos takiego.
juz patrze, juz probuje, moze cos uda mi sie wymyslec, bo na razie nie bardzo jeszcze rozumiem o co chodzi z tym wywolaniem i metadanymi.

0

Nie wiem czy w Visual C# Express jest dostępny ten kreator, bo nigdy nie korzystałem. Zainstaluj sobie triala Visual C# Professional i Visual Web Developer.

0

Na mojej stronie www.hakger.org znajdziesz projekt Octane - tam masz dobry przykład - połączenie WCF i Silverlight. W środku znajdziesz też kilka moich 'dodatków' do WCF, które mogą się nieraz przydać.

0
Deti napisał(a)

Na mojej stronie www.hakger.org znajdziesz projekt Octane - tam masz dobry przykład - połączenie WCF i Silverlight. W środku znajdziesz też kilka moich 'dodatków' do WCF, które mogą się nieraz przydać.

Coś mi się wydaje, że ktoś, kto pierwszy raz webserwisy na oczy widzi poczuje się lekko przytłoczony i raczej nie wiele zrozumie z tamtego kodu - chyba trzeba zaczac od podstaw najpierw :>

0

to znaczy tak ogolnie to ja przez webservices rozumiem aplikacje w asp ktora udostepnia uslugi.
a mi bardziej zalezy na nauczeniu sie programowania sieciowego tzn np przesylanie wiadomosci, plikow miedzy aplikacjami przez internet.
W zamierzeniu chcialbym napisac najpierw program ktory przesle mi z jednej aplikacji z jednego komputera plik do aplikacji na innym komputerze.
no ale zeby nie prosic o gotowe programy chcialem zaczac od podstaw i teraz jak piszecie o tych webserviceach wnioskuje ze chyba pomieszalem pojecia :D

na razie probuje stworzyc aplikacje ktora przesyla mi zwyklego stringa do aplikacji na drugim kompie.

0

Jak chcesz przesyłać pliki przez webserwis to jest streamed binding, mtom... ale z tego co piszesz to raczej powinieneś za sockety się wziąć bo rzeczywiście pomyliłeś nieco pojęcia. Do przesłania stringa to wystarczy udp

0

tak tak, zaczalem nawet pisac cos na socketach, natrafilem na jakas informacje ze teraz programowanie sieciowe wykonuje sie w technologi wcf ktora zcala dotychczasowe rzeczy z tym zwiazane webservices soapy i inne takie, ale byc moze ze faktycznie nie nadaje sie wcf do tego. ale poprubuje jeszcze, moze sie da tak, jak ktos ma jakis pomysl to chetnie poczytam.
pozdrawiam

0

Witam

Oczywiście, że WCF się do tego nadaje. Znajdź po prostu kurs, który zrozumiesz i przerób go uważnie - zobaczysz, że komunikacja za pomocą tej technologii jest naprawdę prosta, a zarazem oferuje wiele możliwości.

Z tego co napisałeś w pierwszym poście (kod) widzę, że czytałeś raczej coś niezbyt dobrze napisanego. W książce Troelsena jest fajny mini-kurs WCF, ładnie opisany, a i w sieci kilka widziałem (choćby na MSDNie).

0

no tak, poucze sie jednego i drugiego, nie zaszkodzi ;)
pytanie podstawowe - czy moge pisac to wszystko co zwiazane z wcf w zwyklej aplikacji konsolowej? bo nie mam pelnego visuala. czy napisany kod w zwyklej konsolowce po skompilowaniu bedzie dzialal poprawnie ? bo jesli jest konieczne korzystac z WCF Service Library to nie ma sensu pisac ..

0

Możesz pisać i w notatniku, VS nie ma tu nic do rzeczy. Do korzystania z dobrodziejstw WCF potrzebna jest jedynie biblioteka System.ServiceModel.dll.
Jakbyś chciał się "na poważne" pouczyć WCF to bardzo polecam książkę "Programming WCF Services" (Juval Löwy).

0

dobra, tak zrobie. podejrzewam ze zaczne od neta, bo z angielskim u mnie trudno i duzo czasu mija zanim cos przetlumacze sobie tak aby zrozumiec. Ale zajrze. dziekuje, jakby co bede pytal.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1