WebService and exception handling
От: ilya_ny  
Дата: 22.12.06 02:29
Оценка:
как в вебсервисе сделать обработку ошибок?
т.е. на любое ислючение в вебсервисе вызывать обработчик

в обычном веб-приложении это делается так:
//global.asax
protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError()
    Log(ex);
}


проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается
Re: WebService and exception handling
От: ldarcy  
Дата: 24.12.06 03:51
Оценка:
Здравствуйте, ilya_ny, Вы писали:

_>как в вебсервисе сделать обработку ошибок?

_>т.е. на любое ислючение в вебсервисе вызывать обработчик

_>в обычном веб-приложении это делается так:

_>
_>//global.asax
_>protected void Application_Error(Object sender, EventArgs e)
_>{
_>    Exception ex = Server.GetLastError()
_>    Log(ex);
_>}
_>


_>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.
Re[2]: WebService and exception handling
От: Gollum Россия  
Дата: 24.12.06 10:55
Оценка:
Здравствуйте, ldarcy, Вы писали:

_>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


Если уж так стоит вопрос, я бы посоветовал взглянуть на AOP, а конкретно на logging aspect.
Можно еще попробовать поэкспериментировать с конфигурацией health monitoring и провайдерами веб-событий, предоставляемыми инфраструктурой ASP.NET 2.0.
And please don't stick Thy servants, Lord, in a Rotissomat.
Eugene Agafonov on the .NET

Re[2]: WebService and exception handling
От: ilya_ny  
Дата: 24.12.06 15:23
Оценка:
Здравствуйте, ldarcy, Вы писали:

_>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


ну это очевидно. я-то просто хотел делать один обработчик сразу на все, а не 100 try/catch
Re[3]: WebService and exception handling
От: Кэр  
Дата: 25.12.06 07:16
Оценка:
Здравствуйте, ilya_ny, Вы писали:

_>Здравствуйте, ldarcy, Вы писали:


_>>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


_>ну это очевидно. я-то просто хотел делать один обработчик сразу на все, а не 100 try/catch


Правильно хотите. Напишите свой несложный SoapExtension, который при отправке soap message будет проверять есть ли там ошибка (message.Exception != null) и если есть — оборачивать нужным образом этот Exception в SoapException и отправлять уже его.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: WebService and exception handling
От: ldarcy  
Дата: 25.12.06 21:42
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Здравствуйте, ldarcy, Вы писали:


_>>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


G>Если уж так стоит вопрос, я бы посоветовал взглянуть на AOP, а конкретно на logging aspect.

G>Можно еще попробовать поэкспериментировать с конфигурацией health monitoring и провайдерами веб-событий, предоставляемыми инфраструктурой ASP.NET 2.0.

А уже есть AOP имплементации которые не страшно повесить на живое приложение и оно будет быстро работать — и если есть то какие? Все о чем я слышал — proof of concept. IMHO, eсли уж автоматизировать, скорее либо рефлекшен+кодеген, либо смотреть на WS-based messaging, где такое уже скорее всего есть.
Re[4]: WebService and exception handling
От: ldarcy  
Дата: 25.12.06 21:49
Оценка:
Здравствуйте, Кэр, Вы писали:

Кэр>Здравствуйте, ilya_ny, Вы писали:


_>>Здравствуйте, ldarcy, Вы писали:


_>>>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>>>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


_>>ну это очевидно. я-то просто хотел делать один обработчик сразу на все, а не 100 try/catch


Кэр>Правильно хотите. Напишите свой несложный SoapExtension, который при отправке soap message будет проверять есть ли там ошибка (message.Exception != null) и если есть — оборачивать нужным образом этот Exception в SoapException и отправлять уже его.


Не совсем понятно. Это избавит от повторении try/catch в каждом методе? Если да, то можно примерчик?
Re[5]: WebService and exception handling
От: ldarcy  
Дата: 25.12.06 21:56
Оценка:
Здравствуйте, ldarcy, Вы писали:

L>Здравствуйте, Кэр, Вы писали:


Кэр>>Здравствуйте, ilya_ny, Вы писали:


_>>>Здравствуйте, ldarcy, Вы писали:


_>>>>>проблема в том, что для веб-сервиса Application_Error в global.asax не в вызывается


L>>>>Мы банально вешаем try/catch на каждый метод. Кроме того, нужно бросать SoapException в любом случае, так что обертка нужна.


_>>>ну это очевидно. я-то просто хотел делать один обработчик сразу на все, а не 100 try/catch


Кэр>>Правильно хотите. Напишите свой несложный SoapExtension, который при отправке soap message будет проверять есть ли там ошибка (message.Exception != null) и если есть — оборачивать нужным образом этот Exception в SoapException и отправлять уже его.


L>Не совсем понятно. Это избавит от повторении try/catch в каждом методе? Если да, то можно примерчик?


Прошы прощения, не прочитал внимательно. SoapExtension != SoapException
Re: Re[4]: WebService and exception handling
От: Аноним  
Дата: 26.12.06 08:57
Оценка:
ldarcyНе совсем понятно. Это избавит от повторении try/catch в каждом методе? Если да, то можно примерчик?

