Как мне извлечь внутреннее исключение из исключения soap в ASP.NET?
-
09-06-2019 - |
Вопрос
У меня есть простая операция веб-сервиса, подобная этой:
[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
.
Решение
К сожалению, я не думаю, что это возможно.
Исключение, которое вы создаете в коде вашего веб-сервиса, кодируется в ошибку Soap, которая затем передается в виде строки обратно в ваш клиентский код.
То, что вы видите в сообщении SoapException, - это просто текст из ошибки Soap, который не преобразуется обратно в исключение, а просто сохраняется как текст.
Если вы хотите вернуть полезную информацию в условиях ошибки, я рекомендую вернуть пользовательский класс из вашего веб-сервиса, который может иметь свойство "Error", содержащее вашу информацию.
[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;
}
}
Другие советы
IT ЯВЛЯЕТСЯ возможно!
Пример сервисной операции:
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
Я столкнулся с чем-то подобным некоторое время назад и написал об этом в блоге.Я не уверен, что это точно применимо, но может быть.Код достаточно прост, как только вы понимаете, что вам нужно пройти через объект MessageFault.В моем случае я знал, что деталь содержит GUID, который я мог бы использовать для повторного запроса сведений к службе SOAP.Код выглядит примерно так:
catch (FaultException soapEx)
{
MessageFault mf = soapEx.CreateMessageFault();
if (mf.HasDetail)
{
XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
Guid g = reader.ReadContentAsGuid();
}
}