[WCF][IIS] Uruchomienie WCFa na IIS 7.0

0

Siema
Parę długich dni próbuję już rozwiązać pewien problem. Chcę na IISie odpalić serwis WCFowy, ale nijak mi nie idzie.
Najpierw parę ogólnych informacji:

  • Windows Vista Home Premium
  • IIS 7.0 (domyślnie w viście)
    Dodam na początku, że serwis WCFa jest raczej ok, bo na development serwerze działa ok.

Do konkretów. Uruchomiwszy Menadżera Internetowych Usług Informacyjnych dodałem nową pulę aplikacji, nazwawszy ją sobie DataServer, ustawiwszy jej architekturę .NETa na 2.0.50727, zarządzany tryb potokowy na Zintegrowany. Pula aplikacji uruchomiona.
Do witryn dodałem sobie nową witrynę o nazwie DataServer. Ścieżka fizyczna wskazuje na folder D:\DataServer, w którym to folderze znajduje się output z kompilacji DataServera (czyli mojego projektu WCF, w skrócie: dwie dllki, jedna wcfowa, druga odpowiadająca za połączenie z bazą danych przez LINQ2SQL), a także plik DataServer.svc i Web.config, oba wzięte z projektu. Witryna należy do puli DataServer, jest powiązana z portem 8000 (czyli wołam ją przez http://localhost:8000/DataServer.svc
Wydaje mi się, że o niczym nie zapomniałem.

Wchodzę więc w przeglądarkę, wpisuję odpowiedni adres (podany wyżej), a w zamian otrzymuję komunikat:

Błąd serwera w aplikacji '/'.
Nie znaleziono typu „DataServer.DataServer” udostępnionego jako wartość atrybutu Service w dyrektywie ServiceHost. 
Opis: Podczas wykonywania bieżącego żądania sieci Web wystąpił nieobsługiwany wyjątek. Aby uzyskać dodatkowe informacje o błędzie i miejscu jego występowania w kodzie, przejrzyj ślad stosu. 

Szczegły wyjątku: System.InvalidOperationException: Nie znaleziono typu „DataServer.DataServer” udostępnionego jako wartość atrybutu Service w dyrektywie ServiceHost.

Błąd źrdła: 
Podczas wykonywania bieżącego żądania sieci Web został wygenerowany nieobsługiwany wyjątek. Informacje dotyczące pochodzenia i lokalizacji wyjątku można zidentyfikować przy użyciu poniższego śladu stosu wyjątku. 


Ślad stosu: 

[InvalidOperationException: Nie znaleziono typu „DataServer.DataServer” udostępnionego jako wartość atrybutu Service w dyrektywie ServiceHost.]
   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +4077562
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +11666348
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +42
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479

[ServiceActivationException: Nie można aktywować usługi „/DataServer.svc” z powodu wystąpienia wyjątku podczas kompilacji. Komunikat wyjątku: Nie znaleziono typu „DataServer.DataServer” udostępnionego jako wartość atrybutu Service w dyrektywie ServiceHost..]
   System.ServiceModel.AsyncResult.End(IAsyncResult result) +11536522
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
   System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context) +23
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Informacje o wersji: Wersja Microsoft .NET Framework:2.0.50727.4200; Wersja ASP.NET:2.0.50727.4016

Widziałem po necie rozwiązania typu: stwórz nową solucję, dodaj w niej te projekty i zbuduj, bedzie działało. Niestety, nie u mnie.

Wpis w pliku .svc wygląda tak:
<%@ ServiceHost Language="C#" Debug="false" Service="DataServer.DataServer" CodeBehind="DataServer.svc.cs" %>

Przy okazji napiszę też o problemie z uruchomieniem jakieś strony aspx. Mam stronkę wygenerowaną przez VS do hostowania app Silverlightowej. Została dodana witryna do IISa, na port 9000. Odpalenie pliku html przez przeglądarkę działa ok, silverlightowa app się wyświetla. Ale chciałbym odpalić stronę .aspx, a tu jest gorzej.

Błąd serwera w aplikacji '/'.
Błąd kompilacji 
Opis: Wystąpił błąd w czasie kompilowania zasobu wymaganego do obsłużenia tego żądania. Przejrzyj poniższe szczegłowe informacje o błędzie i zmodyfikuj odpowiednio kod źrdłowy. 

Komunikat o błędzie kompilatora: CS0016: Nie można zapisać danych w pliku wyjściowym „c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\8716a455\79ae8f70\App_Web_changesystem.aspx.cdcab7d2.t69pyjyx.dll” — „Odmowa dostępu. ”.

naczytałem się o problemach w dostępie, zmieniałem ścieżki do zmiennych środowiskowych TEMP i TMP na c:/temp, gdzie wszyscy userzy mieli wszystkie prawa, praw dla folderu z errora nie umiem zmienić dla usera IIS_IUSR, nie widzę nigdzie użytkownika "Network Service", domyślam się że takiego być nie powinno, a jakiś inny user pełni jego rolę, jak sprawdzić który albo coś? Jak naprawić błąd i odpalić?

Z IISa jestem w miarę zielony, więc nie krzyczcie jak głupoty opowiadam ;)

Pzdr
Pako

0
pako1337 napisał(a)

Ale chciałbym odpalić stronę .aspx, a tu jest gorzej.

Błąd serwera w aplikacji '/'.
Błąd kompilacji 
Opis: Wystąpił błąd w czasie kompilowania zasobu wymaganego do obsłużenia tego żądania. Przejrzyj poniższe szczegłowe informacje o błędzie i zmodyfikuj odpowiednio kod źrdłowy. 

