我使用.NET Web服务客户端连接到Java Axis2 Web服务。客户端本身以.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客户端无法正确解析类型化错误异常的原因吗?
我无法控制Web服务本身。我认为没有理由说.NET无法与Java Axis2 Web服务通信。这个用户有类似的问题,但他的问题的原因不能与我的相同,因为我可以看到跟踪中的错误细节:Does WCF FaultException<T> support interop with a Java web service Fault
感谢任何帮助。
答案 0 :(得分:0)
WSDL中为自定义Fault类型提供的命名空间与引发的错误命名空间不匹配。因此,.NET客户端无法正确反序列化错误。
换句话说,第三方公司需要更改WSDL或更改正在引发的错误的命名空间。
帮助您解决此类问题的最有用工具是设置跟踪:http://msdn.microsoft.com/en-us/library/ms732023.aspx。