Tag Archives: Web Service

Azure Relay – WCF Relay [Robert Haken, HAVIT Vzdělávací okénko, 2.8.2018]

Záznam ze Vzdělávacího okénka HAVIT z 2. srpna 2018, kde jsem ukazoval, jak lze Azure Relay využít pro komunikaci s WCF službou umístěnou uvnitř zabezpečené sítě, která nedovoluje inbound komunikaci.

Nahrávka je publikována na našem HAVIT YouTube Channelu.

Azure 4-mins Idle Connection Timeout a jak se s ním vypořádat

Jedna z našich aplikacích migrovaných do Azure začala slavit neúspěchy při volání externí SOAP webové služby – System.Net.WebException: The operation has timed out at… Konkrétně se jednalo o WebJob pro synchronizaci master-dat s ERP systémem zákazníka a pozoruhodné na tom bylo, že z mnoha volaných služeb ERP padala jedna jediná.

Záhy se navíc ukázalo, že volání služby padá pouze z prostředí Azure, volání stejné služby z vývojářského i našeho původního on-premise produkčního prostředí fungovalo. Potvrdilo se to nejenom úspěšným voláním stejné služby z non-Azure prostředí, ale i neúspěšným voláním stejné služby z virtual machine založené pro účely testu v Azure (pro toto se výborně hodí Azure kredit, který je součástí každého MSDN předplatného).

Po chvilce zamyšlení a další chvilce Googlení, se potvrdila hypotéza, že Azure uplatňuje na síťovou komunikaci určité restrikce, zde konkrétně 4-min connection idle timeout a volané webové službě trvalo 5 minut, než nám data z ERP naservírovala. Limit se projevuje a nejenom u příchozích spojení, ale i u spojení odchozích a je potřeba se s ním vypořádat.

Zatímco u příchozích spojení se dá limit konfigurovat na Load Balanceru, u odchozích spojení se předpokládá, že se s ním vypořádáte sami. Principiálně jde totiž o to, že je potřebovat udržovat nějakou aktivitu spojení.

Řešení se nabízí pro různé situace mnoho (např. připravené WCF Azure Net.TCP Keep Alive – net.tcp služba, která periodicky posílá keep-alive signál), v zásadě však většinou není potřeba sahat k ničemu komplikovanému a stačí využít vestavěný keep-alive TCP, který lze v .NET konfigurovat přes ServicePoint.SetTcpKeepAlive(..), resp. ServicePointManager.

Buď můžeme keep-alive konfigurovat globálně pro všechna TCP spojení:

ServicePointManager.SetTcpKeepAlive(true, 5000, 5000);

Nebo nastavení omezit na konkrétní protistranu:

var servicePoint = System.Net.ServicePointManager.FindServicePoint(new Uri(targetWebServiceUrl));
servicePoint.SetTcpKeepAlive(true, 30000, 30000);