Archive for November, 2010

Załączników ciąg dalszy…

Jakiś czas temu pisałem o miłym zaskoczeniu dotyczącym załączników w Thunderbird. Dziś tak się złożyło, że skorzystałem z mojej poczty przez stronę i moje zaskoczenie było równie duże. Okazuje się bowiem, że GMAIL rownież zna słowa związane z załącznikami i potrafi nas o tym poinformować:

gmail attachment info

Podobnie sprawa wygląda w przypadku słowa “załączam”. Niestety machanizm nie działa dla np “przesyłam” i “załącznik” – te drugie moim zdaniem powinno się znaleźć na liście rozpoznawanych słów…

Werdykt – nie jest źle, ale mogłoby być lepiej :)


WCF i Handler “svc-Integrated” has a bad module “ManagedPipelineHandler” in its module list

Czas na trzeci już i ostatni błąd na który natrafiłem przy próbach wdrożenia serwisu WCF na serwer IIS. Brzmi on następująco:

Handler “svc-Integrated” has a bad module “ManagedPipelineHandler” in its module list Handler "svc-Integrated" has a bad module "ManagedPipelineHandler" in its module list

Podobnie jak w przypadku wcześniejszego błędu “The page you are requesting cannot be served because of the extension configuration” wystarczy wykorzystać narzędzie dostarczone z Visual Studio i dostępne w Visual Studio Command Prompt. Jest nim aspnet_regiis.exe. Podobnie jak poprzednie uruchamiamy je z parametrem -i. Zatem całość prezentuje się następująco:

aspnet_regiis.exe -i

aspnet_regiis.exe -i

Oczywiście należy pamiętać o uruchomieniu Visual Studio Command Prompt w kontekście administratora, gdyż w przeciwnym wypadku operacja ta się nie powiedzie.

Przyczyną tych błędów jest fakt, że zanim zainstalowałem serwer IIS miałem już zainstalowane Visual Studio. Jeżeli rozpatrujemy odwrotną kolejność instalacji, wowczas VS samodzielnie rejestruje i dodaje do systemu odpowiednie komponenty. Nie mniej jednak jeżeli podobnie jak ja zamienicie kolejność, wówczas te trzy posty mogą wam się przydać.

Dla przypomnienia wcześniejsze potyczki z błędami:

WCF i The page you are requesting cannot be served because of the extension configuration
WCF i This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.


WCF i This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

Drugi problem, na który natrafiłem przy instalacji serwisu WCF na IIS brzmiał

This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

Co w tej sytuacji zrobić. Okazuje się, że tym razem sprawa jest dużo prostsza niż w przypadku poprzedniego błędu. Tym razem wystarczy nieco namieszać w ustawieniach pól aplikacji serwera IIS. Problem polega na tym, że póla, w kontekście której uruchamiana jest usługa, działa w oparciu o niewłaściwą wersję .NET Framework. W moim przypadku ustawiona jest wersja 2.0, natomiast udostępniana przeze mnie usługa wymaga wersji 4.0. W związku z tym najwygodniej jest utworzyć w panelu zarządzania pólami aplikacji nową, na przykład o nazwie .NET 4 i w ustawieniach zaawansowanych wybrać odpowiednią wersję .NET Framework

application pool settings

Kolejnym krokiem jest wybranie dla naszej aplikacji nowo utworzonej póli z właściwą wersją Frameworka i gotowe.


WCF i The page you are requesting cannot be served because of the extension configuration

W momencie gdy chcemy uruchomić na serwerze IIS usługę stworzoną przy pomocy technologii WCF pojawia się nieoczekiwany błąd:

The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.

The page you are requesting cannot be served because of the extension configuration

Dzieje się tak w przypadku odwołania do plików *.SVC, które są odpowiedzialne za udostępnianie kontraktów usług na zewnątrz.

W jaki sposób go rozwiązać? Otoż pierwsze co należy zrobić, to uruchomienie Visual Studio Command Prompt w trybie administratora. Następnie należy udać się do katalogu:

%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation

W tymże katalogu znajduje się narzędzie ServiceModelReg.exe, które należy uruchomić z parametrem -i. W wyniku otrzymujemy informację o zainstalowaniu poszczególnych komponentów niezbędnych do uruchomienia usług WCF przy pomocy serwera IIS. Wynik działania polecenia widoczny jest poniżej.

 ServiceModelReg.exe -i result


Na dobry początek tygodnia – Productivity Power Tools

