Обрабатывать исключения в веб-сервисах с Elmah
-
24-09-2019 - |
Вопрос
Есть ли путь к глобально обработанию исключений в регулярных веб-сервисе ASP.NET (ASMX), используя Elmah, как мы сделаем это в веб-сайте ASP.NET?
Решение
Web Services asp.net никогда не огонь Application_Error
Событие и исключения не могут быть обработаны во всем мире Elmah, как в приложениях ASP.NET. Но мы можем «вручную» журнала журнала, используя Эльма:
public int WebServiceMethod() {
try {
...
}
catch (Exception ex) {
Elmah.ErrorLog.GetDefault(
HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
}
}
Другие советы
Вы можете использовать Soapextence, чтобы сделать это:
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, и что вам интересно, это, вероятно, является внутренним исключением.
Вы можете использовать этот код
try{
// your code in here
}
catch (Exception ert)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ert);
}