SoapException详细信息节点未正确显示

时间:2014-08-06 15:50:41

标签: .net wcf soap detail soapexception

编辑:我想我应该解释一下我想要完成的事情。

这是我需要遵守的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,我相信会发生一些事情。

知道我做错了吗?

0 个答案:

没有答案