Вы можете использовать SoapExtension для этого:
using System;
using System.Web.Services.Protocols;
namespace MyNamespace
{
class ELMAHExtension : SoapExtension
{
public override object GetInitializer(Type serviceType)
{ return null; }
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{ return null; }
public override void Initialize(object initializer)
{ }
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize &&
message.Exception != null)
{
// Log exception here
}
}
}
}
Вы регистрируете это в файле web.config со следующими строками:
<system.web>
<webServices>
<soapExtensionTypes>
<add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
</soapExtensionTypes>
</webServices>
</system.web>
Это даст вам доступ к объектам HttpContext и SoapMessage, которые должны предоставить вам всю необходимую информацию о том, что вызывалось. Я думаю, что исключение, которое вы получите на этом этапе, всегда будет SoapException, и что интересующий вас бит, вероятно, является внутренним исключением.