我正在开发一个需要使用SOAP WCF服务的.Net Standard 2.0 Xamarin Forms应用程序。一切正常,直到服务向客户端返回异常。异常的XML(来自Fiddler)看起来像这样:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="urn:microsoft-dynamics-schemas/error">a:Microsoft.Dynamics.Nav.Types.Exceptions.NavNCLDialogException</faultcode>
<faultstring xml:lang="en-US">The Bin does not exist. Identification fields and values: Location Code='MAIN-TEST',Code='INVALID'</faultstring>
<detail>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">The Bin does not exist. Identification fields and values: Location Code='MAIN-TEST',Code='INVALID'</string>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
当服务返回此XML时,客户端会抛出以下System.Runtime.Serialization异常:
Error in line 1 position 346. Expecting element 'ExceptionDetail' from namespace
'http://schemas.datacontract.org/2004/07/System.ServiceModel'.. Encountered
'Element' with name 'string', namespace
'http://schemas.microsoft.com/2003/10/Serialization/'
让我的应用向我需要的用户显示有意义的信息 访问返回的XML中的faultstring值。当我在测试用例中从Windows机器访问服务时,异常被正确解析,我可以访问该消息。内部异常类型是System.ServiceModel.FaultException:
然而,当我在Xamarin Forms应用程序中执行完全相同的服务调用时,我得到了序列化异常。
我已经尝试了几种从异常xml节点内部读取所需数据的方法,但都无济于事。这些包括将IClientMessageInterceptor,IClientMessageFormatter和IParameterInspector类添加到客户端服务行为。在运行我需要访问的'AfterCall'方法之前,客户端总是抛出序列化错误。
有没有办法让异常正确序列化,或者失败,从返回的消息中获取原始XML的方法,以便我自己解析XML?