Zapraszam do lektury mojego kolejnego artykułu, który pojawił się na CodeGuru.pl. Po szeregu artykułów przedstawiających podstawy technologii przyszedł czas aby przejść do esencji WCF, czyli do jego konfiguracji. Oczywiście nie można zawrzeć wszystkiego w jednym artykule, dlatego w przyszłości pojawią się kolejne części trektujące na ten temat.
WCF i enum – udostępnianie typu wyliczeniowego
Często w pracy z Windows Communication Foundation chcemy udostepnić w kontrakcie danych naszej usługi pewien typ wyliczeniowy. Aby to zrobić wykorzystujemy atrybut [EnumMember], który umieszczamy nad każdą z wartości tego typu. Posłużę się przykładem, który przygotowałem do prezentacji SOA + .NET = WCF, którą prowadziłem na ostatnim spotkaniu TGD.NET.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using System.Runtime.Serialization; namespace CarRentalServices.DataTransferObjects { [DataContract(Namespace="CarRentalServices.Types")] public enum CarMake { [EnumMember] Ford, [EnumMember] Opel, [EnumMember] Peugeot, [EnumMember] Dodge, [EnumMember] Chrysler } } |
Podczas prezentacji zastanawialiśmy się co się stanie, jeżeli w typie wyliczeniowym nie użyjemy tego atrybutu? Niestety nie było na to czasu podczas spotkania, jednakże postanowiłem to sprawdzić. Otóż okazuje się, że klient zinterpretuje go jako string, ale próba pobrania obiektu, który zawiera w sobie pole tego typu wygeneruje błąd nieoczekiwanego zakmnięcia połączenia (“The underlying connection was closed: The connection was closed unexpectedly.”). Wystąpi on nawet jeżeli po stronie klienta nie będziemy korzystać z tego typu – nie ustawimy wartości pól o rozpatrywanym typie wyliczeniowym. Dlaczego? Ponieważ typ wyliczeniowy jest inicjowany poprzez pierwszą wartość z listy – w tym przypadku będzie to Ford. Bład powstaje natomiast przez to, że bez atrybutu nad wartościami typu wyliczeniowego zmienia się definicja kontraktu i jednocześnie powstają nieścisłości po stronie klienta podczas desierializacji wysłanej przez serwis odpowiedzi. Jeżeli klient nie potrafi zinterpretować odpowiedzi wówczas zamyka połączenie.
Błąd ten nie powstaje jeżeli atrybutem [EnumMember] oznaczymy tylko te wartości, które mogą być przesłane do klienta, których użyjemy w komunikacji. Wszystkie pozostałe mogą pozostać bez niego.
Wnioski:
1. Typ wyliczeniowy bez wartości oznaczonych atrybutem [EnumMember] powoduje błędy przy korzystaniu z uslugi.
2. Błąd, który nic nie mówi może oznaczać błędną definicję kontraktu danych.
SQL Management Studio Specify Values for Template Parameters
Korzystając z Microsoft SQL Server Management Studio czasem zdarza nam się korzystać z szablonów. Zdarza się to gdy dodajemy nową procedurę, funkcję, tryger i inne, lub korzystamy z eksploratora szablonów (Ctrl+Alt+T, View -> Template Explorer). Szablony posiadają pewne parametry rozumiane przez SSMS. Aby z nich skorzystać używamy skrótu Ctrl-Shift-M. Wówczas pojawia nam się okno 9przykład dla procedury składowanej):
Co jednak zrobić, jeżeli to nie działa?
Należy w menu wybrać Tools > Options, następnie Keyboard jak na poniższym obrazku:
Tam w opcji Keyboard Scheme wybrać najpierw SQL Server 2000, kliknąć OK i wykonać wszystko ponownie tym razem wracając ustawienie na Standard. Tym razem w oknie szablonu skrót Ctrl-Shift-M powinien zadziałać
DBML to SQL
Gdy przygotowywałem stronę z projektami i byłem przy ShipBattleChallenge, gdy okazało się, że przed formatowaniem dysku nie zrobiłem backupu bazy danych dla turnieju SBC. Tak – zrobiłem mini programik, który zamiast mnie uruchamia odpowiednie walki botów i loguje przebiegi walk do bazy – Tournament Master :). W związku z tym, że nie jest to kluczowe dla projektu postanowiłem wyłączyć to z solucji. Jednakże po chwili namysłu stwierdziłem, że skoro w dbml’u sa informacje na temat tabel, to może coś da się z tym zrobić… Dziś udało mi się zasiąść do tematu i poszukać co i jak. Okazuje się, że obiekty typu DataContext posiadają metodę CreateDatabase(), która potrafi przywrócić zaimportowane do dbml’a struktury i relacje z bazy. Oczywiście obejmuje to tylko DDL (ang. Data Definition Language), a nie DML. W moim przypadku było to w zupełności wystarczające, gdyż korzystałem z bazy poprzez LINQ to SQL – bardziej dla testów niż z przekonania, ale okazało się to przydatne.
Jak to zrobić? Wystarczy skorzystać z poniższego kawałka kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private static void RestoreDB() { try { DataClasses1DataContext bd = new DataClasses1DataContext(DbmlTest.Properties.Settings.Default.DbmlTestNewConnectionString); if (bd.DatabaseExists()) { Console.WriteLine("Database exists"); bd.DeleteDatabase(); Console.WriteLine("Database deleted"); } bd.CreateDatabase(); Console.WriteLine("Database restored"); } catch (Exception ex) { Console.WriteLine("Error"); Console.WriteLine(ex.ToString()); } } |
Dla porządku dodam, że nie trzeba korzystać z konstruktora wymagającego connection stringa, lecz śmiało można użyć domyślnego. W demie mam zdefiniowane połączenia do dwóch baz, starej i nowej (docelowa baza do odtworzenia), dlatego wybrałem takie rozwiązanie.
Thunderbird i załączniki – ciekawostka
Pisząc kolejnego dziś maila zacząłem od treści nawiązującej do załączników, których jeszcze nie dodałem. Zdziwiony byłem w momencie gdy Thunderbird poinformował mnie o tym fakcie i zaproponował ich dodanie…
Mój artykuł na codeguru.pl – WCF w praktyce. Część 4 – Wcf Test Client
Zapraszam do lektury mojego kolejnego artykułu poświęconego technologii WCF, który ukazał się na portalu codeguru.pl. Tym razem na warsztat trafiło narzędzie ułatwiające testowanie nie tylko usług WCF, ale też zwykłych serwisów XML (czyli dobrze znanych asmx’ów).
Bezpośredni link do artykułu.
Jeżeli macie jakieś sugestie dotyczące tematyki, o której chcielibyście przeczytać na łamach codeguru.pl, to zapraszam do komentarzy – postaram się przygotować odpowiedni materiał.
PInvoke, Unsafe Code, WinAPI oraz Service Oriented Architecture na TGD.NET
Toruńska Grupa Deweloperów .NET ma przyjemność zaprosić na 23 spotkanie podczas którego odbędą się dwie prezentacje!
Maciej Grabek poprowadzi: “Service Oriented Architecture + .NET = WCF”
O czym będzie:
Celem wykładu jest przedstawienie w jaki sposób stworzyć projekt oparty o wzorzec SOA (ang. Service Oriented Architecture). Rozpoczniemy od zdefiniowania kontraktu usługi, następnie przyjrzymy się w jaki sposób możemy udostępniać usługę na świat, a na końcu stworzymy klienta, który bedzie z niej korzystał.
Agenda:
- Czym jest SOA i jak ma się do tego WCF
- ABC WCF czyli adres, wiązanie i kontrakt
- Hostowanie usługi
- Klient
- Podsumowanie
Sławek Orłowski poprowadzi: “Integracja kodu niezarządzanego z zarządzanym”
O czym będzie:
Moją intencją jest zaprezentowanie fragmentu platformy .NET, który bardzo często jest pomijany w opisie. Chodzi o integrację oprogramowania .NET z natywnymi bibliotekami (C, C++, WinAPI). Czytając rożnego rodzaju publikacje można odnieść wrażenie, że technologie takie jak PInvoke, czy “Unsafe Code” to “zło”. Nie należy ich używać. Będąc programistą .NET lepiej o nich również nie myśleć. Chciałbym to zmienić i zapewnić, że tego typu techniki są używane i stanowią część platformy .NET. Co więcej, wiele rozwiązań może być opartych wyłącznie na “mieszaniu” kodów.
Agenda
- Jak jest uruchamiana aplikacja .NET w systemie Windows. Krótki opis.
- Język C# i C++/CLI pod kątem integracji kodu zarządzanego i niezarządzanego.
- Konwersja typów. Typy proste i typy złożone.
- Platform Invoke oraz C++ Mixed Mode okiem praktyka (mam nadzieję).
- Integracja z projektami WinAPI z dostępem do kodu źródłowego i bez dostępu.
- Zapewnienie bezpieczeństwa projektom używającym bibliotek natywnych.
- Kod “Unsafe”.
- Visual Studio i zarządzanie projektami tego typu.
O prelegencie
Sławomir Orłowski – Pracownik Instytutu Fizyki UMK, wykładowca kierunku Informatyka Stosowana. Od roku 2009 posiada stopień naukowy doktora fizyki. W swojej pracy naukowej zajmował się m.in. bionformatyką, symulacjami komputerowymi, analizą obrazów i modelowaniem fizycznym oraz matematycznym. Jako dydaktyk odpowiedzialny jest za prowadzenie kursów technologicznych Java i .NET. Od 2008 jest pracownikiem Biura Badawczo-Rozwojowego firmy Optopol Technology, która od 2010 roku jest częścią grupy Canon. W ramach swojej pracy zajmuje się programowaniem C/C++, C# i C++/CLI, architekturą oprogramowania, integracją kodu oraz (od niedawna) analizą i zarządzaniem ryzykiem, walidacją oprogramowania medycznego oraz zarządzaniem jakością. Współpracuje z wydawnictwem Helion, czasopismami Hackin9 oraz Software Developers Journal. Chętnie uczestniczy również w różnorodnych projektach informatycznych jako freelancer. Jest autorem publikacji naukowych oraz książek i artykułów z dziedziny IT. Jest zwolennikiem idei Open Source. Stara się wspierać i działać aktywnie w Toruńskiej Grupie Developerów .NET. Strona domowa: http://www.fizyka.umk.pl/~bigman.
Gdzie i kiedy:
Spotkanie odbędzie się 9 listopada od godziny 17:00 w SALI S3 na Wydziale Matematyki i Informatyki UMK (ul. Chopina 12/18) . Wstęp na wykład jest wolny. Rejestracja na spotkanie jest obowiązkowa.
Serdecznie zapraszamy!
Aby otrzymywać newsletter Toruńskiej Grupy Deweloperow .NET skontaktuj się ze mną na adres podany na stronie grupy.
Skróty klawiaturowe Visual Studio
To do czego wszyscy dążymy w naszej do wygody. Na wygodę składa się też szybkość tworzenia kodu – która jest głównym celem biznesu – im szybciej możesz kodować(*), tym szybciej skończysz projekt i tym szybciej zaczniesz kolejny.
(*) przy tym samym poziomie jakości kodu
W tym celu niezbędne wręcz jest zapoznanie się przynajmniej z podstawowymi skrótami dostępnymi w Visual Studio. Na MTS 2010 podczas sesji Chrisa Grangera na temat Visual Studio 2010 IDE Tips & Tricks można było usłyszeć, że najnowszy produkt posiada ponad 4000 komend (w tym skrótów klawiaturowych). Oczywiście nie jest możliwe poznanie wszystkich, jednakże te podstawowe warto sobie zapamiętać.
Dla zwolenników zapamiętywania wzrokowego Microsoft przygotował zestawienie takich skrótów w formie PDF – gotowych do wydrukowania. Polecam te dla Visual Studio 2010 i dla Visual Studio 2008
Moje top shostcuts to:
Shift + Ctrl + B | Build |
F5 | Debug |
Ctrl + . | Zamiast Shift + Ctrl + F10 – “auto using” |
F7 | Kod C# |
Shift + F7 | Designer |
Ctrl + D, I | Immediate Window |
Ctrl + W, S | Solution Explorer |
Ctrl + K, C | Komentuj |
Ctrl + K, U | Odkomentuj |
F12 | Definicja medoty/klasy… |
i wiele innych, które konsekwentnie poznaję
Windows Phone 7 darmowy e-book
Podążając za newsem opublikowanym na codeguru.pl i codeproject.com zachęcam do lektury książki poświęconej programowaniu Windows Phone 7. Na blogu Microsoft Press znajduje się informacja na temat książki Charles’a Petzold’a oraz linki do darmowej wersji w formie e-booka i kodów źródłowych wykorzystywanych w książce. Po przeczytaniu początku mogę stwierdzić, że zapowiada się ciekawie
Code Definition Window – Szybki przegląd kodu
W życiu programisty bywają takie sytuacje (nawet dość często), że trzeba zapoznać się z czyimś kodem, czy też zwyczajnie przypomnieć sobie swój własny, napisany jakiś czas temu. Zdarza się tak, że podczas przekopywania się przez sterty plików w Visual Studio co chwilę korzystamy z opcji “Go to definition” z menu kontekstowego lub wybierając F12.
Takie działanie pozwala nam przeanalizować kod nawet gdy nazwy metod nie do końca odzwierciedlają jego działanie (są sytuacje, w których faktycznie może się “nie dać” i utrzymać nazwy metod rozsądnej długości :). Pomocne przy takiej analizie może być narzędzie “Code definition window”, które mozna otworzyć przez Menu -> View -> Code Definition Window lub przez wciśnięcie Ctrl + D, Ctrl + W
Okno to pozwala nam na szybki podgląd definicji metod, klas, właściwości itp, na których aktualnie ustawiamy nasz kursor.
Jednakże jeżeli najedziemy na metodę, która jest deklarowana w interfejsie wówczas Code Definition Window nie jest w stanie odszukać właściwej implementacji w przeciwieństwie do ReSharpera, który “rozumie” działanie interfejsów i szuka klas, które je implementują i poszczególnych interesujących nas metod.
Niemniej jednak jest to narzędzie przydatne i przede wszystkim dostępne w Visual Studio bez dodatkowych opłat. Mała rzecz, a cieszy