Я подключаюсь к веб-службе 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><![CDATA[<error xmlns="urn:company:schema:errordetail:v01"><errorCode>1000</errorCode><highestSeverity>8</highestSeverity><errorDetails count="1"><errorDetail><errorType>1</errorType><errorSeverity>8</errorSeverity><errorDescription>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.</errorDescription><errorNamespace>urn:company:schema:sendinvoice:rq:v01</errorNamespace><errorNode>CompanyName</errorNode><errorLine>1</errorLine><errorColumn>2556</errorColumn><errorXPath/><errorSource/></errorDetail></errorDetails></error>]]></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
Любая помощь будет принята с благодарностью.