Пожалуйста:
(Имя AuthExtension — это мое имя ты можешь назвать как хочешь, напр ExceptionProcessingExtension.

public class AuthExtension : SoapExtension
{
#region "Public Methods"

/// <summary>
/// This method is the main processing part of the SOAP
/// extension execution. The SOAP message goes through
/// various stages and at each stage the message is available
/// for processing.
/// </summary>
/// <param name="message">
/// The SOAP message to be processed.
/// </param>
public override void ProcessMessage(SoapMessage message)
{
Debug.Print("Entering AuthExtension.ProcessMessage...");
try
{
if (null == message)
{
throw (new ArgumentNullException("message", "is null"));
}

if (message.Stage == SoapMessageStage.AfterDeserialize)
{
//Check for an AuthHeader containing valid
//credentials
...здесь наша логика — тебе она не нужна!
...
}
}
catch (Exception processException)
{
if (processException is SoapException)
{
throw;
}
if (processException is SecurityException)
{
throw new SoapException("Янки, ГО ХОМ! ", SoapException.ClientFaultCode);
//throw GenerateSoapClientException(processException);
}
else if (processException is MyCompany.MyProject.MyArgumentException)
{
throw;
//throw GenerateSoapClientException(processException);
}
else
{
throw;
//throw GenerateSoapServerException(processException);
}
}
}
вот в принципе это, вроде то что ты спрашивал... Перед throw; (или в место) можешь вставить свой Log4net вывод...


дальше можно не читатать, но
если интресно как работает то, что там закоментированно, то: Предпологается, что это должно работать красиво (согласно документации Microsoft) клиент получает либо ServerSide exception либоClientSide exception в зависимости от природы ошибки.
(Если кто не вкурсе, что SoapException бывают двух видов (clientside & serverside) — обязательно прочитие &quot;MSDN — SoapException about class".)
/// <summary>
/// This method generates a SOAP client fault for the
/// SOAP exception thrown to the client.
/// </summary>
/// <param name="clientException">Client business rule specific exception.</param>
/// <returns>SoapException instance created.</returns>
/// <include file='doc\WebServiceInterfaceAdapter.uex' path='docs/doc[@for="WebServiceInterfaceAdapter.GenerateSoapClientException"]/*' />
private SoapException GenerateSoapClientException(Exception clientException)
{
// Get the details node for the soap exception
XmlNode detailsNode = GenerateSoapExceptionDetailsNode(clientException.Message, clientException.GetType().Name);

// Create the Soap exception
SoapException soapEx = new SoapException("WebServiceInterfaceAdapterClientFault", SoapException.ClientFaultCode, clientException.TargetSite.Name, detailsNode);
return (soapEx);
}

/// <summary>
/// This method generates a SOAP server fault for the
/// SOAP exception thrown to the client.
/// </summary>
/// <param name="serverException">Framework exception occurred.</param>
/// <returns>SoapException instance created.</returns>
/// <include file='doc\WebServiceInterfaceAdapter.uex' path='docs/doc[@for="WebServiceInterfaceAdapter.GenerateSoapServerException"]/*' />
private SoapException GenerateSoapServerException(Exception serverException)
{
string exceptionMessage = "WebServiceInterfaceAdapterError";
// Get the details node for the soap exception
XmlNode detailsNode = GenerateSoapExceptionDetailsNode(exceptionMessage, "Exception");

SoapException soapEx = new SoapException("WebServiceInterfaceAdapterServerFault", SoapException.ServerFaultCode, serverException.TargetSite.Name, detailsNode);
return (soapEx);
}

/// <summary>
/// This method creates the detail element node for the SOAP exception.
/// </summary>
/// <param name="exceptionMessage">Exception message to be encapsulated in
/// the details element.</param>
/// <param name="exceptionTypeName">Type name of the exception.</param>
/// <returns>XmlNode representing the details node of SOAP exception.</returns>
/// <include file='doc\WebServiceInterfaceAdapter.uex' path='docs/doc[@for="WebServiceInterfaceAdapter.GenerateSoapExceptionDetailsNode"]/*' />
private XmlNode GenerateSoapExceptionDetailsNode(String exceptionMessage, String exceptionTypeName)
{
// Build the detail element of the SOAP fault
XmlDocument xmlDoc = new System.Xml.XmlDocument();
XmlNode detailsNode = xmlDoc.CreateNode(XmlNodeType.Element, SoapException.DetailElementName.Name, SoapException.DetailElementName.Namespace);

// Build specific details for the SoapException
XmlNode exceptionDetails = xmlDoc.CreateNode(XmlNodeType.Element, exceptionTypeName, "tekla");
XmlNode exceptionDetailsChild = xmlDoc.CreateNode(XmlNodeType.Element, "ExceptionMessage", "tekla");
exceptionDetailsChild.InnerText = exceptionMessage;
exceptionDetails.AppendChild(exceptionDetailsChild);

// Append the child elements to the detail node
detailsNode.AppendChild(exceptionDetails);
return (detailsNode);
}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: WebService and exception handling
От: Аноним  
Дата: 26.12.06 09:09
Оценка:
Да, естественно чтобы твой филтр (Extention) работал, надо, "сказать" это каждому методу, где ты его хочешь применить.
А сказать это можно вставив _твой_ атрибут [ExceptionProcessingExtension] в объявлении метода, напр у меня это выглядит так:
[WebMethod(Description =
"Retrieves a project by its ID." +
"<li>Arg0: the project's id." +
"Returns the required project or <b>NullProject</b> if one doesn't exist.")]
[SoapHeader("authHeader")]
[AuthExtension]
public Project GetProject(int projectID)
{
Debug.Print("ProjectService: Entering GetProject({0})...", projectID);
return MyBllManager.GetProject(projectID);
}
Cмотри также внимательно: "MSDN — SoapExtention class — about SoapExtention class."


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.