编辑:我想我应该解释一下我想要完成的事情。
这是我需要遵守的WSDL文件。它有一个sendDocument动作,该动作应该能够抛出一些名为EFaturaFault的SOAP错误:
https://merkeztest.efatura.gov.tr/EFaturaMerkez/services/EFatura?wsdl
在为Faults创建代理类时,添加服务引用存在一些问题。我使用了带有UseSerializerForFaults选项的svcutil,并使用代码和msg属性创建了一次代理类,但政府机构的Web服务并不喜欢wcf创建的soap信封。他们期待这样的事情:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<soap:Fault>
<soap:Value>soap:Receiver</soap:Value>
</env:Code>
<env:Reason xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<soap:Text xml:lang="en-US">2000:OZET DEGERLER ESIT DEGIL</soap:Text>
</env:Reason>
<env:Role xmlns:env="http://www.w3.org/2003/05/soap-envelope"/>
<env:Detail xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<ns3:EFaturaFault xmlns:ns3="http://gib.gov.tr/vedop3/eFatura" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<code>2000</code>
<msg>OZET DEGERLER ESIT DEGIL</msg>
</ns3:EFaturaFault>
</env:Detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
我设法创造了这样的东西:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<soap:Fault>
<env:Code xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<soap:Value>soap:Receiver</soap:Value>
</env:Code>
<env:Reason xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<soap:Text xml:lang="en-US">2000:OZET DEGERLER ESIT DEGIL</soap:Text>
</env:Reason>
<env:Role xmlns:env="http://www.w3.org/2003/05/soap-envelope"/>
<env:Detail xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<EFaturaFault xmlns ="http://gib.gov.tr/vedop3/eFatura" >
<code>2000</code>
<msg>OZET DEGERLER ESIT DEGIL</msg>
</EFaturaFault>
</env:Detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
但它仍然不够,因为它们需要soap信封完全如上所述,因此代码和msg元素不能具有任何前缀,名称空间。我创建的Envelope有一个默认命名空间,因此他们的服务仍然获取代码,msg元素属于默认命名空间,并产生如下错误:
解组错误:意外元素(uri = “http://gib.gov.tr/vedop3/eFatura”,local =“code”)。预期的要素 是&lt; {} code&gt;,&lt; {} msg&gt;
他们的服务是用Java实现的,这就是我解释错误的方式。
我创建了一个SoapException,其detail属性是使用我创建的XmlElement设置的。当我在客户端抛出并捕获该异常时,我无法看到我设置的详细信息节点,但是看不到具有堆栈跟踪等的ExceptionDetail节点(实现WCF服务)
我希望看到的是详细信息
<env:Detail xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<ns3:EFaturaFault xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ns3="http://gib.gov.tr/vedop3/eFatura">
<code>2000</code>
<msg>OZET DEGERLERI ESIT DEGIL</msg>
</ns3:EFaturaFault>
</env:Detail>
我真正得到的是:
<s:Detail>
<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HelpLink i:nil="true"></HelpLink>
<InnerException i:nil="true"></InnerException>
<Message>2000:OZET DEGERLERI ESIT DEGIL</Message>
<StackTrace>
at EFATURAGIDEN.PostBox.sendDocument(sendDocument request) in D:\Projects\EFATURAGIDEN\PostBox.svc.cs:line 177at SyncInvokesendDocument(Object , Object[], Object[])at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[]inputs, Object[]&outputs)at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
<Type>System.Web.Services.Protocols.SoapException</Type>
</ExceptionDetail>
</s:Detail>
即使是Detail节点的前缀也是错误的。
这是我创建SoapException的代码:
XmlDocument doc = new XmlDocument();
XmlNode node = doc.CreateElement("env", "Detail", "http://www.w3.org/2003/05/soap-envelope");
XmlElement efaturaFault = doc.CreateElement("ns3", "EFaturaFault", "http://gib.gov.tr/vedop3/eFatura");
efaturaFault.SetAttribute("xmlns:xmime", "http://www.w3.org/2005/05/xmlmime");
XmlNode code = doc.CreateElement("code");
code.InnerText = "2000";
XmlNode msg = doc.CreateElement("msg");
msg.InnerText = "OZET DEGERLERI ESIT DEGIL";
efaturaFault.AppendChild(code);
efaturaFault.AppendChild(msg);
node.AppendChild(efaturaFault);
SoapException soapEx = new SoapException("2000:OZET DEGERLERI ESIT DEGIL", SoapException.ClientFaultCode, null, node);
一旦抛出它就会自动变成FaultException,我相信会发生一些事情。
知道我做错了吗?