Клиент веб-службы получает общее исключение FaultException, а не FaultException‹T›

Я подключаюсь к веб-службе Java Axis2 с помощью клиента веб-службы .NET. Сам клиент нацелен на платформу .NET 3.5. Приложение, обертывающее клиентскую DLL, — 2.0. Я не уверен, имеет ли это какое-то значение.

Я получил WSDL и XSD по электронной почте. Из них я создал свой прокси-класс, используя svcutil. Хотя я могу успешно отправлять сообщения, я не могу исправить ошибки, когда что-то идет не так. В приведенном ниже примере ошибки всегда обнаруживаются общим FaultException.

catch (FaultException<InvoiceErrorType> fex)
{
    OnLog(enLogLevel.ERROR, fex.Detail.ErrorDescription);
}
catch (FaultException gfex)
{
    OnLog(enLogLevel.ERROR, gfex.Message);
}

Прокси-клиент имеет соответствующие атрибуты для FaultContract:

// CODEGEN: Generating message contract since the operation SendInvoiceProvider_Prod is neither RPC nor document wrapped.
[OperationContractAttribute(Action = "https://private/SendInvoiceProvider", ReplyAction = "*")]
[FaultContractAttribute(typeof(InvoiceErrorType), Action = "https://private/SendInvoiceProvider", Name = "InvoiceError", Namespace = "urn:company:schema:entities:base")]
[XmlSerializerFormatAttribute(SupportFaults = true)]
[ServiceKnownTypeAttribute(typeof(ItemDetail))]
[ServiceKnownTypeAttribute(typeof(Supplier))]
OutboundComponent.SendInvoiceProviderResponse SendInvoiceProvider_Prod(OutboundComponent.SendInvoiceProvider_Request request);

Я включил трассировку и вижу, что содержимое ошибки возвращается, но .NET не распознает ее как InvoiceError. Полная ошибка SOAP:

<soapenv:Fault>
    <faultcode xmlns="">soapenv:Client</faultcode>
    <faultstring xmlns="">Message found to be invalid</faultstring>
    <faultactor xmlns="">urn:SendInvoiceProvider</faultactor>
    <detail xmlns="">
        <InvoiceError xmlns="urn:company:schema:entities:common:invoiceerror:v01">
                <ErrorID>100040</ErrorID>
                <ErrorType>UNEXPECTED</ErrorType>
                <ErrorDescription>&lt;![CDATA[&lt;error xmlns="urn:company:schema:errordetail:v01"&gt;&lt;errorCode&gt;1000&lt;/errorCode&gt;&lt;highestSeverity&gt;8&lt;/highestSeverity&gt;&lt;errorDetails count="1"&gt;&lt;errorDetail&gt;&lt;errorType&gt;1&lt;/errorType&gt;&lt;errorSeverity&gt;8&lt;/errorSeverity&gt;&lt;errorDescription&gt;cvc-complex-type.2.4.a: Invalid content was found starting with element 'CompanyName'. One of '{"urn:company:schema:sendinvoice:rq:v01":RoleType}' is expected.&lt;/errorDescription&gt;&lt;errorNamespace&gt;urn:company:schema:sendinvoice:rq:v01&lt;/errorNamespace&gt;&lt;errorNode&gt;CompanyName&lt;/errorNode&gt;&lt;errorLine&gt;1&lt;/errorLine&gt;&lt;errorColumn&gt;2556&lt;/errorColumn&gt;&lt;errorXPath/&gt;&lt;errorSource/&gt;&lt;/errorDetail&gt;&lt;/errorDetails&gt;&lt;/error&gt;]]&gt;</ErrorDescription>
                <TimeStamp>2010-05-04T21:12:10Z</TimeStamp>
        </InvoiceError>
    </detail>
</soapenv:Fault>

Я заметил пространство имен, определенное для ошибки:

<InvoiceError xmlns="urn:company:schema:entities:common:invoiceerror:v01">

Этого нигде не видно ни в сгенерированном прокси-классе, ни в WSDL. Интерфейс WSDL определяет пространство имен схемы ошибок как таковое:

<xs:import namespace="urn:company:schema:entities:base" schemaLocation="InvoiceError.xsd"/>

Может ли это быть причиной того, что клиент .NET не может правильно проанализировать типизированное исключение ошибки?

Я не контролирую сам веб-сервис. Я не вижу причин, по которым .NET не может общаться с веб-службой Java Axis2. У этого пользователя была похожая проблема, но причина его проблемы не может быть такой же, как у меня, так как я вижу подробности ошибки в трассировке: Поддерживает ли WCF FaultException‹T› взаимодействие с ошибкой веб-службы Java

Любая помощь будет принята с благодарностью.


person Rebecca    schedule 05.05.2010    source источник
comment
Возможно, это было очевидно, прежде чем публиковать вопрос, но я изменил пространства имен в моем прокси-классе, чтобы они соответствовали тому, что возвращалось, а не тому, что, по словам WSDL, должно быть, и исключение ошибки было правильно перехвачено. Следовательно, проблема была вызвана несоответствием между WSDL и веб-службой. Какова процедура закрытия вопроса, на который вы сами ответили?   -  person Rebecca    schedule 05.05.2010
comment
Ответьте на вопрос в большом поле с надписью «Ваш ответ», а затем нажмите на маленькую галочку рядом с ним. Вы также должны проголосовать за себя несколько раз для верности... хорошо, я сделал последнюю часть, но первая верна. Ответьте уже на вопрос!!! ;-)   -  person Sky Sanders    schedule 05.05.2010


Ответы (1)


Пространство имен, указанное в WSDL для пользовательского типа сбоя, не соответствует пространству имен сбоя, которое возникает. В результате клиент .NET не смог правильно десериализовать ошибку.

Другими словами, сторонняя компания должна либо изменить WSDL, либо изменить пространство имен для возникающей ошибки.

Самый полезный инструмент, который поможет вам разобраться в таких проблемах, — настроить трассировку: http://msdn.microsoft.com/en-us/library/ms732023.aspx.

person Rebecca    schedule 06.05.2010
comment
Кроме того, вы не можете просто добавить ссылку на службу, поскольку svcutil по умолчанию использует DataContractSerializer, а не XmlSerializer. Обходной путь заключается в использовании svcutil из командной строки. Если у вас есть несколько встроенных схем из удаленных мест, вам нужно будет загрузить эти файлы по отдельности. - person Rebecca; 13.07.2010