Перехват FaultException в веб-сервисах - PullRequest
8 голосов
/ 16 декабря 2009

Я вызываю веб-сервис C # с использованием модели сервиса .net, и иногда этот веб-сервис генерирует исключение Microsoft.SharePoint.SoapServer.SoapServerException. Я могу поймать это конкретное исключение как FaultException в моем клиентском коде, однако не могу получить дружественное сообщение об ошибке, возвращенное веб-службой с помощью FaultException.

Ниже приводится трассировка сети для веб-службы при возникновении исключения.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring>
            <detail>
                <errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Access to this Web site has been blocked.
    Please contact the administrator to resolve this problem.</errorstring>
                <errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x81020071</errorcode>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Я очень заинтересован в получении содержимого между узлом errorstring в приведенном выше ответе. Однако из класса FaultException я не могу получить вышеуказанное сообщение об ошибке. Означает ли это, что .NET Framework неправильно десериализует приведенный выше ответ, или я использую здесь неправильный класс исключений.

Единственное сообщение об ошибке, которое я мог получить от FaultException, это «Исключение типа« Microsoft.SharePoint.SoapServer.SoapServerException »было сгенерировано» больше ничего.

Обратите внимание, что я не имею никакого контроля над веб-сервисом.

Ответы [ 2 ]

24 голосов
/ 16 декабря 2009

Потратив немного больше времени на это, я смог найти решение, вы можете получить доступ к сообщению об исключении, используя следующий сегмент кода,

FaultException faultException = (FaultException)exception;
MessageFault msgFault = faultException.CreateMessageFault();
XmlElement elm = msgFault.GetDetail<XmlElement>();

Спасибо всем за ваши ответы.

3 голосов
/ 16 декабря 2009

Веб-сервисы напрямую не используют исключения. Вместо этого они возвращают ошибки. WSDL предназначен для описания возможных неисправностей, а также содержимого элемента <detail/>. Вам нужно будет взглянуть на WSDL, чтобы определить, какая ошибка возвращается вам.

Если ошибка называется SharePointFault, то WCF преобразует ее в исключение с именем FaultException<SharePointFault>. Это исключение, вероятно, будет иметь свойства для errorstring и errorcode. Вы должны иметь возможность использовать эти свойства для получения значений, отправленных в сообщении об ошибке.

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