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.