Cześć,

mam pewien problem z wywołaniem metody udostępnianej przez serwis WCF. Solucja posiada kilka projektów, tj. Serwer (WCF web service), Klient (posiada 'service reference' do Serwer), GuiTest (która jednocześnie tworzy i otwiera obiekt ServiceHost, czyli usługę webową w trybie self-hosted) oraz Gui (która wywołuje metody z instancji Serwer uruchomionej poprzez GuiTest). Ze względu na wymagania biznesowe architektura powinna pozostać, jaka jest. Klient i Gui to kod produkcyjny, Serwer i GuiTest to kod testowy (docelowo będzie usługa udostępniona przez inną firmę).

Wszystko jest OK, gdy z poziomu GuiTest tworzę obiekt ServiceHost, mogę również prawidłowo komunikować się z Serwerem z poziomu Gui (wywoływać metody serwisu). Potrzebuję jednak drugi testowy interfejs (i jego implementację), aby móc wywołać inne metody Serwera z poziomu GuiTest. Udaje mi się to, gdy utworzę nowy obiekt ServiceHost. Gdy jednak chciałbym wywołać metodę serwisu tuż przed zamknięciem instancji ServiceHost, niestety mi się to nie udaje.

Innymi słowy mogę wywołać metodą tylko, jeśli w tej samej metodzie nie zamykam ServiceHost. Pseudokod jest taki:

private static void Zamknij()
{
   WywołajMetodęSerwisu();
   System.Threading.Thread.Sleep(5000);
   _serviceHost.Close();
}

W powyższej metodzie Zamknij() działanie WywołajMetodęSerwisu() jest prawidłowe jeśli usunę _serviceHost.Close(). Jeśli go nie usunę, to w zależności od implementacji WywołajMetodęSerwisu() albo nie działa _serviceHost.Close(), bo przekracza maksymalny timeout, czyli WywołajMetodęSerwisu() w ogóle się nie wykonuje (gdy WywołajMetodęSerwisu() działa w nowym wątku), albo WywołajMetodęSerwisu() się wysypuje (bo nie potrafi się skontaktować z serwisem, gdy WywołajMetodęSerwisu() próbuje wywołać meetodę bez tworzenia nowego wątku).

Próbowałem innych rzeczy, tzn. samo _serviceHost.Close() przenieść do nowego wątku (wtedy mogę zrobić Otwórz(), Zamknij(), Otwórz(), ale już kolejne Zamknij() nie działa). Sprawdziłem również alternatywne implementacje WywołajMetodęSerwisu(), tzn. albo w nowym wątku (Thread wątek = new Thread() { implementacja }), albo w tym samym. Również albo wywołanie metody poprzez wywołanie metody z projektu Klient, albo wywołanie przez kanał (channel) otwarty z fabryki (ChannelFactory). Próbowałem ChannelFactory<IMójInterfejs>, ale też chciałem skorzystać z własnej implementacji ChannelFactory (tutaj jednak były nieobsłużone wyjątki z poziomu .NET-owych assemblies, o których prawie nic nie mogłem znaleźć w dokumentacji MSDN, StackOverflow i innych źródłach).

Zmienna _serviceHost znajduje się w statycznej klasie.

W jaki sposób mogę wywołać metodę z self-hosted usługi webowej WCF z poziomu tego samego projektu i jednocześnie zamknąć ServiceHost (który jest potrzebny do utworzenia self-hosted web service) w tej samej metodzie?

Z góry dzięki!