Komunikat o błędzie kompilatora: CS0016: Nie można zapisać danych w pliku wyjściowym „c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\8716a455\79ae8f70\App_Web_changesystem.aspx.cdcab7d2.t69pyjyx.dll” — „Odmowa dostępu. ”.

naczytałem się o problemach w dostępie, zmieniałem ścieżki do zmiennych środowiskowych TEMP i TMP na c:/temp, gdzie wszyscy userzy mieli wszystkie prawa, praw dla folderu z errora nie umiem zmienić dla usera IIS_IUSR, nie widzę nigdzie użytkownika "Network Service", domyślam się że takiego być nie powinno, a jakiś inny user pełni jego rolę, jak sprawdzić który albo coś? Jak naprawić błąd i odpalić?

Nie wiem o jakim TEMP i TMP mowisz, ASP.NET na IIS zawsze trzyma tymczasowe wyniki kompilacji w "c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files" i szczerze mowiac nie slyszalem zeby dalo sie to zmienic w tak prosty sposob jak modyfikacja zmiennychśrodowiskowych..
Ogólnie, ten proces ktory zajmuje sie kompilacja musi miec tam prawo do odczytu,zapisu i usuwania i kropka. W menedzerze IIS'a mozesz zmieniac uzytkownika na ktorym procesy IISowe chodza, wiec mozesz tez tam podejrzec JAKI uzytkownik obecnie jest uzywany do tego celu i nadac mu wymagane uprawnienia tamże. Jeżeli nie dokopiesz sie do tej informacji, albo tez w panelu IIS na siódemce znowu poprzestawiali wsyzstko i/lub poukrywali informacje -- ściagnij FileMonitor albo ProcessMonitor z www.microsoft.com/technet/sysinternals ustaw filtr na sciezke zawierajaca "Temporary ASP.NET Files", pusc monitoring i sprobuj wejsc na strone aspx. Monitoring natychmiast pokaze Ci ze procesy-takie-a-takie chcialy dotknac tego katalogu, i przy jakims bedzie informacja o ERROR:ACCESS DENIED lub podobna. klik na to, wlasciwosci/szczegoly, i tam w info o procesie zobaczysz PEŁNĄ NAZWĘ UŻYTKOWNIKA ktory byl uzywany przez pechowy proces. Teraz tylko zostaje mu nadac uprawnienia i na pewno ruszy - albo znajdzie sobie kolejny inny blad :)

Zeby ASP.NET na IIS ruszyl poprawnie, w >6 miejscach musza byc dobrze uprawnienia nadane.. Najszybciej to zalatwic instalatorem .Net'a, z drobna uwagą.. Odkad pamietam - aby sie zainstalowalo poprawnie, najpierw trzeba zainstalowac IIS, potem .Net'a. Jesli .Net pierwszy sie zainstaluje - czeka Cie reczna robota choćby z magicznym 'aspnet_regiis-i'. U Ciebie to chyba jednak nie ten przypadek, bo jak widac IIS juz przeszedl w ogole do kompilacji. Farciarz:)

0

Hmm, o TEMP i TMP to gdzieś na necie wyczytałem, że trzeba je ustawić gdzieś albo dać uprawnienia na te katalogi, gdzie wskazują. Natomiast zmiana uprawnień na tym folderze, o którym piszesz nie przechodziła mi. Ale widać coś źle robiłem albo coś, się powalczy i zrobi to, żeby w końcu ruszyło. Dzięki za info.

A co do problemu WCFowego jak rozumiem nikt inny nie wie, jak dać sobie z nim radę? ;)

0

Dobra, aspx dało radę, faktycznie wystarczyło zmienić użytkownika na innego (w tym wypadku na mojego głównego, co jest raczej kiepskim rozwiązaniem, ale dla mnie to raczej bez znaczenia). Dzięki Wężu :)

Teraz jeszcze wcfa ruszyć i będę w domu ;)

0

Kolejnego posta napiszę, mam nadzieję, że nikt mnie nie pogoni. Być może komuś się przyda informacja:
cały problem polegał na tym, że dllki, z których korzysta serwis WCFowy, hostowany w IISie, muszą znajdować się w katalogu "/bin", a nie na tym samym poziomie co plik *.svc. No albo w GACu. Sporo szukałem, grzebałem i nie natknąłem się na tę informację, dopiero czytając sobie książkę o wcfie o tym wspomniano, spróbowałem i działa.
Ot, nie spodziewałem się tego...

0

hmm.. to moze byc "ficzer" samego IIS'a.. z tego co pamietam z zachowania sie asp'a, to on tez wszystkie dllki wrzuca w website/bin.. moze to wiec IIS w momencie poszukiwania brakujacych assemblies domyslnie szuka w GAC i ./bin/ ? nie sadze zeby byl to wymog ze strony samego serwisu, gdyz serwis jako aplikaja szczerze ma gdzies gdzie one leza.. to jego kontener (->iis/website/etc) ma za zadanie poskladac mu srodowisko tak aby te klasy po prostu byly dostepne

0

Też tak podejrzewam. A jako, że nigdy przedtem nie miałem do czynienia z IISem, a już tym bardziej hostowaniem w nim web service'ów czy WCFów, to nie wiedziałem o tym, zaś treść błędu mnie na to nie naprowadzała ;)
A już zwłaszcza mylące były głosy na forach, że błąd faktycznie jest i przebudowanie projektów w innej solucji powodowało, że wszystko działa. No i szukałem głównie nie tam gdzie trzeba.

Grunt, że się wyjaśniło, a i ja z całej historii mądrzejszy wychodzę :)

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