Jest poniedziałek rano, jak zawsze na początek tygodnia “prasówka” po ulubionych portalach tematycznych. Aby z tej okazji dać wam do przeczytania coś ciekawego postanowiłem zabrać się za Productivity Power Tools a dokładniej to, na co niewiele osób zwraca uwagę. Wszyscy rozpisują się o tym jak fajnie jest mieć dodatki, które PPT w sobie ma takie jak:

– podświetlanie aktywnej linii

– przypinanie i kolorowanie zkaładek oraz oznaczanie niezapisanych plików (czerwona kropka na zakładce)

– nakładka na dodawanie referencji pozwalająca je grupować i filtrować

– solution navigator, który pozwala szybciej poruszać się po logicznej zawartości solucji oraz pozwala na filtrowanie po nazwach, ale i stanach plików (otwarty, niezapysany itp)

– zaznaczanie całej linii potrójnym kliknięciem

– kombinacja Ctrl + Klik przenosi do definicji obiektu – w zastępstwie za F12 – zależy

– automatyczne domykanie nawiasów i tego typu dwuznaków (np cudzysłowy) – do tej funkcji trzeba się przyzwyczaić, gdyż na początku pojawia się nam ich nadmiar jeżeli domykamy je sami automatycznie :)

– wiele wiele innych…

Owszem – te dodatki są przydatne, ale NIE KAŻDY wie o tym co moim zdaniem jest najciekawsze! Chodzi tu mianowicie o okienko pomocy komend (Quick Access). Uruchamiamy je skrótem Ctrl + 3. Dlaczego jest ono moim zdaniem takie pomocne? Visual Studio posiada wbudowane ponad 4000 komend – tak twierdził na MTS 2010 Chris Granger z teamu Visual Studio. Nie wyobrażam sobie zapamiętania ich wszystkich, a nawet 10%. Przyznaję, że 1% jest jeszcze realny, ale gdzie tu do wykorzystania możliwości środowiska. Jeżeli korzystam z czegoś w 1%, to trzeba się zastanowić co zrobić, by zwiększyć ten współczynnik… Quick Access podpowiada możliwe komendy na podstawie wpisanej przez nas frazy. Wybraną opcję możemy zatwierdzić klawiszem Enter, co dodatkowo przyspiesza korzystanie z tej opcji. Dzięki temu nie ma konieczności pamiętania skrótów klawiaturowych (o ktorych pisałem w jednym z wcześniejszych postów), opcji włączania i wyłączania dodatkowych okien itp itd. Jedyne co jest potrzebne to świadomość istnienia pewnych możliwości i zwerbalizowanie ich w Quick Access. Dzięki temu osiągnięcie 10% (a nawet i więcej) wykorzystania możliwych (i pomocnych w pracy) komend staje się bardziej realna, a dodatkowo nie jest uciążliwą pamięciówką.

Productivity Power Tools można pobrać za darmo ze stron Visual Studio Gallery.


Kajakiem przez ocean – Google Maps vs Bing Maps

Dzisiejszy Teleexpress przyniósł niespodziewaną nowinę. Najpopularniejszym sposobem na znalezienie drogi z punktu A do punktu B jest zapewne Google Maps. Jak się okazuje nie można im do końca ufać, chyba że jest się kaskaderem, lub szalonym podróżnikiem (bijącym rekor świata)! Jeżeli wybierasz się samochodem z Tokio do Los Angeles, to GM proponuje wybrać się kajakiem przez ocean!

Postanowiłem sprawdzić jak to wygląda na Bing Maps. Okazuje się, że BM zwyczajnie przyznaje się do tego, że nie można obliczyć takiej trasy.

From Tokio to Los Angeles with Bing Maps

Jak widać, czasem co za dużo to niezdrowo 😛

P.S. Mam nadzieję, że nie znalazła się osoba, która na ślepo podążyła szlakiem google :)


Mój artykuł na codeguru.pl – WCF w praktyce. Część 5 – kilka słów o konfiguracji

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.

Bezpośredni link do artykułu


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):

Specify Stored Procedure Parameters

Co jednak zrobić, jeżeli to nie działa?

Należy w menu wybrać Tools > Options, następnie Keyboard jak na poniższym obrazku:

Tools_Options_Keyboard_KeyboardScheme

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.

Pobierz przykład


  • O mnie

    Maciej Grabek

    Moje profile na:

    MVP

    Codeguru.pl GoldenLine
    Twitter CodeProject

  • english version
  • Polecam

  • Copyright © Maciej Grabek. All rights reserved.
    Powered by WordPress
    %d bloggers like this: