微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET WCF Soap 1.1 解析命名空间

如何解决.NET WCF Soap 1.1 解析命名空间

注意:我知道至少有一些其他 StackOverflow 帖子(如 herehere)提出了类似的问题,但没有人得到回答,所以我想我会再试一试:)

我正在尝试基于他们提供给我的客户端 Soap 1.1 wsdl 和 .xsd 架构创建 .NET WCF 服务。他们还提供了一个示例输入(详细信息在我的示例中已更改,但主要问题仍然存在)。

我对 wsdl 和 xsd 文件使用了 svcutil 来构建 MessageContracts,它们大部分都可以工作,但前提是我用给定的命名空间限定了每个元素

在我收到的示例请求中,命名空间仅在请求的根元素中限定。

我尝试使用生成的 [XmlElement] 属性,在 Qualified、Unqualifed 和 None 之间更改 Form,并将 Namespace 更改为“”,以及我能想到的所有其他事情,但我无法管理让 XML 解析器成功解析完整请求,除非我使用 Form=Qualified 并且实际上在每个子元素中都包含命名空间前缀。

问题:是否还有其他属性,或我已有的属性上的其他属性,允许我的客户提供准确的输入?

这里是服务契约声明和消息契约:

[ServiceContract(Name="MyService",Namespace = "http://www.mywebsite.com/webservices/beans")]
[XmlSerializerFormat(Style = OperationFormatStyle.Document,Use = OperationFormatUse.Literal,SupportFaults = true)]
public interface IValidatePasswordService
{
    [OperationContract(Action="http://api.paysimple.com/sso/myRequest",Name="myRequest")]
    [XmlSerializerFormat(Style = OperationFormatStyle.Document,SupportFaults = true)]
    MyResponseMessage MyRequest(MyRequestMessage request);
}


[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel","4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class MyRequestMessage
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.mywebsite.com/webservices/beans",Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("data",Form=System.Xml.Schema.XmlSchemaForm.Qualified,IsNullable=false)]
    public Data[] MyRequest;

    public MyRequestMessage()
    {
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil","4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mywebsite.com/webservices/beans")]
public partial class Data
{

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified,Order=0)]
    public string value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

提供的输入示例如下所示:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
    <bean:MyRequest xmlns:bean="http://www.mywebsite.com/webservices/beans">
        <data><value>data1</value></data>
        <data><value>data2</value></data>
        <data><value>data3</value></data>
    </bean:MyRequest>
</Body>

但是,当我使用该请求时,我得到一个带有空 MyRequest 数组的 MyRequestMessage。 但是如果我给每个子元素添加“bean:”前缀,就像这样:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
    <bean:MyRequest xmlns:bean="http://www.mywebsite.com/webservices/beans">
        <bean:data><bean:value>data1</bean:value></bean:data>
        <bean:data><bean:value>data2</bean:value></bean:data>
        <bean:data><bean:value>data3</bean:value></bean:data>
    </bean:MyRequest>
</Body>

然后我得到所有的输入值。

关于我可以尝试什么的任何想法(除了尝试要求客户改变他们提出请求的方式)?

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。