Обработка сообщения об ошибке WCF - PullRequest
1 голос
/ 02 октября 2019

Я использую веб-службы WCF через .NET / C # с использованием Visual Studio 2017. Ниже приведен подробный раздел ошибки:

<detail>
    <FatalException>
        <errorCode>E 0008</errorCode>
        <message>The business policies have been violated.</message>
        <responseCode>FATAL_INT_ERROR</responseCode>
        <validationErrors>
            <associatedSeverity>0</associatedSeverity>
            <attributeName>userld, process number</attributeName>
            <attributeValue>NNNN******NNNN</attributeValue>
            <errorCode>B 014</errorCode>
            <errorMessage>Duplicate Transaction</errorMessage>
            <objectName>ObjABCD</objectName>
        </validationErrors>
        <validationErrors>
            <associatedSeverity>0</associatedSeverity>
            <attributeName>userld, process number</attributeName>
            <attributeValue>NNNN******NNNN</attributeValue>
            <errorCode>AB 015</errorCode>
            <errorMessage>Refer to procedure guide</errorMessage>
            <objectName>ObjXYZ</objectName>
            </validationErrors>
    </FatalException>
</detail>

Мне удалось получить доступ к сообщению «Бизнес-политики имеютбыл нарушен с помощью этого фрагмента кода:

catch(FaultException e)
{
string ERRORMSG = e.Message
}

Я не могу понять, как получить данные массива validationErrors.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Похоже, что ваша служба использует контракт на ошибку, чтобы обернуть детали ошибки. Контракт о сбое является нестандартным типом. Мы можем зафиксировать этот строгий тип, используя оператор Try-Catch на стороне клиента.
Кроме того, контракт на отказ и договор на обслуживание распределяются между клиентом и службой, а именно они известны на стороне клиента. Контракты на обслуживание и контракты на отказ также генерируются путем добавления сервисных ссылок.

Try
{
}
catch (FaultException<FatalException> e)
            {
                FatalException fe = e.Detail;
                Console.WriteLine(e.Message);
            }

Не стесняйтесь, дайте мне знать, если я могу чем-нибудь помочь.

0 голосов
/ 02 октября 2019

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

catch(FaultException<YourExceptionType> e)
{
  ... // Access your custom fault properties
}

Для получения дополнительных примеров посмотрите документацию для FaultException<TDetail>.

...