2010-10-01 16 views
5

Mam prostą usługę WCF, z którą komunikuję się asynchronicznie.Połączenia WCF przekraczające maksymalne połączenia podczas korzystania z asynchronicznego wzorca

To, co nie podoba się, gdy wywołanie EndServiceMethod(IASyncResult)

Jeśli zapomnę wywołać metodę Close(), usługa będzie faktycznie zostawić otwarte połączenie, a następnie wszystkie pozostałe połączenia nie powiedzie się po WCF osiągnie to max liczba jednoczesnych połączeń z wyjątkami limitu czasu.

Próbowałem przy użyciu atrybutu do umowy o świadczenie usług, które nie wydają się mieć żadnego wpływu na stan połączenia z usługą [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] .

Być może wprowadziłem go niepoprawnie?

Wszelkie pomysły i sugestie.

Próbuję zlokalizować wzór zachowania dla WCF, który pozwala klientom na żądanie, a następnie serwer, aby odpowiedzieć na żądanie, a następnie założyć, że połączenie zostało zakończone i może zostać zakończone.

Odpowiedz

4

To naprawdę trudny problem.

Z jednej strony, jeśli nie zamkniesz połączenia, pozostanie otwarte aż do przekroczenia limitu czasu (1 min), pod obciążeniem osiągniesz maksymalne połączenie (domyślnie 10).

Z drugiej strony wywołujesz usługi asynchronicznie, więc jeśli zamkniesz połączenie przed odebraniem połączenia zwrotnego, oddzwanianie zostanie utracone.

Istnieje kilka rzeczy, które można spróbować:

  • zwiększyć max połączeń
  • zamknąć połączenie w programie obsługi połączenia zwrotnego
  • skrócenia czasu oczekiwania
+0

Byłem zamykając go w uchwycie zwrotnej i że wydaje się działać. Chyba miałem nadzieję na bardziej eleganckie rozwiązanie, które pozwala tej pracy dzielić się po stronie serwera. – Beta033

+0

To jest właściwie najlepsze rozwiązanie. W zależności od kodu może być w stanie policzyć liczbę procedur obsługi wywołań zwrotnych i liczbę razy, kiedy zadzwoniłeś i zobaczysz, czy pasują do siebie. –

+0

Z wyjątkiem tego, że będę miał wielu klientów, z których każdy może mieć wiele połączeń. jak to zrobić publiczne usługi wcf? Nie mogę sobie wyobrazić, że spodziewają się, że ich klienci zawsze będą dobrzy pod względem zamykania połączeń, gdy skończą. – Beta033

0

I nie wiem, czy to pomaga:

Możesz ustawić wiązanie tak, aby

  • zabezpieczeń jest ustawiony na none
  • Niezawodne sesje są wyłączone

    <wsHttpBinding> 
         <binding name="MyWsHttpBinding"> 
          <reliableSession enabled="false"/> 
          <security mode="None" /> 
         </binding> 
        </wsHttpBinding> 
    

Odkryłam, że w ten sposób mogę otworzyć nieograniczoną liczbę kanałów i „zapominają” zamknij je.

Następnie musisz zapytać, czy jest to akceptowalna konfiguracja dla twoich okoliczności.

0

Zamknięcie dowolnego rodzaju połączenia, gdy już go nie potrzebujesz, to tylko podstawowa odpowiedzialność programisty. Nie ma na co narzekać. Zamknij połączenie i nie będziesz mieć tego problemu. Próba rozwiązania brakujących wywołań Close w jakikolwiek inny sposób jest nonsensem.

+0

Myślę, że brakuje ci sensu. chodziło o to, aby umożliwić serwerowi obsługę tego i nie zmusić klienta do jego utrzymania. w ten sposób katastrofalne awarie komunikacyjne nie pozostawią połączenia otwartego na serwerze i nie zajmą miejsca. – Beta033

+0

Nie, nie jestem. Połączenia asynchroniczne nie zastępują potrzeb zamknięcia połączenia. Btw. wspomniałeś, że instanowanie PerCall nie działa dla ciebie. Z jakiego wiązania korzystasz? Instancja PerCall działa tylko z wiązaniem, które nie korzysta z transportu, niezawodności lub bezpieczeństwa. –

0

Nie używałbym asynchronicznego wzorca z WCF.Zamiast tego po prostu użyłbym wywołań synchronicznych z normalnymi blokami, aby upewnić się, że połączenie jest zamknięte. Następnie zawinąłbym cały bałagan w normalny element pracy Task (.NET 4.0) lub ThreadPool.

+0

Zaczynam być przekonany, że używanie wywołań WCC w nawiasie w wątku roboczym będzie sposobem symulacji komunikacji asynchronicznej. dzięki. – Beta033

Powiązane problemy