1

这应该是直截了当的,但是经过大量论坛浏览后,我仍然没有找到解决方案。开始:

我有一个相当简单的接口定义如下:

[ServiceContract(Namespace = "test-contract")]
public interface IDebitor : Source.BaseInterface.IBase
{
    [OperationContract]
    DebitorResult CreateUpdateDebitorPerson(DebitorPerson person)
}

[DataContract(Namespace = "test-person")]
public class DebitorPerson
{
    #region FIELDS

    // Line
    string senderSystemId;
    string firstName;
    string lastName;
    string address1;
    string address2;
    string postalCode;
    string city;
    string areaCode;
    string cprNumber;
    string payingCustomerId;
    string paymentCode;
    string languageCode;

    #endregion

    #region Propperties

    [DataMember(IsRequired = true, Order = 1)]
    public string SenderSystemId
    {
        get { return senderSystemId; }
        set { senderSystemId = value; }
    }


    [DataMember(IsRequired = true)]
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    [DataMember(IsRequired = true)]
    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    [DataMember(IsRequired = true)]
    public string Address1
    {
        get { return address1; }
        set { address1 = value; }
    }

    [DataMember(IsRequired = false)]
    public string Address2
    {
        get { return address2; }
        set { address2 = value; }
    }

    [DataMember(IsRequired = true)]
    public string PostalCode
    {
        get { return postalCode; }
        set { postalCode = value; }
    }

    [DataMember(IsRequired = true)]
    public string City
    {
        get { return city; }
        set { city = value; }
    }

    [DataMember(IsRequired = true)]
    public string AreaCode
    {
        get { return areaCode; }
        set { areaCode = value; }
    }

    [DataMember(IsRequired = true)]
    public string CprNumber
    {
        get { return cprNumber; }
        set { cprNumber = value; }
    }

    [DataMember(IsRequired = false)]
    public string PayingCustomerId
    {
        get { return payingCustomerId; }
        set { payingCustomerId = value; }
    }


    [DataMember(IsRequired = true)]
    public string PaymentCode
    {
        get { return paymentCode; }
        set { paymentCode = value; }
    }

    [DataMember(IsRequired = false)]
    public string LanguageCode
    {
        get { return languageCode; }
        set { languageCode = value; }
    }

    #endregion
}

该服务运行得很好,但相应的soap xml不是我所期望的。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="test-contract" xmlns:test1="test-person">
   <soapenv:Header/>
   <soapenv:Body>
      <test:CreateUpdateDebitorPerson>
         <!--Optional:-->
         <test:person>
            <test1:Address1></test1:Address1>
            <!--Optional:-->
            <test1:Address2></test1:Address2>
            <test1:AreaCode></test1:AreaCode>
            <test1:City></test1:City>
            <test1:CprNumber></test1:CprNumber>
            <test1:FirstName></test1:FirstName>
            <!--Optional:-->
            <test1:LanguageCode></test1:LanguageCode>
            <test1:LastName></test1:LastName>
            <!--Optional:-->
            <test1:PayingCustomerId></test1:PayingCustomerId>
            <test1:PaymentCode></test1:PaymentCode>
            <test1:PostalCode></test1:PostalCode>
            <test1:SenderSystemId></test1:SenderSystemId>
         </test:person>
      </test:CreateUpdateDebitorPerson>
   </soapenv:Body>
</soapenv:Envelope>

为什么元素属于测试合同而不是接口中定义的测试人员?有人可以帮我吗?

4

1 回答 1

1

因为元素本身(“<person>”)是在服务合同级别定义的,而不是在数据合同级别。你要么得到 <test-contract:person> (如果你在服务中使用它)或 <test-person:DebitorPerson> (如果你用 DataContractSerializer 以独立的方式序列化实例)。以某种方式混合两者(例如 <test-person:person>)会不一致 - 为什么命名空间应该来自 DataContract 级别,而名称应该来自 ServiceContract 级别?

于 2012-10-11T21:52:25.740 回答