Je volání webových služeb přes SOAP z .NETu spolehlivé?
Dlouho jsem nevěřil, že HttpWebRequest je tak moc problémový, jak se proslýchalo. Sice jsem s ním měl také problémy, ale nezavrhl jsem ho. To, že se při stahování autentikované stránky posílají dva požadavky, z nichž první je zamítnut, není chyba - je to v souladu s RFC 1945, kde se definuje autentikační mechanismus jako challenge-response. WebRequest sice má property PreAuthenticate, která má mít za následek odesílání autorizačního headeru už s prvním požadavkem, ale to platí až pro požadavky odeslané po úspěšné autentikaci následující po první 401ce. V instalovatelné verzi MSDN Library je to velmi přesně popsáno, zatímco v online verzi jsem nenašel ani zmínku.
Avšak další užitečná property KeepAlive se opravdu chová divně. Přestože je defaultně nastavena na true, týká se zřejmě jen neautentikovaných požadavků. Když jsem potřeboval přes WebDAV a NTLM autentikaci přistupovat k datům SharePointu, velice brzy jsem narazil - NTLM autentikace není nejrychlejší, zvlášť když se úplně zbytečně provádí stále dokola. A to opravdu není omezení NTLM ani IIS, o čemž je možné se přesvědčit za pomoci odchytávače paketů během procházení WebDAVu SharePointím pluginem do Exploreru - KeepAlive funguje, autentikace proběhne jen jednou, spojení drží a veškerá komunikace probíhá bez jakéhokoliv zdržování. Nakonec jsem svůj boj s HttpWebRequestem vzdal a pomalost obešel použítím vlastní cache... Bylo to ošklivé řešení, ale psát HTTP komponentu s podporou nedokumentovaného NTLM se mi nechtělo a ani na to nebyl čas.
Ale po zkušenostech Vaška Bárty a Michala Bláhy s používáním WebRequestu z více threadů se už budu od té na první pohled užitečné třídy držet raději dál - její jednoduchost ani zdaleka nevyvažuje všechny problémy. Jestli bude třída FtpWebRequest (paradoxní název, že?) z příští verze .NETu stejně spolehlivá, tak potěš pánbu.
Nepoužívat WebRequest bohužel není tak jednoduché. Jednou ze základních vymožeností .NET Frameworku jsou Web services a SOAP. Klientský stub vygenerovaný kompilátorem WSDL sestává ze třídy zděděné z SoapHttpClientProtocol. A tato třída je jen obálka právě okolo WebRequestu! Potřebujete volat webové služby z více threadů najednou? Možná to fungovat bude, ale pro jistotu přeji hodně štěstí a pevné nervy.