【问题标题】:Custom SOAP Fault has wrong namespace http://schemas.datacontract.org/2004/07/自定义 SOAP 错误有错误的命名空间 http://schemas.datacontract.org/2004/07/
【发布时间】:2010-07-14 12:58:19
【问题描述】:

我为肥皂故障定义了一个自定义模式,如下所示: ... ...

我在 VS 2008 中生成了代码:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3053")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault")]
[System.Xml.Serialization.XmlRootAttribute("zsoaFault", Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault", IsNullable=false)]
public partial class ZSOAFault : AbstractFault
{

...

我已经开发了一个自定义的 IErrorHandler(作为框架的一部分提供给所有项目),它会生成这个自定义的 soap 错误,如下所示:

Schemas.ZSOAFault.ZSOAFault zfault = new Schemas.ZSOAFault.ZSOAFault();
zfault.message = "hello";
zfault.operation = "operation";
zfault.serviceContext = "serviceContext";
zfault.serviceEndpoint = "serviceEndpoint";
zfault.timeStamp = DateTime.Now;

FaultException<Schemas.ZSOAFault.ZSOAFault> fe = new FaultException<Schemas.ZSOAFault.ZSOAFault>(zfault);        
MessageFault msgFault = fe.CreateMessageFault();

重要的是,类 Schemas.ZSOAFault.ZSOAFault 是从模式生成的,而不是从也导入相同模式的应用程序 wsdl 生成的。

但是当我查看这个返回的肥皂错误时,我看到了一个不同的命名空间:

     <detail>
        <ZSOAFault xmlns="http://schemas.datacontract.org/2004/07/Schemas.ZSOAFault" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
           <message>hello</message>
           <exception i:nil="true"/>
           <operation>operation</operation>
           <serviceContext>serviceContext</serviceContext>
           <serviceEndpoint>serviceEndpoint</serviceEndpoint>
           <timeStamp>2010-07-14T14:31:58.5437649+02:00</timeStamp>
        </ZSOAFault>
     </detail>

我希望在架构中看到自定义故障定义的命名空间,还是我错了?

谢谢 奥利弗

【问题讨论】:

    标签: wcf soap namespaces fault


    【解决方案1】:

    我似乎记得 WCF 中的自定义错误必须是数据协定,并且从不使用 XmlSerializer,因此您正在使用的那些 Xml 序列化器属性将被忽略。相反,使用 [DataContract] 属性:

    [DataContract(Name="zsoaFault", Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault")]
    public partial class ZSOAFault : AbstractFault {
    ....
    }
    

    【讨论】:

    • 我已将 DataContract 属性添加到 ZSOAFault。现在 zsoaFault 元素的命名空间是正确的,但是消息元素又得到了生成的命名空间(消息是从 AbstractFault 继承的)。我也尝试将 DataContract 属性添加到 AbstractFault,然后不返回任何消息元素。我是否必须删除所有 System.Xml.Serialization 属性?
    • 我找到了问题所在。 AbstractFault 没有将消息成员定义为 [DataMember]。现在可以了。感谢您的帮助。
    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多