Как извлечь внутреннее исключение из исключения мыла в ASP.NET? - PullRequest
15 голосов
/ 28 августа 2008

У меня есть простая операция веб-сервиса, подобная этой:

    [WebMethod]
    public string HelloWorld()
    {
        throw new Exception("HelloWorldException");
        return "Hello World";
    }

А потом у меня есть клиентское приложение, которое использует веб-сервис и затем вызывает операцию. Очевидно, это вызовет исключение: -)

    try
    {
        hwservicens.Service1 service1 = new hwservicens.Service1();
        service1.HelloWorld();
    }
    catch(Exception e)
    {
        Console.WriteLine(e.ToString());
    }

В моем блоке catch я хотел бы извлечь Сообщение фактического исключения, чтобы использовать его в своем коде. Выявлено исключение SoapException, что нормально, но свойство Message выглядит следующим образом ...

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: HelloWorldException
   at WebService1.Service1.HelloWorld() in C:\svnroot\Vordur\WebService1\Service1.asmx.cs:line 27
   --- End of inner exception stack trace ---

... и InnerException равно null.

Что я хотел бы сделать, это извлечь Message свойство InnerException (текст HelloWorldException в моем примере), кто-нибудь может помочь с этим? Если вы можете избежать этого, пожалуйста, не предлагайте анализировать Message свойство SoapException.

Ответы [ 3 ]

6 голосов
/ 28 августа 2008

К сожалению, я не думаю, что это возможно.

Исключение, которое вы вызываете в своем коде веб-службы, кодируется в ошибку Soap, которая затем передается в виде строки обратно в код вашего клиента.

То, что вы видите в сообщении SoapException, - это просто текст из ошибки Soap, который не преобразуется обратно в исключение, а просто сохраняется как текст.

Если вы хотите вернуть полезную информацию в условиях ошибки, я рекомендую вернуть пользовательский класс из вашего веб-сервиса, который может иметь свойство «Ошибка», содержащее вашу информацию.

[WebMethod]
public ResponseClass HelloWorld()
{
  ResponseClass c = new ResponseClass();
  try 
  {
    throw new Exception("Exception Text");
    // The following would be returned on a success
    c.WasError = false;
    c.ReturnValue = "Hello World";
  }
  catch(Exception e)
  {
    c.WasError = true;
    c.ErrorMessage = e.Message;
    return c;
  }
}
4 голосов
/ 05 сентября 2012

Это ЕСТЬ возможно!

Пример работы сервиса:

try
{
   // do something good for humanity
}
catch (Exception e)
{
   throw new SoapException(e.InnerException.Message,
                           SoapException.ServerFaultCode);
}

Клиент, пользующийся услугой:

try
{
   // save humanity
}
catch (Exception e)
{
   Console.WriteLine(e.Message);    
}

Только одно - вам нужно установить customErrors mode = 'RemoteOnly' или 'On' в вашем web.config (из проекта службы).

кредиты об обнаружении customErrors - http://forums.asp.net/t/236665.aspx/1

2 голосов
/ 29 августа 2008

Я столкнулся с чем-то похожим немного назад и написал об этом в блоге . Я не уверен, если это точно применимо, но может быть. Код достаточно прост, когда вы понимаете, что вам нужно пройти через объект MessageFault. В моем случае я знал, что детали содержат GUID, который я мог бы использовать для повторного запроса службы SOAP для получения подробной информации. Код выглядит так:

catch (FaultException soapEx)
{
    MessageFault mf = soapEx.CreateMessageFault();
    if (mf.HasDetail)
    {
        XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
        Guid g = reader.ReadContentAsGuid();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...