Здравствуйте, 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.
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) — обязательно прочитие "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
ссылка на оригинальное сообщение
Да, естественно чтобы твой филтр (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
ссылка на оригинальное сообщение