Перехват исключений Soap из веб-сервисов ASP.net - PullRequest
1 голос
/ 28 апреля 2009

У меня есть клиент Windows Forms, который использует веб-сервис ASP.net.

Насколько я понимаю, когда веб-служба создает исключение, оно преобразуется в SoapException в клиентском программном обеспечении .net.

Хорошо, я ловлю SoapException, но когда я отображаю сообщение на стороне клиента в окне сообщений, оно показывает больше информации, чем я действительно хочу показать.

Вот код веб-сервиса:

throw new ApplicationException("Invalid username or password.");

Или даже:

throw new SoapException("Invalid username or password.", SoapException.ServerFaultCode);

Но на стороне клиента свойство Message SoapException выглядит так:

System.Web.Services.Protocols.SoapException: Invalid username or password. at Transportation.InsertSignUps(String username, String password, SignUp[] signUps) in c:\Documents and Settings\rdoverby\My Documents\Visual Studio 2008\WebSites\www.gtcc.edu\App_Code\webservices\Transportation.cs:line 50

Принимая во внимание, что я действительно хочу показать:

Invalid username or password.

Как я могу извлечь ТОЛЬКО исходное сообщение об исключении из SoapException. Я просмотрел объект SoapException в отладчике VS, но не могу найти то, что ищу.

Спасибо.

EDIT

Конечно, я не хочу разбирать эту длинную строку.

Ответы [ 8 ]

1 голос
/ 14 мая 2011

если исключение - это исключение soapException (se), то вы можете добраться до самых важных битов, используя что-то вроде se.Detail.FirstChild.OuterXml, где обычно размещается исключение или, если вы хотите, много, тогда se.Detail .OuterXml

0 голосов
/ 13 мая 2009

Извините, я не видел этого раньше.

Я верю, что правильный ответ - настроить <customErrors/> на сервере. Я забыл, какой режим вы хотите, но один из трех ограничит количество деталей в исключении, которое получает клиент. Это не то, что вы ожидаете, и я сам не поверил. Кто-то разместил этот ответ на другом форуме, и когда я попробовал его, это сработало. Ничто из того, что я пробовал, не избавляло от деталей.

0 голосов
/ 04 ноября 2010

Свойство detail объекта SoapException содержит исходное сериализованное исключение в узле SerializedExeption.

Вы можете попробовать использовать System.Runtime.Serialization.Formatters.Soap.SoapFormatter для десериализации исключения, используя метод, аналогичный описанному здесь: http://blog.irm.se/blogs/eric/archive/2005/03/06/An-ExceptionHandler-that-extract-the-detail-information-from-the-SoapException.aspx

Однако я не смог заставить его работать, поскольку в итоге я получил сообщение об ошибке «нет сборки, связанной с ключом Xml» от Soap Formatter.

Вы можете развернуть узел SerializedException вручную, поскольку он по существу содержит конверт SOAP с кодировкой base-64:

        string serializedException = exception.Detail.SelectSingleNode("SerializedException").InnerText;
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(serializedException)));

Результирующий XmlDocument будет содержать некоторую интересную информацию, включая то, что выглядит как сериализованное исключение xml.

0 голосов
/ 13 мая 2009

Не разочаровывайтесь :) 1001 *

Я сделал то же самое с помощью этой статьи: http://www.developer.com/net/csharp/article.php/3088231.

Я создал один пользовательский класс для своих исключений, и в нем даже есть настоящее Исключение в виде InnerException. (Я добавил независимый от языка идентификатор для каждого известного типа моих пользовательских исключений, чтобы сделать его более удобным для моих клиентов.)

На стороне клиента я просто получаю InnerException, а InnerException.Message - исходный текст без всякого мусора.

0 голосов
/ 29 апреля 2009

Винт это. Я только что вернул строку из сервиса, содержащую любые сообщения об ошибках. Если строка пуста, то служба выполнила свою работу.

Тишина золотая.

0 голосов
/ 29 апреля 2009

Вам нужно выдать свое собственное исключение, пользовательское или что-то еще, а затем, когда клиент генерирует исключение мыла, свойство Detail должно иметь то, что вы ищете.

0 голосов
/ 28 апреля 2009

Извлеките новый класс исключений из SoapException и установите свойство сообщения напрямую.

0 голосов
/ 28 апреля 2009

Пробовал Exception.InnerException.Message?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...