Tag: WCF

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


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.


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ł.


Mój artykuł na codeguru.pl – WCF w praktyce. Część 3 – Klient

Dziś rano na codeguru.pl został opublikowany mój kolejny artykuł z serii “WCF w praktyce” pod tytułem “WCF w praktyce. Część 3 – Klient – korzystamy z usługi”. Część trzecia opisuje sposów tworzenia klienta usługi oraz najważniejsze rzeczy, które trzeba brać pod uwagę. Trzy pierwsze artykuły tworzą pewną zamkniętą część, zatem tym razem jest również dołączony kod solucji, z której pochodzą przykłady.

W przygotowaniu artykuł poświęcony aplikacji ułatwiającej testowanie serwisów jaką jest WcfTestClient.


WCF service error HTTP could not register URL

Na dobry początek pracy pod nową domeną postanowiłem napisać na temat błędu przy uruchamianiu serwisu WCF jakim jest “HTTP could not register URL …“. O rozwiązaniu tego problemu często się zapomina, a jest ono stosunkowo proste. Zacznijmy od początku, czyli od opisu przypadku.

Przypadek:
Tworzymy usługę WCF, która jest udostępniana poprzez aplikację konsolową i korzysta z wiązań z rodziny *HttpBinding. Podczas uruchamiania hosta otrzymujemy błąd:
“HTTP could not register URL http://+:8733/Design_Time_Addresses/SampleServiceLibrary/SampleService/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).”
Dla jasności – jeżeli udostępniamy metadane dotyczące serwisu przy pomocy MEX, to również otrzymamy taki błąd.

Oczywiście podany przeze mnie adres może być inny, gdyż zakres http://+:8733/Design_Time_Addresses jest wykorzystywany przez WcfServiceHost.exe, który automatycznie uruchamia się dla bibliotek WCF.

Rozwiązanie:
W przypadku gdy korzystamy z *HttpBinding konieczne będzie umożliwienie naszemu procesowi nasłuchiwania żądań przychodzących po http. Podążając zatem za wskazanym w błędzie adresem dowiadujemy się, że należy dodać nam prawa do takiego nasłychu. W tym celu korzystamy z polecenia NETSH w konsoli cmd:
netsh http add urlacl url=http://+:8733/Design_Time_Addresses/SampleServiceLibrary/SampleService/ user=maciek

W pole URL należy oczywiście wpisać adres, na którym chcemy działać. Po wykonaniu tego polecenia nasz serwis uruchomi się poprawnie. Jeżeli okaże się, że nie jest nam już potrzebne przechwytywanie tego adresu, wówczas możemy go usunąć wpisując następujące polecenie:

netsh http delete urlacl url=http://+:8733/Design_Time_Addresses/SampleServiceLibrary/SampleService/


Artykuł na CodeGuru.pl – WCF w praktyce. Część 2 – Host

Na portalu codeguru pojawił się mój drugi artykuł na temat WCF, co zapowiadałem wcześniej. Zapraszam do lektury.

Bezpośredni link do artykułu


Artykuł na codeguru.pl – WCF w praktyce. Część 1.

Zapraszam serdecznie do lektury mojego pierwszego z serii artykułów poświęconych praktycznemu podejściu do technologii WCF. W przygotowaniu są już kolejne!

Bezpośredni link do artykułu


WCFTestClient – edycja konfiguracji testowanego serwisu

Pewnego razu korzystając z WcfTestClient przyszło mi dla testów zmienić konfigurację wiązań (binding). Nie byłem pewien, czy narzędzie to udostępnia taką możliwość, ale zostałem mile zaskoczony. Posłużę się bibliteką z poprzedniego posta. Pod prawym przyciskiem w drzewie “projektu” WcfTestClient dla pliku Config File jest dostępne kilka opcji – między innymi poszukiwana przeze mnie zmiana konfiguracji.

Edycja odbywa się poprzez SvcConfigEditor, który jest całkiem wygodny i pozwala uniknąć niektórych błędów konfiguracji.

W razie konieczności można oczywiście przywrócić domyślną konfigurację wybierając opcję “Restore to Default Config”.


WCFTestClient – korzystanie z tablic

Jeżeli mamy do przetestowania przy pomocy WcfTestClient serwis oferujący kontrakt z obiektami typu List<someType> lub someType[] na pierwszy rzut oka może to być problem. Żeby móc to zaprezentować zmieniłem nieco standardowo wygenerowany przez Visual Studio projekt WcfServiceLibrary:

  1     [DataContract]
  2     public class CompositeType
  3     {
  4         [DataMember]
  5         public List<int> IntListProperty { get; set; }
  6
  7         [DataMember]
  8         public int[] IntArrayProperty { get; set; }
  9
10         [DataMember]
11         public string ResultString { get; set; }
12     }

 

Po uruchomieniu projektu (F5) uruchamia się WCF Service Host i WcfTestClient

Aby wprowadzić wartości, które nas interesują należy w polu value wpisać ile ich chcemy podać. Wówczas jak poniżej wygenerują się odpowiednie pola i będziemy mogli je uzupełnić.

Analogicznie sprawa wygląda dla typów przekonwertowanych na ArrayOfSomeType.


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