C# 将值传递给SOAP API复杂类型

C# 将值传递给SOAP API复杂类型,c#,web-services,soap,casting,wsdl,C#,Web Services,Soap,Casting,Wsdl,我使用服务器引用调用SOAP API,有一个复杂类型需要权重值。我正在使用以下代码设置值: parcel objpcl = new parcel(); objpcl.weight = 10; objpcl.length = 10; objpcl.width = 10; objpcl.depth = 10; objpcl.girth = 10; objpcl.combinedDimension = 10; objpcl.volume = 10; objpcl.value = 100; 响应返回并

我使用服务器引用调用SOAP API,有一个复杂类型需要权重值。我正在使用以下代码设置值:

parcel objpcl = new parcel();
objpcl.weight = 10;
objpcl.length = 10;
objpcl.width = 10;
objpcl.depth = 10;
objpcl.girth = 10;
objpcl.combinedDimension = 10;
objpcl.volume = 10;
objpcl.value = 100;
响应返回并显示错误“无效重量”。以下是WSDL的详细信息:

  <xs:complexType name="parcel">
    <xs:sequence>
      <xs:element minOccurs="0" name="weight" type="xs:decimal" />
      <xs:element minOccurs="0" name="length" type="xs:decimal" />
      <xs:element minOccurs="0" name="width" type="xs:decimal" />
      <xs:element minOccurs="0" name="depth" type="xs:decimal" />
      <xs:element minOccurs="0" name="girth" type="xs:decimal" />
      <xs:element minOccurs="0" name="combinedDimension" type="xs:decimal" />
      <xs:element minOccurs="0" name="volume" type="xs:decimal" />
      <xs:element minOccurs="0" name="currency" type="xs:string" />
      <xs:element minOccurs="0" name="value" type="xs:decimal" />
      <xs:element minOccurs="0" name="numberOfParts" type="xs:decimal" />
      <xs:element minOccurs="0" name="numberOfItems" type="xs:decimal" />
      <xs:element minOccurs="0" name="hangingGarment" type="xs:boolean" />
      <xs:element minOccurs="0" name="theftRisk" type="xs:boolean" />
      <xs:element minOccurs="0" name="multipleParts" type="xs:boolean" />
      <xs:element minOccurs="0" name="catalogue" type="xs:boolean" />
      <xs:element minOccurs="0" name="description" type="xs:string" />
      <xs:element minOccurs="0" name="originOfParcel" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
运行Microsoft Service Trace Viewer后,包裹元素似乎没有进入API调用,以下是跟踪查看器日志的一部分副本:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="58ef72b0-fd4d-475f-9347-5f1ba25f5987" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">7f7337fb-8db5-4b84-8e6c-44d7f43d561a</ActivityId>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<validateDeliveryAddress xmlns="http://v2.web.domain.routing.hermes.co.uk/">
<deliveryRoutingRequest>
<clientId xmlns="">aba</clientId>
<clientName xmlns="">aba</clientName>
<userId xmlns="">ababab</userId>
<sourceOfRequest xmlns="">ababab</sourceOfRequest>
<deliveryRoutingRequestEntries xmlns="">
<deliveryRoutingRequestEntry>
<customer>
<address>
<lastName>Robinson</lastName>
<streetName>Eastern Perimeter Road</streetName>
<addressLine1>London Heathrow Airport</addressLine1>
<city>London</city>
<region>Hounslow</region>
<postCode>TW6 2GE</postCode>
<countryCode>GB</countryCode>
</address>
<customerReference1>12345</customerReference1>
</customer>
<parcel></parcel>
<expectedDespatchDate>2015-04-10</expectedDespatchDate>
<countryOfOrigin>US</countryOfOrigin>
</deliveryRoutingRequestEntry>
</deliveryRoutingRequestEntries>
</deliveryRoutingRequest>
</validateDeliveryAddress>
</s:Body>
</s:Envelope>

7f7337fb-8db5-4b84-8e6c-44d7f43d561a
阿巴
阿巴
阿巴巴
阿巴巴
罗宾逊
东面围道
伦敦希思罗机场
伦敦
霍恩斯洛
TW6 2GE
国标
12345
2015-04-10
美国

我觉得这个问题有一个我忽略的简单解决方案。每个十进制字段都有一个相应的字段,以指定的结尾。指定的字段是布尔值,必须将其设置为true才能在序列化过程中发送字段值。还有一些附加的post()定义了更好的实现方法;现在,我手动指定:

    var objpcl = new parcel
    {
        weight = 10, weightSpecified = true,
        length = 10, lengthSpecified = true,
        width = 10, widthSpecified = true,
        depth = 10, depthSpecified = true, 
        girth = 10, girthSpecified = true,
        combinedDimension = 10, combinedDimensionSpecified = true,
        volume = 10, volumeSpecified = true,
        value = 100, valueSpecified = true,
        numberOfParts = 1, numberOfPartsSpecified = true,
        numberOfItems = 10, numberOfItemsSpecified = true,            
        description = "Test Package",
        originOfParcel = "US",
    };
如果我花多一点时间查看WSDL文件,我会注意到以下几点:

    [XmlElement(Form = XmlSchemaForm.Unqualified, Order = 0)]
    public decimal weight { get; set; }
    [XmlIgnore]
    public bool weightSpecified { get; set; }

/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool weightSpecified
{
    get
    {
        return this.weightFieldSpecified;
    }
    set
    {
        this.weightFieldSpecified = value;
        this.RaisePropertyChanged("weightSpecified");
    }
}
[xmlement(Form=XmlSchemaForm.Unqualified,Order=0]
公共十进制权重{get;set;}
[XmlIgnore]
指定的公共bool权重{get;set;}
/// 
[System.Xml.Serialization.XmlIgnoreAttribute()]
指定公共布尔值
{
得到
{
返回指定的此字段;
}
设置
{
此.weightFieldSpecified=值;
此项。提升属性更改(“指定权重”);
}
}

希望这能有所帮助。

您希望得到什么样的回应receive@Coder1409说明是否找到地址的XML响应。此时,我收到一个错误XML响应,声明“无效权重”,尝试发送一个有效权重,就像非空权重一样。可能是服务不接受非空值。我尝试了这两种方法,将所有值设置为10。收到相同的XML错误。SOAPUI调用适用于0或10或任何其他数值。其他信息:我使用了Microsoft Service Trace Viewer,并且在API调用期间似乎未填充地块元素:罗宾逊东部周界路伦敦希思罗机场伦敦霍恩斯洛TW6 2GE GB 12345 2015-04-10 US
    [XmlElement(Form = XmlSchemaForm.Unqualified, Order = 0)]
    public decimal weight { get; set; }
    [XmlIgnore]
    public bool weightSpecified { get; set; }

/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool weightSpecified
{
    get
    {
        return this.weightFieldSpecified;
    }
    set
    {
        this.weightFieldSpecified = value;
        this.RaisePropertyChanged("weightSpecified");
    }
}