2009-12-04 15 views
7

Jestem twórcą usługi WCF. Moi testowi klienci działają z tym dobrze. Ale jeśli chodzi o rzeczywistych klientów (przy użyciu tego samego proxy klienta), nie powiedzie się. Ta sama usługa WCF współpracuje z netTcpBinding ten błąd występuje tylko z netNamedPipeBinding, nawet z ConcurrencyMode = ConcurrencyMode.SingleNie znaleziono nazwy potoku podczas korzystania z WCF netNamedPipeBinding

Oto wyjątek

nie było żadnego punktu końcowego słuchania w net.pipe: // localhost/MyService , która może zaakceptować wiadomość. Jest to często spowodowane nieprawidłowym adresem lub działaniem SOAP. Zobacz InnerException, jeśli obecny, po więcej szczegółów.

Server ślad stosu: w

System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName (Uri uri) w System.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey (EndpointAddress adres Uri via) pod adresem System.ServiceModel.Channels.CommunicationPool`2.TakeConnection (EndpointAddress adres, adres Uri przez, Timeout Timeout, klucz TKey &) pod numerem System.ServiceModel .Channels.ConnectionPoolHelper.EstablishConnection (TimeSpan timeout) w System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen (TimeSpan timeout) w System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) w System.ServiceModel.Channels .ServiceChannel.OnOpen (TimeSpan timeout) w System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) w System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (TimeSpan czasu przerwy CallOnceManager kaskady)
w System.ServiceModel.Channels.ServiceChannel.EnsureOpene D (TimeSpan timeout) w System.ServiceModel.Channels.ServiceChannel.Call (string działania logiczna jednokierunkowy, działanie ProxyOperationRuntime, Zadanie [] iny, obiekt [] out, zakresu czasu timeout) w System.ServiceModel. Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime działanie) w System.ServiceModel.Channels.ServiceChannelProxy.Invoke (iMessage wiadomości)

wyjątek rethrown w [0] w System.Runtime.Remoting.Proxies .RealProxy.HandleReturnMessage (wiadomość głosowa reqMsg, iMessage retMsg) w System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData typu Int32) w

wyjątek wewnętrzny

PipeException „Punkt końcowy rury" net.pipe: // localhost/MyService "nie można znaleźć na twoim lokalnym komputerze."

+1

Dla jasności - Twój klient i Twoja usługa są na tym samym komputerze? Jeśli nie nazwane potoki nie będą działać ... – Murph

+0

@Murph, tak, są one na tym samym komputerze. –

+0

Udało ci się to rozwiązać? Mam ten sam problem. – Tsury

Odpowiedz

18

Śledzenie stosu pokazuje, że stos kanału WCF po stronie klienta nie powiodło się podczas próby uzyskania z adresu URL usługi rzeczywistej nazwy nazwanego pliku rura używana przez usługę. Usługa publikuje nazwę potoku (która jest identyfikatorem GUID, który zmienia się przy każdym ponownym uruchomieniu usługi), umieszczając małą strukturę w polu a named shared memory section, która zawiera identyfikator GUID jako jedno z jego pól. Nazwa używana w sekcji pamięci współużytkowanej pochodzi od adresu URL usługi, stosując algorytm, który jest kompilowany zarówno po stronie serwera, jak i po stronie klienta, kod WCF dla NetNamedPipeBinding.

Wyjątek zgłoszony w pytaniu naprawdę oznacza, że ​​po zastosowaniu algorytmu do adresu URL usługi w celu wymyślenia nazwy, kod po stronie klienta nie mógł otworzyć dojścia do sekcji pamięci współużytkowanej o tej nazwie. Może to oznaczać, jak stwierdza komunikat wyjątku, że nie ma nasłuchu usługowego na adresie URL usługi używanym do wyprowadzenia nazwy. Ale może to zamiast tego oznaczać, że sekcja pamięci istnieje, podobnie jak usługa, ale kod po stronie klienta nie działa w kontekście bezpieczeństwa, który umożliwia mu dostęp do pamięci współdzielonej.

Na platformach Windows wcześniejszych niż Vista jest mało prawdopodobne, aby klientowi WCF kiedykolwiek brakowało uprawnień zabezpieczeń do otwierania pamięci współużytkowanej, od tego należy odczytać identyfikator GUID potoku, a następnie połączyć się z potokiem usługi. Ale na platformach Vista i nowszych są nowe mechanizmy bezpieczeństwa, które powodują, że jest to dużo bardziej powszechny scenariusz awarii.

Vista wprowadził pojęcie różnych przestrzeni nazw dla nazwanych obiektów jądra: istnieje globalna przestrzeń nazw dla całego komputera i prywatna przestrzeń nazw dla każdej sesji logowania. Kod klienta NetNamedPipeBinding spróbuje obu przestrzeni nazw podczas wyszukiwania sekcji pamięci współużytkowanej, która anonsuje nazwę potoku. Jeśli serwer utworzył pamięć współużytkowaną przy użyciu globalnej nazwy lub jeśli usługa i klient działają w tej samej sesji logowania, klient znajdzie to, czego szuka. Jeśli jednak usługa nie może utworzyć obiektu w globalnej przestrzeni nazw (zawsze stara się to zrobić jako pierwsza), to wróci do tworzenia przestrzeni prywatnej sesji, a wtedy tylko klienci pracujący w tej samej sesji będą mogli zobaczyć to. Tworzenie obiektów jądra globalnej przestrzeni nazw wymaga specjalnego uprawnienia w Vista i nowszych platformach, które zwykle będą miały tylko procesy usługi Windows i aplikacje z uruchomionym systemem "As Administrator". Typową pułapką jest próba utworzenia klienta w usłudze Windows próbującej połączyć się z usługą WCN NetNamedPipe hostowaną w aplikacji uruchomionej w sesji użytkownika interaktywnego.

Mechanizm integralności systemu Vista może również zapobiegać domniemanemu nawiązywaniu połączenia klienta z usługą WCF NetNamedPipeBinding, jeśli kod klienta działa w kontekście niższej integralności (np. Wtyczki przeglądarki) niż kod obsługujący tę usługę.

Wyobrażam sobie, że objawy zgłoszone w pytaniu, z klientami testowymi działającymi, ale z rzeczywistymi klientami nie działającymi, są prawie na pewno spowodowane faktem, że kontekst bezpieczeństwa rzeczywistych klientów jest niezgodny z kontekstem hosta usługi, dla tego lub innego z tych powodów.

+0

To była dokładna odpowiedź na mój rzeczywisty problem. Aby uzyskać dokument, po prostu musiałem uruchomić Visual Studio z uprawnieniami administratora, aby działał. Uruchomienie zarówno klienta, jak i serwera z wiersza poleceń było rozwiązaniem. Wielkie dzięki za szczegółową odpowiedź! – BeardinaSuit

+1

Tak, ale co, jeśli nie chcę, aby działał jako administrator? Moje procesy są w tej samej sesji. – Tsury

3

punkt końcowy używany przez klienta musi dopasować końcowy narażone przez usługi WCF. Oznacza to, że adres/wiązania/kontrakt krotka określonego punktu końcowego klient musi dokładnie mecz adres/wiązania/umowy tuple punktu końcowego odsłoniętego przez twoją usługę WCF.Jeśli używasz podejścia app.config, upewnij się, że wszystko jest poprawnie napisane w obu plikach konfiguracyjnych usługi WCF i klienta. Jeśli dodajesz punkty programowe programowo, upewnij się, że nie masz ". t Niepoprawnie wpisane cokolwiek w kodzie

+0

Dziękuję za opublikowanie tego, ale to nie była moja sprawa. –

+0

Czy logowanie ma znaczenie w tym przypadku? Jeśli proces posiadany przez użytkownika może uzyskać dostęp do nazwanych potoków utworzonych przez innego użytkownika? –

+0

Nie wiem na pewno. Używam nazwanych potoków do komunikowania się z mojego lokalnego klienta logowania z moją usługą Windows na tym samym komputerze, bez problemu. –

4

Kolejna możliwość naprawienia tego problemu głównego podczas wyszukiwania tego błędu i natknięcia się na ten post - w przypadku wystąpienia błędu, który nie zawiera adresu net.pipe pod adresem URL (tj.http://localhost:1234/MyService/etc/) upewnij się, że, że Adapter Odbiornika USB.Pipe Usługa systemu Windows jest rozpoczęta. (Zacząłem również Adapter odbiornika Net.Tcp)

Usługa nie jest włączona lub uruchomiona w niektórych scenariuszach, zwłaszcza podczas wdrażania na zdalny serwer, na którym nie zainstalowano wielu narzędzi programistycznych, które aktywnie używają te usługi. Uruchomienie usługi naprawiło problem.

+0

To był dokładnie mój problem ... moja strona działała poprawnie, a potem nagle się zatrzymała. Uruchomiłem usługę i wszystko poszło dobrze potem. – Arnaud

+0

Alleluja! Dla przyszłych czytelników ::: Aby zainstalować tę usługę Windows, uważam, że ścieżka jest ::: "Włącz lub wyłącz funkcje systemu Windows" /// ".NET Framework 4.6 Usługi zaawansowane" /// "Usługi WCF" /// "Aktywacja nazwanego rurociągu" (jeśli ta usługa nie pojawia się na liście usług Windows, musisz ją zainstalować). Dzięki! – granadaCoder