Co to jest najlepsza metoda usuwania/czyszczenia instancji serwera proxy usług sieciowych po użyciu synchronicznym?Utylizacja/czyszczenie serwerów proxy usług sieciowych
Czym różni się odpowiedź, jeśli klasa proxy pochodzi z SoapHttpClientProtocol
versus ClientBase<T>
?
Tło
próbuję dowiedzieć się, dlaczego jeden z moich usług WCF internetowych wydaje się czasami dostać się do stanu, w którym nie ma już reponds do obsługi połączeń. Zasadniczo wygląda na to, że się zawiesił i na razie nie mam żadnych twardych danych, aby dowiedzieć się, co się dzieje, kiedy to się pojawi.
Jedna rzecz, którą podejrzewam, może być problem, to fakt, że ta usługa WCF sama wykonuje wywołania usługi sieci Web do kilku innych usług. Te inne usługi nazywane są (synchronicznie) za pomocą serwerów proxy, które pochodzą z SoapHttpClientProtocol
(wykonane za pomocą wsdl.exe) i w tym czasie te przypadki proxy są pozostawione być czyszczone przez finalizatora:
...
var testProxy = new TestServiceProxy();
var repsonse = testProxy.CallTest("foo");
// process the reponse
...
Więc mam po prostu zapakować je w blok using(...) { ... }
?
...
using(var testProxy = new TestServiceProxy())
{
var repsonse = testProxy.CallTest("foo");
// process the reponse
}
...
Co gdybym zmienić te klasy proxy się opierać na ClientBase<T>
odtwarzając je za pomocą svcutil.exe
? Na podstawie moich dotychczasowych badań wydaje się, że metoda klas wywodząca się z wywoła wewnętrznie metodę klasy Close()
i ta metoda może z kolei powodować wyjątki. Więc zawijanie proxy na podstawie ClientBase<T>
w Using()
nie zawsze jest bezpieczne.
Więc powtórzyć pytanie (s):
- Jak należy oczyścić mojego serwera proxy usługi internetowej po użyciu go, gdy pełnomocnikiem jest oparta na
SoapHttpClientProtocol
? - Jak należy wyczyścić mój serwer proxy usług sieciowych po użyciu go, gdy serwer proxy jest oparty na
ClientBase<T>
?
Nie jestem pewien co do pierwszej części tego. 'Dispose' jest zaimplementowane przez' Component', ale 'Abort' jest zaimplementowane przez' WebClientProtocol'. Patrząc na kod, wydaje się, że 'Dispose' nie mógł wiedzieć o żądaniu. Wydaje się, że https://msdn.microsoft.com/en-us/library/ff647786.aspx to potwierdził (w punkcie "Przerywanie połączeń dla stron ASP.NET, w których upłynął limit czasu, zanim połączenie z usługami Web Service zostanie zakończone"). W przypadku WCF zobacz https://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-wcf-client-using-block-issue – TrueWill