Mam dość prostą usługę WWW WCF, hostowaną w IIS Express (ostatecznie będzie to pełne IIS) przy użyciu .Net 3.5. Metoda serwisowa jest dość nieinteresująca.Serwer 500: Zbyt wiele oczekujących bezpiecznych rozmów
[ServiceContract]
public class MySvc
{
[OperationContract]
public Stuff MyMethod(string input)
{
Stuff result = DoSomething();
return result;
}
}
Konfiguracja usługi jest również dość ogólna:
<system.serviceModel>
<services>
<service behaviorConfiguration="MySvcBehavior" name="MySvc">
<endpoint address="" binding="wsHttpBinding" contract="MySvc">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Usługa jest zużywana przez kod z opóźnieniem w aplikacji ASPX. Jest odwołanie do usługi, co prowadzi do równie nieciekawego kodu.
MySvcClient svc = new MySvcClient();
Stuff result = svc.MyMethod("foo");
Dopóki jest to jedno żądanie na raz, wszystko działa dobrze, a kod klienta uzyskuje oczekiwany wynik. Yay.
Problem pojawia się, gdy wykonuję bardzo prymitywne testy obciążeniowe. Ładuję stronę ASPX klienta w przeglądarce, a następnie przytrzymaj klawisz F5. Oglądając okno IIS Express, na początku wyniki powracają jako status 200, ale po kilku minutach zaczynam widzieć stan 500. W tym momencie usługa będzie odpowiadać tylko statusem 500, dopóki nie uruchomię ponownie usług IIS Express. (Na podstawie czekania około 10 minut.)
Ustawienie punktu przerwania w kodzie klienta, widzę, że pełny komunikat zwrotny to "Na serwerze jest za dużo oczekujących bezpiecznych rozmów. Spróbuj ponownie później."
Ustalając punkt przerwania w kodzie serwera, stwierdzam, że mój kod nie jest nawet wywoływany. A więc zawodzi gdzieś między wywołaniem a faktycznym uruchomieniem mojego kodu.
Moje wyszukiwania internetowe nie były zbyt obiecujące, głównie prowadząc do tego samego suggestion of writing a custom binding w celu przesłonięcia właściwości maxPendingSessions i wątku rozpoczynającego się od "Ktoś powiedział mi, że jest ustawienie pliku konfiguracyjnego [bez nazwy]", co prowadzi do zerwane łącze twierdzące, że Microsoft uznał to za błąd.
Łącze o właściwości maxPendingSessions wspomina o limicie 128 połączeń z limitem czasu wynoszącym dwie minuty, a ja z pewnością zobaczę, gdzie moja metoda testowania przerwie niektóre połączenia. Czy jest to oczekiwany wynik wprawdzie złej metodologii testowania? Czy coś można zrobić w konfiguracji, aby to poprawić?
Czy użyłeś instrukcji 'using'? Połączenie będzie utrzymywane otwarte do momentu usunięcia. O ile nie istnieje instrukcja 'using', czyszczenie połączeń jest określane przez moduł czyszczenia pamięci. – Caramiriel
To rzeczywiście jest problem z moim kodem po stronie klienta. Ale wiadomości o statusie 500 oznaczają, że coś jest nieszczęśliwe po stronie serwera równania. – ThatBlairGuy