Jak jsem již popisoval v předchozím články, nevýhodou jinak šikovného mechanizmu Health Monitoringu je, že nesbírá chyby z aynchronních requestů a z webových služeb ASP.NET. Jak se vypořádat s prvním problémem u AJAX requestů bylo již naznačeno, podívejme se teď na problematiku webových služeb ASP.NET (.asmx). V zásadě jde opět o zachycení problémové výjimky a předání WebRequestErrorEvent.
SoapExceptionHealthMonitoringHandler (SoapExtension)
Elegantní metodou jak se dostat k odběru výjimek během zpracování webových služeb a jak je předávat mechanizmu Health Monitoringu je požití SoapExtension. Uvádím opět kód kolegy Jiřího Kandy (pomocná třída WebRequestErrorEventExt byla již definována v předchozím článku):
/// <summary> /// V případě chyby ve zpracování web metody (webové služby) zajistí oznámení chyby health monitoringem. /// Pozor, toto nefunguje (a chyby healthmonitoringu tak nejsou oznamovány), /// pokud se webové služby testují v browseru!!! Pro testování nutno použít skutečného klienta webové služby (třeba service reference v konzolovce). /// </summary> public class SoapExceptionHealthMonitoringHandler : System.Web.Services.Protocols.SoapExtension { #region ProcessMessage public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message) { try { if ((message != null) && (message.Stage == SoapMessageStage.AfterSerialize)) { if (message.Exception != null) { Exception exception = message.Exception; if ((exception is SoapException) && (exception.InnerException != null)) { exception = exception.InnerException; } if ((exception is HttpUnhandledException) && (exception.InnerException != null)) { exception = exception.InnerException; } new WebRequestErrorEventExt(exception.Message, message, exception).Raise(); } } } catch // pokud by zde nedejbože došlo k nějaké další výjimce, tak ji zamaskujeme { // NOOP } } #endregion #region GetInitializer public override object GetInitializer(Type serviceType) { return null; } public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } #endregion #region Initialize public override void Initialize(object initializer) { } #endregion }
…a zapojení ve web.configu potom v elementu configuration/system.web/webServices:
<webServices> <soapExtensionTypes> <add type="MyNamespace.SoapExceptionHealthMonitoringHandler, MyAssembly" priority="0" group="0" /> </soapExtensionTypes> </webServices>
A JE TO.