Я подключаюсь к веб-службе Java Axis2 с помощью клиента веб-службы .NET. Сам клиент нацелен на .NET 3.5 framework. Приложение, которое оборачивает клиентскую 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 не может правильно проанализировать набранное исключение Fault?
У меня нет контроля над самим веб-сервисом. Я не вижу причин, по которым .NET не может общаться с веб-сервисом Java Axis2. У этого пользователя была похожая проблема, но причина его проблемы не может быть такой же, как у меня, так как я вижу детали ошибки в трассировке: Поддерживает ли WCF FaultException взаимодействие с веб-службой Java Fault
Любая помощь будет принята с благодарностью.