A WCF channelek lezárása egyértelmű, ha rendben van a csatorna Close(), ha faulted, Abort().
De mi van a channelfactory-vel?
Amiért a kérdés előjött az az, hogy egy szerviz rendszeres használata során 2 perc utáni hívásoknál elszállt a hívás. A kliens ezt élte meg:
An existing connection was forcibly closed by the remote host
A szerveren meg egy belső exception volt, amit a WCF lenyelt, de jelezte, hogy valami nem ok:
The I/O operation has been aborted because of either a thread exit or an application request.
A figyelmem a channelfactory-re terelődött. Az lokális változóként volt létrehozva, és ebek harmincadjára szabadon engedve. Jaj, ez beteg. Lokális dispose nem jó rá, mert akkor lezárja az összes általa nyitott csatornát (legalábbis vélemények szerint).
Próbáltam egy statikus példányt letárolni, azzal létrehozni a csatornákat, de ez is lepukkant 2 perc után (doksi szerint thread safe, több szálból használtam).
Végül nem maradt más, mint minden csatornához saját factory instance-et létrehozni, és a csatorna használata után mindkettőt lezárni. Pedig elvileg meg lehet osztani a factory-t, teljesítmény okokból. Ebben az alkalmazásban ez megfelelő megoldás, de ha sok csatornát kellene nyitni, az nem tetszene. Valaki látott már ilyen esetet?
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.