2012-06-13 14 views
5

Pytanie dotyczy danych statycznych w klasie.Cykl życia usługi WCF obsługiwanej w IIS

Jeśli to jest klasa usług, to myślę, że tryb tworzenia instancji jest ważny. Ale co się stanie, jeśli mam inną samodzielną klasę singleton?

Czy mogę utworzyć obiekt, który będzie dostępny dla wszystkich połączeń telefonicznych? Czy usługi IIS mają tę pamięć DLL w pamięci na zawsze, tak aby singleton był cały czas w pamięci?

Jak ustawić obiekt dla wszystkich wywołań klienta WCF? Czy można to zrobić w usługach IIS lub czy powinienem obsługiwać usługę WCF w usłudze Windows?

Odpowiedz

2

Sprawdzony problem w moim lokalnym IIS.

To jest mój kod.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

Przy domyślnej konfiguracji IIS jeden proces jest uruchamiany dla każdego pobrania aplikacji, a ten kod działa zgodnie z oczekiwaniami. Wynik jest zwiększany w każdym wywołaniu serwisowym.

Ma to sens, ponieważ InstanceContextMode nie zarządza wątkami. Kontroluje tylko okres życia wynoszący InstanceContext.

Wiedząc, że nadal nie możemy brać pod uwagę używania zmiennych statycznych dla danych zmiennych jako najlepszej praktyki. Usługi IIS można skonfigurować jako "Ogród WWW". Ta konfiguracja oznacza, że ​​więcej niż jeden proces roboczy jest dozwolony dla puli aplikacji, a każdy proces będzie miał własną kopię zmiennej statycznej.

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

Jak mogę zrobić jakiś obiekt będzie dostępny dla wszystkich połączeń klienckich WCF? Czy można to zrobić w usługach IIS lub czy powinienem obsługiwać usługę WCF w usłudze okienkowej ?

Obiekty powinny być przechowywane w pamięci trwałej, takiej jak baza danych lub rozproszona pamięć podręczna. IIS wciąż pozostaje doskonałym gospodarzem usług i zapewnia wszystko, co może zrobić usługa Windows oraz wiele więcej.

2

Will dostarczyć pewnych wskazówek opartych na krótkim kontekście podałeś

  • Jeśli masz klasę statyczną, stan utrzymuje się tak długo, jak masz dostęp do tego samego serwera proxy WCF. Host (usługa IIS lub Windows) nie ma znaczenia.

  • Jeśli chcesz zachować "globalne zmienne statyczne" we wszystkich żądaniach klientów, dlaczego nie przechowujesz ich w repozytorium (plik/baza danych/itp.)?

  • Jeśli chcesz zachować stan dla każdego żądania klienta, możesz sprawdzić "Trwałe usługi WCF" (related thread). Użyłem go wcześniej - działa więc pod warunkiem, że twój scenariusz wymaga zachowania sesji i jest świadomy kosztów wydajności.

Mam nadzieję, że to pomoże.

+0

Nie dostaję pierwszego punktu (co dokładnie masz na myśli: tego samego proxy wcf?) Drugi punkt, ponieważ chcę załadować niektóre dane z db i podać je klientom (prędkość jest istotna). Trwałe usługi z drugiej strony, o ile wiem, wykorzystują pliki cookie do przechowywania danych sesji klienta. Więc hosting wcf w usłudze windows właściwy wybór, aby przejść? – John

+1

@John - W pierwszym punkcie, przez "proxy WCF", miałem na myśli obiekt utworzony po stronie klienta, aby uzyskać dostęp do usługi. Załóżmy, że używasz jednego proxy WCF do wykonywania wielu zgłoszeń serwisowych, klasa statyczna (po stronie serwera) pozostanie taka sama. Nie doradziłbym tego, chyba że połączenia serwisowe są ze sobą powiązane. O twoim drugim pytaniu podoba mi się pomysł użycia usługi Windows do utrzymania zmiennych globalnych. Nie użyłem go wcześniej, ale spróbuj. – Channs

+0

Rozumiem, że wiem. Dziękuje za twoją sugestię. – John

Powiązane problemy